STC89C52驱动SH1106芯片点亮OLED问题点总结

发布者:BlossomBeauty最新更新时间:2022-11-04 来源: csdn关键字:STC89C52  驱动 手机看文章 扫描二维码
随时随地手机看文章

主芯片:STC89C52


OLED驱动芯片:SH1106

OLED屏大小为1.3寸,像素点是128X64(8页X8),通信方式有IIC和SPI两种方式。


烧录软件:STC-ISP

在这里插入图片描述

文字图片取模软件:PCtoLCD2002

在这里插入图片描述

选择阳码:屏黑字白(使用这个)

选择阴码:屏白字黑

阳码亮点为0,阴码亮点为1,代码中0XFF为白,0x00为黑。


一个简单的延时毫秒代码:


void delay_ms(unsigned int ms)

{                         

unsigned int a;

while(ms)

{

a=100;

while(a--);

ms--;

}

return;

}


下边简单介绍利用SPI通信点亮OLED:


//引脚定义

sbit OLED_SCL=P1^7;//SCL

sbit OLED_SDA=P1^6;//MOSI

sbit OLED_RES =P1^5;//RES

sbit OLED_DC =P1^4;//DC

sbit OLED_CS=P1^3; //CS


#define OLED_CMD  0 //写命令

#define OLED_DATA 1 //写数据


//MCU写一个字节的数据

void OLED_WR_Byte(u8 dat,u8 cmd)

{

u8 i;   

if(cmd)

  OLED_DC=1;

else 

  OLED_DC=0;   

  OLED_CS=0;

for(i=0;i<8;i++)

{   

OLED_SCL=0;

if(dat&0x80)

{

OLED_SDA=1;

}

else

{

OLED_SDA=0;

}

    OLED_SCL=1;

dat<<=1;   

}   

OLED_CS=1;

OLED_DC=1;   

}   

//坐标设置

void OLED_Set_Pos(u8 x, u8 y) 

x+=2;

OLED_WR_Byte(0xb0+y,OLED_CMD);

OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);

OLED_WR_Byte((x&0x0f),OLED_CMD);

//开启OLED显示    

void OLED_Display_On(void)

{

OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令

OLED_WR_Byte(0X14,OLED_CMD);  //DCDC ON

OLED_WR_Byte(0XAF,OLED_CMD);  //DISPLAY ON

}

//关闭OLED显示     

void OLED_Display_Off(void)

{

OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令

OLED_WR_Byte(0X10,OLED_CMD);  //DCDC OFF

OLED_WR_Byte(0XAE,OLED_CMD);  //DISPLAY OFF

}      

//清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!   

void OLED_Clear(void)  

{  

u8 i,n;     

for(i=0;i<8;i++)  

{  

OLED_WR_Byte (0xb0+i,OLED_CMD);    //设置页地址(0~7)

OLED_WR_Byte (0x02,OLED_CMD);      //设置显示位置—列低地址

OLED_WR_Byte (0x10,OLED_CMD);      //设置显示位置—列高地址   

for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA); 

} //更新显示

}


//显示汉字 

void OLED_ShowChinese(u8 x,u8 y,u8 no,u8 sizey)

