历史上的今天
今天是: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); } }
史海拾趣
|
详细内容:温度传感器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 ...… 查看全部问答> |
|
在WIN98称霸的时代,每次使用U盘拷资料都是首先安装U盘厂商提供的驱动或者万能驱动程序,然后U盘才可以被系统识别,那个时候也没有这个疑问,后来到了2000/XP时代,安装U盘已经完全傻瓜式了,厂商不在需要提供驱动程序,直接把U盘插在USB口上就能使 ...… 查看全部问答> |
|
求 Programming the Microsoft Windows Driver Model(第一版) 光盘源代码! 求 Programming the Microsoft Windows Driver Model(第一版) 光盘源代码! 找了好几天也没有结果,是不是因为这本书太老了,不过我最近才学驱动开发,所以刚刚对这本书有些了解。可惜没有书的光盘源代码,那 ...… 查看全部问答> |
|
将变量a 左移: a>>3; 右移 a<<3; 但我在iar上不能用 系统警告 没作用 有什么方法替代呢? 用乘法 跟除法 会影响速度吗??… 查看全部问答> |
|
最近我在同一实验平台DE2上,对手写HDL代码(21行);DSP Builder生成的代码(》200行);Simulink HDL Coder生成的代码(大于200行)。的综合结果进行了对比,结果令人震撼!如果这个结论是正确的,那么基于模型设计的方法开发FPGA已经成为现实! ...… 查看全部问答> |
|
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= ...… 查看全部问答> |




