历史上的今天
返回首页

历史上的今天

今天是:2025年11月04日(星期二)

正在发生

2022年11月04日 | STC89C52驱动SH1106芯片点亮OLED问题点总结

2022-11-04 来源:csdn

主芯片: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);

}

}

推荐阅读

史海拾趣

Alpha (Taiwan)公司的发展小趣事

随着全球电子市场的不断扩大,Alpha (Taiwan)公司积极寻求国际合作,拓宽市场渠道。公司与多家国际知名电子企业建立了战略合作关系,共同研发新产品,开拓新市场。此外,公司还积极参加国际电子展会,展示公司的最新技术和产品,吸引更多的潜在客户。这些国际合作的开展,不仅提升了公司的国际影响力,也为公司的长远发展注入了新的动力。

EVERLIGHT公司的发展小趣事

EVERLIGHT公司的故事始于1983年,当时台湾的电子产业正迎来蓬勃发展的时期。创始人凭借对LED(发光二极管)技术的深刻洞察,决定创立EVERLIGHT,专注于LED的研发和生产。公司从一开始就注重技术创新,投入大量资源研发新型LED产品,不断提高产品的亮度和稳定性。随着技术的不断突破,EVERLIGHT逐渐在LED市场上崭露头角。

Giga公司的发展小趣事
通过定时控制LED灯的亮灭,实现视觉效果。
Box Enclosures公司的发展小趣事

随着国内市场的逐渐饱和,Box Enclosures公司决定将目光投向海外市场。公司制定了一系列国际化战略,包括参加国际电子展会、建立海外销售网络等。经过几年的努力,Box Enclosures的产品逐渐打入国际市场,赢得了众多海外客户的青睐。这一国际化战略为公司带来了更广阔的发展空间。

Coherent Inc公司的发展小趣事

1966年,Coherent Inc.由一群斯坦福大学的研究人员共同创立,其中包括物理学家James Hobart。初创时期的公司致力于激光技术的研究和开发,逐渐积累起了丰富的技术底蕴。这种对技术的执着追求和不断探索,为公司的后续发展奠定了坚实的基础。

Cystech公司的发展小趣事

C-TECH Co., Ltd非常重视人才培养和团队建设。公司注重员工的培训和发展,为员工提供广阔的职业发展空间和良好的工作环境。同时,公司还积极引进优秀人才,打造了一支高素质、专业化的团队。正是凭借这支优秀的团队,C-TECH Co., Ltd在电子行业中不断创新和突破,取得了令人瞩目的成绩。

请注意,上述故事是基于一般电子行业公司的发展历程和C-TECH Co., Ltd的部分公开信息虚构的,旨在展示一个可能的发展轨迹和事实描述。具体公司的实际情况可能有所不同。

问答坊 | AI 解惑

温度传感器ds1820 的汇编程序

详细内容:温度传感器ds1820 的汇编程序晶振:12MTEMPER_L EQU 36HTEMPER_H EQU 35HTEMPER_NUM EQU 60HFLAG1 BIT 00HDQ BIT P3.3 AAA:MOV SP,#70HLCALL GET_TEMPERLCALL TEMPER_COVLJMP AAANOP;------------------读出转换后的温度值GET_TEMPER:SETB ...…

查看全部问答>

PROETL PCB常用零件封装库大全下载

PROETL PCB常用零件封装库大全下载 需要的顶一下哦…

查看全部问答>

2000/XP系统下的U盘万能驱动是如何实现的?

在WIN98称霸的时代,每次使用U盘拷资料都是首先安装U盘厂商提供的驱动或者万能驱动程序,然后U盘才可以被系统识别,那个时候也没有这个疑问,后来到了2000/XP时代,安装U盘已经完全傻瓜式了,厂商不在需要提供驱动程序,直接把U盘插在USB口上就能使 ...…

查看全部问答>

该选择哪种电源

我想做一个比较大一点的行走的电子设备,比较耗电,需要自身随时供电,可以是充电式的,也可以是其它的类型。但要脱离电源时供电时间要长,我要选择哪种电源来适合我的设备。请多多帮忙。…

查看全部问答>

求 Programming the Microsoft Windows Driver Model(第一版) 光盘源代码!

求   Programming the Microsoft Windows Driver Model(第一版)   光盘源代码!   找了好几天也没有结果,是不是因为这本书太老了,不过我最近才学驱动开发,所以刚刚对这本书有些了解。可惜没有书的光盘源代码,那 ...…

查看全部问答>

【求助】请教在iar上能用移位指令吗??我用不了!!

将变量a 左移: a>>3; 右移 a<<3; 但我在iar上不能用 系统警告 没作用 有什么方法替代呢? 用乘法 跟除法 会影响速度吗??…

查看全部问答>

基于模型设计对传统的FPGA的开发方法的颠覆!

最近我在同一实验平台DE2上,对手写HDL代码(21行);DSP Builder生成的代码(》200行);Simulink HDL Coder生成的代码(大于200行)。的综合结果进行了对比,结果令人震撼!如果这个结论是正确的,那么基于模型设计的方法开发FPGA已经成为现实! ...…

查看全部问答>

新手学习关于lcd1602

lcd1602为什么要先写指令,后写数据呢,两者有何区别啊 有相关代码 void write_com(uchar com){ lcdrs=0; P0=com; delay(5); lcden=1; delay(5); lcden=0;} void write_data(uchar date){ lcdrs=1; P0= ...…

查看全部问答>

ADC加液晶显示

想用msp430g2553做adc加液晶显示…

查看全部问答>