【OLED12864】0.96寸液晶显示屏-51单片机程序分析

视频讲解

 

简介

OLED 屏幕作为一种新型的显示技术,其自身可以发光,亮度,对比度高,功耗低,在当下备受追捧。而在我们正常的显示调整参数过程中,我们越来越多的使用这种屏幕。我们使用的一般是分辨率为 128x64 ,屏幕尺寸为 0.96 寸。由于其较小的尺寸和比较高的分辨率,让它有着很好的显示效果和便携性。

【OLED12864】0.96寸液晶显示屏-51单片机程序分析

OLED,即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(Organic Electroluminesence Display, OELD)。OLED由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。

OLED显示技术具有自发光的特性,采用非常薄的有机材料涂层和玻璃基板,当有电流通过时,这些有机材料就会发光,而且OLED显示屏幕可视角度大,并且能够节省电能,从2003年开始这种显示设备在MP3播放器上得到了应用。

市面上常用的0,96寸显示屏分为使用两种通信协议的,分别是IIC通信与SPI通信,我们使用的是IIC通信协议的显示屏,这种显示屏又分为单色显示与双色显示,我们使用的是单色显示,实际上区别不大,双色显示仅仅是第一行的显示颜色不同于其他行。

显示屏内部采用的是SSD1306驱动芯片,用来驱动屏幕上128*64个像素点的显示。我们要做的就是通过IIC通信协议,将需要显示的图像数据发送给SSD1306,然后由SSD1306驱动屏幕面板进行显示,其中我们只需要完成IIC通信部分即可,驱动面板显示由SSD1306完成。

 

ADC采集模块采用的是IIC的通信方式,因此只需要掌握IIC的通信协议即可轻松的使用ADC采集模块,具体的IIC讲解请看【IIC】IIC通信协议-51单片机程序分析 - 电子校园网

软件流程图

以显示一个字符为例

【OLED12864】0.96寸液晶显示屏-51单片机程序分析

程序分析

OLED_NEW.C

#include "OLED_NEW.H"
#include "OLED_TAB.H"

void ys(uint i)
{
   while(i--);
}

void IIC_Start()
{
   scl = 1;
   sda = 1;
   sda = 0;
   scl = 0;

}

/**********************************************
//IIC Stop
**********************************************/
void IIC_Stop()
{
   sda = 0;
   scl = 1;
   sda = 1;
}
/**********************************************
// IIC Write byte
**********************************************/
bit Write_IIC_Byte(unsigned char IIC_Byte)
{
	unsigned char i;
	bit Ack_Bit;                    //应答信号
	for(i=0;i<8;i++)		
	{
		if(IIC_Byte & 0x80)		//1?0?
		sda=1;
		else
		sda=0;
		scl=1;
		scl=0;
		IIC_Byte<<=1;			//loop
	}
	 sda = 1;		                //释放IIC SDA总线为主器件接收从器件产生应答信号	
	scl = 1;                     //第9个时钟周期
	Ack_Bit = sda;		            //读取应答信号
	scl = 0;
	return Ack_Bit;	
}
void write_iic_com(unsigned char IIC_Command)
{
   IIC_Start();
   Write_IIC_Byte(0x78);            //Slave addre.ss,SA0=0
   Write_IIC_Byte(0x00);			//write command
   Write_IIC_Byte(IIC_Command); 
   IIC_Stop();
}

void write_iic_dat(unsigned char IIC_Data)
{
   IIC_Start();
   Write_IIC_Byte(0x78);			
   Write_IIC_Byte(0x40);			//write data
   Write_IIC_Byte(IIC_Data);
   IIC_Stop(); 
}

void OLED_Set_Pos(unsigned char x, unsigned char y) 
{
	write_iic_com(0xb0+y);						//设置页地址
	write_iic_com(x & 0x0f);					//设置X高四位
	write_iic_com((x >> 4) | 0x10);		//设置X第四位
}

void OLED_Clear(void)  
{  
	unsigned char i,n;		    
	for(i=0;i<8;i++)  
	{  
		write_iic_com (0xb0+i);	//设置页地址
		write_iic_com (0x00);		//设置X高四位
		write_iic_com (0x10);   //设置X第四位
		for(n=0;n<128;n++)write_iic_dat(0);
	}
}
void fill_picture(unsigned char fill_Data)
{
	unsigned char m,n;
	for(m=0;m<8;m++)
	{
		write_iic_com(0xb0+m);		//page0-page1
		write_iic_com(0x00);		//low column start address
		write_iic_com(0x10);		//high column start address
		for(n=0;n<128;n++)
			{
				write_iic_dat(fill_Data);
				ys(11110);
			}
	}
}