{

u16 i,size1=(sizey/8+((sizey%8)?1:0))*sizey;

for(i=0;i {

if(i%sizey==0) OLED_Set_Pos(x,y++);

if(sizey==16) OLED_WR_Byte(MP3_16X16[no][i],OLED_DATA);//16x16字号,用取模取16x16的汉子存在二维数组MP3_16X16中

else if(sizey==12) OLED_WR_Byte(MP3_12X12[no][i],OLED_DATA);//12x12字号,用取模取12x12的汉子存在二维数组MP3_12X12中

else return;

}

}



//显示图片

//x,y显示坐标

//sizex,sizey,图片长宽

//BMP:要显示的图片

void OLED_DrawBMP(u8 x,u8 y,u8 sizex, u8 sizey,u8 BMP[])

{

  u16 j=0;

u8 i,m;

sizey=sizey/8+((sizey%8)?1:0);

for(i=0;i {

OLED_Set_Pos(x,i+y);

    for(m=0;m {      

OLED_WR_Byte(BMP[j++],OLED_DATA);    

}

}

}


//屏初始化

void OLED_Init(void)

{

OLED_RES_Clr();

    delay_ms(200);

OLED_RES_Set();

OLED_WR_Byte(0xAE,OLED_CMD); /*display off*/ 

OLED_WR_Byte(0x02,OLED_CMD); /*set lower column address*/ 

OLED_WR_Byte(0x10,OLED_CMD); /*set higher column address*/ 

OLED_WR_Byte(0x40,OLED_CMD); /*set display start line*/ 

OLED_WR_Byte(0xB0,OLED_CMD); /*set page address*/

OLED_WR_Byte(0x81,OLED_CMD); /*contract control*/ 

OLED_WR_Byte(0xcf,OLED_CMD); /*128*/ 

OLED_WR_Byte(0xA1,OLED_CMD); /*set segment remap*/ 

OLED_WR_Byte(0xA6,OLED_CMD); /*normal / reverse*/ 

OLED_WR_Byte(0xA8,OLED_CMD); /*multiplex ratio*/ 

OLED_WR_Byte(0x3F,OLED_CMD); /*duty = 1/64*/ 

OLED_WR_Byte(0xad,OLED_CMD); /*set charge pump enable*/ 

OLED_WR_Byte(0x8b,OLED_CMD); /* 0x8B 内供 VCC */ 

OLED_WR_Byte(0x33,OLED_CMD); /*0X30---0X33 set VPP 9V */ 

OLED_WR_Byte(0xC8,OLED_CMD); /*Com scan direction*/ 

OLED_WR_Byte(0xD3,OLED_CMD); /*set display offset*/ 

OLED_WR_Byte(0x00,OLED_CMD); /* 0x20 */ 

OLED_WR_Byte(0xD5,OLED_CMD); /*set osc division*/ 

OLED_WR_Byte(0x80,OLED_CMD); 

OLED_WR_Byte(0xD9,OLED_CMD); /*set pre-charge period*/ 

OLED_WR_Byte(0x1f,OLED_CMD); /*0x22*/ 

OLED_WR_Byte(0xDA,OLED_CMD); /*set COM pins*/ 

OLED_WR_Byte(0x12,OLED_CMD); 

OLED_WR_Byte(0xdb,OLED_CMD); /*set vcomh*/ 

OLED_WR_Byte(0x40,OLED_CMD);

OLED_Clear();

OLED_WR_Byte(0xAF,OLED_CMD); /*display ON*/

}


//主函数

void main()

{

OLED_Init();//初始化OLED

while(1)

{

OLED_ShowChinese(0,0,0,16);//在坐标0,0显示二维数组MP3_16X16中的第一个元素。大小为16

delay_ms(2000);//延时2S

OLED_DrawBMP(0,0,128,64,BMP);//全屏显示BMP这张图片

delay_ms(2000);

}

}

关键字:STC89C52  驱动 引用地址:STC89C52驱动SH1106芯片点亮OLED问题点总结

上一篇:51单片机-STC89C52系列学习第三篇之中断学习
下一篇:51单片机-STC89C52系列学习第二篇之寄存器学习

推荐阅读最新更新时间:2024-11-17 08:31

基于DC/DC变换器的LED驱动电路的设计
  1 引 言   LED以其功耗低、发光效率高、使用寿命长等优点,在照明、背光等领域取得了越来越广泛的应用。LED的亮度与工作电流成正比,为了维持亮度的稳定,需要一个稳定的恒流电源为其供电。在电源管理方面,DC/DC变换器具有体积小、功耗低、效率高、使用方便等优点,因此应用十分广泛。基于DC/DC升压变换器的LED驱动电路也成为一种比较经典的LED驱动方式。DC/DC变换器有多种控制方式,其中峰值电流模式由于具有较快的响应速度等优点,在工业界获得广泛的应用。但是,当占空比大于50%时,电路容易发生次谐波振荡,需要引入斜坡补偿电路进行消除。   本文第2节介绍电路的具体实现方式,第3节给出电路的仿真波形,第4节对全文进行总结。  
[电源管理]
基于DC/DC变换器的LED<font color='red'>驱动</font>电路的设计
基于32位RISC处理器SoC平台的Linux操作系统实现
引言 智原科技的FIE8100 SoC平台是一种低功耗、便携式视频相关应用开发SoC平台,也可用于基于FA526 CPU的SoC设计验证。 基于FA526的Linux软件开发套件,开发人员可将Linux一2.4.19软件环境在FIE8100平台上安装实现,并完成对平台上所有IP的驱动程序安装和对FA526的内部调试。 FA526介绍 FA526是一颗有着广泛用途的32位RISC处理器。它包括一个同步CPU内核(core)、独立的指令/数据缓存(cache)、独立的指令/数据暂存器(scratchpads)、一个写缓存(write buffer)、一个内存管理单元(memory management unit)和JTAG在线仿真(
[工业控制]
MSP432P401r驱动SD卡
废话不多说,直接上移植好的代码 #include SPI.h #include SD.h #define SS 18 #define MOSI 15; #define MISO 14; #define SCK 7 File myFile; void setup() { // Open serial communications and wait for port to open: Serial.begin(9600); while (!Serial) { // wait for serial port to connect. Needed for native USB port only } Seri
[单片机]
电动汽车电机驱动系统的组成和作用
1.电机驱动系统的作用与组成 电动汽车电机驱动系统是新能源汽车的核心技术之一,它的主要任务是按驾驶员的驾驶意图,将动力电池的化学能高效地转化为机械能,经过变速器、驱动轴等机构驱动车轮。电动机驱动系统主要有电动机、功率器件和控制系统组成。
[嵌入式]
电动汽车电机<font color='red'>驱动</font>系统的组成和作用
WS2812灯珠(二)-- STM32 SPI+DMA方式驱动
通过硬件SPI的可以很巧妙的模拟出WS2812的通信时序,用spi的8位数据模拟ws281x的一位数据。 要将系统时钟设置为56M,SPI分频数设置为8,则SPI的通信频率为7M,1s/7M≈143ns 即传输一位数据的时间约为143纳秒(ns) 3*143 = 429ns 5*143 = 715ns 符合WS281X芯片的通信时序。 11111000 high level (十六进制:0XF8)表示WS281X的1码 11100000 low level (十六进制:0XE0)表示WS281X的0码 程序头文件部分: 通过宏的方式定义了灯珠个数和WS281X的0码和1码。 #ifndef __WS2812_
[单片机]
手机将启拉货潮:刘海屏玻璃、被动器件、驱动IC最短缺
  中国五大手机品牌将结束长达3个季度的库存调整黑暗期,年后零组件厂传出新机种即将启动拉货潮,预计3月将涌现第一波零件拉货高峰。 业界点名,被动组件、驱动IC以及Notch(雷射弧形槽)异形切割玻璃,为3大供需吃紧的零组件,被动组件甚至缺到年底。下面就随手机便携小编一起来了解一下相关内容吧。   大陆手机去年销售疲弱,自去年第3季启动库存调整,至今已连续调整3个季度;然而在五大品牌即将推出新机型下,业界传出,从1月开始上游零组件已经涌现拉货潮。 由于中国农历新年假期至21日截止,业界估计,3月将涌现第一波零件拉货潮。   手机零件厂表示,从目前拉货状况来看,以驱动IC、被动组件、Notch玻璃(就是被市场戏称的苹果浏海屏)为三大最
[手机便携]
基于常见DCDC芯片的LED恒流驱动电路设计
其实每款DC/DC的IC(无论升压或降压)都能接成恒流的LED的驱动,现在分别以KZW3688和CE9908为例介绍一下接法及特点。   1、KZW3688降压IC,其接法如下:      原理非常简单,大家一看便知这里不再赘述;其中R1的值的算法是3.3V/所需电流.上图中接的是2-5只,也可以多路并联使用,并且这里有个问题问大家:C2是否需要呢?看一下下图中的接法:   去掉了C2,并联了一路甚至几路LED串,感到效果如何?有兴趣回答吗?      适合这种接法的电路太多了,除3688外,还有PT1102、1101、lm2596、 GA8512、1016、1014、313、1011等任何的降压IC都能接
[电源管理]
基于常见DCDC<font color='red'>芯片</font>的LED恒流<font color='red'>驱动</font>电路设计
linux驱动之内核定时器驱动设计
我的环境: Fedora 14 内核版本为2.6.38.1 开发板:ARM9 TQ2440 移植内核版本:linux-2.6.30.4 定时器在linux内核中主要是采用一个结构体实现的。但是需要注意定时器是一个只运行一次的对象,也就是当一个定时器结束以后,还需要重现添加定时器。但是可以采用mod_timer()函数动态的改变定时器到达时间。 这个驱动主要实现内核定时器的基本操作。内核定时器主要是是通过下面的结构体struct timer_list实现。需要的头文件包括#include linux/timer.h ,但是在实际开发过程中不需要包含该头文件,因为在sched.h中包含了该头文件。 struct timer
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved