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

主芯片: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<size1;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<sizey;i++)
	{
		OLED_Set_Pos(x,i+y);
    for(m=0;m<sizex;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);
	}
}
  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值