视频讲解
简介
OLED 屏幕作为一种新型的显示技术,其自身可以发光,亮度,对比度高,功耗低,在当下备受追捧。而在我们正常的显示调整参数过程中,我们越来越多的使用这种屏幕。我们使用的一般是分辨率为 128x64 ,屏幕尺寸为 0.96 寸。由于其较小的尺寸和比较高的分辨率,让它有着很好的显示效果和便携性。
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单片机程序分析 - 电子校园网
软件流程图
以显示一个字符为例
程序分析
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