//OLED初始化
void OLED_Init(void) 
{
	write_iic_com(0xAE);   //display off								//显示关(睡眠模式)
	write_iic_com(0x20);	//Set Memory Addressing Mode	
	write_iic_com(0x10);	//00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
	write_iic_com(0xb0);	//Set Page Start Address for Page Addressing Mode,0-7
	write_iic_com(0xc8);	//Set COM Output Scan Direction
	write_iic_com(0x02);//---set low column address
	write_iic_com(0x10);//---set high column address
	write_iic_com(0x40);//--set start line address
	write_iic_com(0x81);//--set contrast control register
	write_iic_com(0x7f);
	write_iic_com(0xa1);//--set segment re-map 0 to 127
	write_iic_com(0xa6);//--set normal display
	write_iic_com(0xa8);//--set multiplex ratio(1 to 64)
	write_iic_com(0x3F);//
	write_iic_com(0xa4);//0xa4,Output follows RAM content;0xa5,Output ignores RAM content
	write_iic_com(0xd3);//-set display offset
	write_iic_com(0x00);//-not offset
	write_iic_com(0xd5);//--set display clock divide ratio/oscillator frequency
	write_iic_com(0xf0);//--set divide ratio
	write_iic_com(0xd9);//--set pre-charge period
	write_iic_com(0x22); //Set Page Address
	write_iic_com(0xda);//--set com pins hardware configuration
	write_iic_com(0x12);
	write_iic_com(0xdb);//--set vcomh
	write_iic_com(0x20);//0x20,0.77xVcc
	write_iic_com(0x8d);//--set DC-DC enable
	write_iic_com(0x14);//
	write_iic_com(0xaf);//--turn on oled panel 	
} 

//清半屏
//输入0:清上半屏
//输入1:清下半屏
void OLED_Clear2(uchar no)  
{  
	unsigned char i,n;		    
	for(i=0;i<4;i++)  
	{  
		if(no == 0)
			write_iic_com (0xb0+i);
		else
			write_iic_com (0xb4+i);
		write_iic_com (0x00);    
		write_iic_com (0x10);       
		for(n=0;n<128;n++)write_iic_dat(0); 
	} 
} 
void OLED_ShowChar(unsigned char x,unsigned char y,unsigned int chr)
{      	
	unsigned int c=0,i=0;	
	c=chr-' ';			
		OLED_Set_Pos(x,y);	
		for(i=0;i<8;i++)
		write_iic_dat(F8X16[c*16+i]);
		OLED_Set_Pos(x,y+1);
		for(i=0;i<8;i++)
		write_iic_dat(F8X16[c*16+i+8]);
}
void OLED_ShowString(unsigned char x,unsigned char y,unsigned char *chr)
{
	unsigned int j=0;
	while (chr[j]!='\0')
	{		
		OLED_ShowChar(x,y,chr[j]);
		x+=8;
		if(x>120){x=0;y+=2;}
		j++;
	}
}
void OLED_ShowCHinese(unsigned char x,unsigned char y,unsigned char *p)
{      			    
	unsigned char t,wordNum;
	while(*p != '\0')
	{
		for(wordNum=0;wordNum<20;wordNum++)
		{
			if(Hzk[wordNum].Char[0]== *p && Hzk[wordNum].Char[1]== *(p+1))
			{
				OLED_Set_Pos(x,y);		for(t=0;t<16;t++){write_iic_dat(Hzk[wordNum].Hex[t]);}
				OLED_Set_Pos(x,y+1);	for(t=0;t<16;t++){write_iic_dat(Hzk[wordNum].Hex[t+16]);}					
				break;
			}
		}
		p += 2;
		x+=16;
	}
}

unsigned int oled_pow(unsigned char m,unsigned char n)
{
	unsigned int result=1;	 
	while(n--)result*=m;    
	return result;
}

void OLED_ShowNum(unsigned char x,unsigned char y,unsigned int num,unsigned char len)
{         	
	unsigned char t,temp;
	unsigned char enshow=0;						   
	for(t=0;t<len;t++)
	{
		temp=(num/oled_pow(10,len-t-1))%10;
		if(enshow==0&&t<(len-1))
		{
			if(temp==0)
			{
				OLED_ShowChar(x+8*t,y,'0');
				continue;
			}else enshow=1; 
		 	 
		}
	 	OLED_ShowChar(x+8*t,y,temp+'0'); 
	}
} 

void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char *p)
{ 	
 	unsigned int j=0;
 	unsigned char x,y;
 	if(y1%8==0) y=y1/8;      
 	else y=y1/8+1;
	for(y=y0;y<y1;y++)
	{
		OLED_Set_Pos(x0,y);
   	 	for(x=x0;x<x1;x++)
	    {      
	    	write_iic_dat(*p++);	    	
	    }
	}
}
void point(uchar x,uchar y)
{
  uchar y1,y2;
   y1=y/8;
   y2=y%8;
	 OLED_Set_Pos(x+2,y1);
	 write_iic_dat(0x01<<y2);
}

OLED_NEW.H

#ifndef __OLED_NEW_H__
#define __OLED_NEW_H__

#include "main.h"

sbit sda=P2^7;
sbit scl=P2^6;

void OLED_Clear(void);																//清全屏
void OLED_Set_Pos(unsigned char x, unsigned char y); 	//设置光标位置
void OLED_Init(void); 																//OLED初始化
void OLED_Clear2(uchar no);														//清半屏
void OLED_ShowChar(unsigned char x,unsigned char y,unsigned int chr);					//显示一个字符
void OLED_ShowString(unsigned char x,unsigned char y,unsigned char *chr);			//显示字符串
void OLED_ShowCHinese(unsigned char x,unsigned char y,unsigned char *P);			//显示中文字
void OLED_ShowNum(unsigned char x,unsigned char y,unsigned int num,unsigned char len);
void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char *p);	//显示自定义大小图片
void fill_picture(unsigned char fill_Data);						//显示全屏图片
void write_iic_dat(unsigned char IIC_Data);						//写数据
void write_iic_com(unsigned char IIC_Command);				//写命令
void point(uchar x,uchar y);													//画点

#endif

数据手册

1733987022-驱动芯片SSD1306数据手册

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索