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); } }
上一篇:51单片机-STC89C52系列学习第三篇之中断学习
下一篇:51单片机-STC89C52系列学习第二篇之寄存器学习
推荐阅读最新更新时间:2024-11-06 14:44
设计资源 培训 开发板 精华推荐
- 使用 ON Semiconductor 的 LA5616 的参考设计
- 基于鸿蒙Hi3861物联网智能wifi开关+851961A
- C3019170_MCP4822两通道DCA芯片方案验证板
- LT3007ITS8-1.8 用于保活电源的低压差线性稳压器的典型应用电路
- LT1172IN8、12V/1.25A 负至正降压-升压转换器的典型应用
- 使用 Analog Devices 的 LTC1258CS8-5 的参考设计
- DC2026B,Linduino 一款隔离式 Arduino 兼容演示板
- 2015-滤波
- M52259DEMOKIT: 面向MCF5225x的低成本演示板套件
- AM1/4S-1209SZ 9V 0.25 瓦 DC/DC 转换器的典型应用