OLED屏是一种基于有机发光二极管(Organic Light-Emitting Diode)的显示器件,由于它具备自发光,无需背光、对比度高、厚度薄、视角广、反应速度快等优异特性,故被认为是下一代的平面显示器的新兴应用技术。 该OLED屏有单色和双色两种类型可选,其中单色为纯蓝色,而双色则为黄蓝两种颜色。在尺寸上,其显示尺寸为0.96寸,分辨率为128*64。 在接口方式方面,它有两种接口方式,即SPI接口方式和IIC接口方式。为了节省GPIO口的占用,本人选择的是IIC接口方式。在电源方面,该显示器件是直接使用3.3V工作电压。 为实现显示功能,该OLED屏与KL26Z开发板的连接方式如图1所示,其中SCL和SDA引脚分布与PB2和PB3相连。 图1 OLED屏连接方式
为使OLED屏能正常工作,输出高低电平的定义语句如下: #define OLED_SCLK_Clr() FGPIOB_PCOR |= 1<<2 #define OLED_SCLK_Set() FGPIOB_PSOR |= 1<<2 #define OLED_SDIN_Clr() FGPIOB_PCOR |= 1<<3 #define OLED_SDIN_Set() FGPIOB_PSOR |= 1<<3 相应的初始化函数为: - void OLED_Init(void)
- {
- SIM_SCGC5 |= SIM_SCGC5_PORTB_MASK;
- PORTB_PCR2 |= PORT_PCR_MUX(1);
- PORTB_PCR3 |= PORT_PCR_MUX(1);
- GPIOB_PDDR |= 1<<2;
- GPIOB_PDDR |= 1<<3;
- delay_ms(800);
- OLED_WR_Byte(0xAE,OLED_CMD);//--display off
- OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
- OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
- OLED_WR_Byte(0x40,OLED_CMD);//--set start line address
- OLED_WR_Byte(0xB0,OLED_CMD);//--set page address
- OLED_WR_Byte(0x81,OLED_CMD); // contract control
- OLED_WR_Byte(0xFF,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);//--set multiplex ratio(1 to 64)
- OLED_WR_Byte(0x3F,OLED_CMD);//--1/32 duty
- OLED_WR_Byte(0xC8,OLED_CMD);//Com scan direction
- OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset
- OLED_WR_Byte(0x00,OLED_CMD);//
- OLED_WR_Byte(0xD5,OLED_CMD);//set osc division
- OLED_WR_Byte(0x80,OLED_CMD);//
- OLED_WR_Byte(0xD8,OLED_CMD);//set area color mode off
- OLED_WR_Byte(0x05,OLED_CMD);//
- OLED_WR_Byte(0xD9,OLED_CMD);//Set Pre-Charge Period
- OLED_WR_Byte(0xF1,OLED_CMD);//
- OLED_WR_Byte(0xDA,OLED_CMD);//set com pin configuartion
- OLED_WR_Byte(0x12,OLED_CMD);//
- OLED_WR_Byte(0xDB,OLED_CMD);//set Vcomh
- OLED_WR_Byte(0x30,OLED_CMD);//
- OLED_WR_Byte(0x8D,OLED_CMD);//set charge pump enable
- OLED_WR_Byte(0x14,OLED_CMD);//
- OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel
- }
复制代码此外,所涉及的函数有: void IIC_Start(void); // 启动函数 void IIC_Stop(void); // 停止函数 void Write_IIC_Command(unsigned char IIC_Command); // 指令发送函数 void Write_IIC_Data(unsigned char IIC_Data); // 数据发送函数 void Write_IIC_Byte(unsigned char IIC_Byte); // 字节发送函数 void IIC_Wait_Ack(void); // 等待应答函数 相应的内容如下: - void IIC_Start(void)
- {
- OLED_SCLK_Set();
- OLED_SDIN_Set();
- OLED_SDIN_Clr();
- OLED_SCLK_Clr();
- }
- void IIC_Stop(void)
- {
- OLED_SCLK_Set() ;
- OLED_SDIN_Clr();
- OLED_SDIN_Set();
- }
- void IIC_Wait_Ack(void)
- {
- OLED_SCLK_Set() ;
- OLED_SCLK_Clr();
- }
- void Write_IIC_Byte(unsigned char IIC_Byte)
- {
- unsigned char i;
- unsigned char m,da;
- da=IIC_Byte;
- OLED_SCLK_Clr();
- for(i=0;i<8;i++)
- {
- m=da;
- m=m&0x80;
- if(m==0x80)
- {OLED_SDIN_Set();}
- else OLED_SDIN_Clr();
- da=da<<1;
- OLED_SCLK_Set();
- OLED_SCLK_Clr();
- }
- }
- void Write_IIC_Command(unsigned char IIC_Command)
- {
- IIC_Start();
- Write_IIC_Byte(0x78); //Slave address,SA0=0
- IIC_Wait_Ack();
- Write_IIC_Byte(0x00); //write command
- IIC_Wait_Ack();
- Write_IIC_Byte(IIC_Command);
- IIC_Wait_Ack();
- IIC_Stop();
- }
- void Write_IIC_Data(unsigned char IIC_Data)
- {
- IIC_Start();
- Write_IIC_Byte(0x78); //D/C#=0; R/W#=0
- IIC_Wait_Ack();
- Write_IIC_Byte(0x40); //write data
- IIC_Wait_Ack();
- Write_IIC_Byte(IIC_Data);
- IIC_Wait_Ack();
- IIC_Stop();
- }
- void OLED_WR_Byte(unsigned dat,unsigned cmd)
- {
- if(cmd)
- {
- Write_IIC_Data(dat);
- }
- else
- {
- Write_IIC_Command(dat);
- }
- }
复制代码显示字符与图像的主函数如下: - //0.96’ IIC_OLED屏显示
- #include "includes.h"
- #include "bmp.h"
- #include "oled.h"
- int main (void)
- {
- INT8U t = 0;
- SystemCoreClockUpdate();
- OLED_Init();
- OLED_Clear() ;
- t=' ';
- OLED_ShowCHinese(0,0,0);
- OLED_ShowCHinese(18,0,1);
- OLED_ShowCHinese(36,0,2);
- OLED_ShowCHinese(54,0,3);
- OLED_ShowCHinese(72,0,4);
- OLED_ShowCHinese(90,0,5);
- OLED_ShowCHinese(108,0,6);
- Delay_50ms(1000);
- Delay_50ms(1000);
- Delay_50ms(1000);
- Delay_50ms(1000);
- Delay_50ms(1000);
- Delay_50ms(1000);
- Delay_50ms(1000);
- Delay_50ms(1000);
- OLED_Clear();
- while(t<'~')
- {
- OLED_ShowString(6,0,"0.96' OLED TEST",16);
- OLED_ShowString(8,2,"ZHONGJINGYUAN",16);
- OLED_ShowString(20,4,"2014/05/01",16);
- OLED_ShowString(0,6,"ASCII:",16);
- OLED_ShowString(63,6,"CODE:",16);
- OLED_ShowChar(48,6,t,16); //ASCII
- t++;
- OLED_ShowNum(103,6,t,3,16); //ASCII
- delay_ms(1000);
- delay_ms(1000);
- }
- OLED_DrawBMP(0,0,128,8,BMP1);
- delay_ms(1000);
- delay_ms(1000);
- while(1);
- }
复制代码OLED屏所显示的图像效果如图2所示。 图2 图像显示效果
|