LCD 都需要背光,而 OLED 不需要,因为它是自发光的。这样同样的显示 OLED 效果要来得好一些。0.96 寸 OLED 有黄蓝,白,蓝三种颜色可选;其中黄蓝是屏上 1/4 部分为黄光,下 3/4 为蓝;而且是 固定区域显示固定颜色,颜色和显示区域均不能修改;白光则为纯白,也就是黑底白字
对于双色的OLED用来做显示屏只最好的选择,他的驱动方式是一样的,代码都一样就是地测不一样而已。
这个就是看开发者自己的的选择了。我选择的是6PIN的OLED,使用SPI驱动的。
驱动芯片是SSD1306,使用的是中景园提供的代码。
这里直接定义使用的管脚,后面容易对代码进行移植操作。
使用的是P2的引脚
#define LCD_SCLK_GPIO_Port GPIO2
#define LCD_SCLK_Pin GPIO_PIN_0
#define LCD_SDIN_GPIO_Port GPIO2
#define LCD_SDIN_Pin GPIO_PIN_1
#define LCD_RES_GPIO_Port GPIO2
#define LCD_RES_Pin GPIO_PIN_2
#define LCD_DC_GPIO_Port GPIO2
#define LCD_DC_Pin GPIO_PIN_3
需要对每一个IO口进行操作,也是用的是宏定义。
#define OLED_SCL_Clr() GPIO_WriteLow(LCD_SCLK_GPIO_Port,LCD_SCLK_Pin)//SCL
#define OLED_SCL_Set() GPIO_WriteHigh(LCD_SCLK_GPIO_Port,LCD_SCLK_Pin)
#define OLED_SDA_Clr() GPIO_WriteLow(LCD_SDIN_GPIO_Port,LCD_SDIN_Pin)//SDA
#define OLED_SDA_Set() GPIO_WriteHigh(LCD_SDIN_GPIO_Port,LCD_SDIN_Pin)
#define OLED_RES_Clr() GPIO_WriteLow(LCD_RES_GPIO_Port,LCD_RES_Pin)//RES
#define OLED_RES_Set() GPIO_WriteHigh(LCD_RES_GPIO_Port,LCD_RES_Pin)
#define OLED_DC_Clr() GPIO_WriteLow(LCD_DC_GPIO_Port,LCD_DC_Pin)//DC
#define OLED_DC_Set() GPIO_WriteHigh(LCD_DC_GPIO_Port,LCD_DC_Pin)
还需要初始化IO口输出
GPIO_Init(LCD_SCLK_GPIO_Port, LCD_SCLK_Pin, GPIO_MODE_OUT_PP); //
GPIO_Init(LCD_SDIN_GPIO_Port, LCD_SDIN_Pin, GPIO_MODE_OUT_PP); //
GPIO_Init(LCD_RES_GPIO_Port, LCD_RES_Pin, GPIO_MODE_OUT_PP); //
GPIO_Init(LCD_DC_GPIO_Port, LCD_DC_Pin, GPIO_MODE_OUT_PP); //
中景园提供的初始化寄存器的代码
OLED_RES_Clr();
delay_ms(200);
OLED_RES_Set();
OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel
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 Set Mapping RAM Display Start Line (0x00~0x3F)
OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register
OLED_WR_Byte(0xCF,OLED_CMD);// Set SEG Output Current Brightness
OLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping 0xa0左右反置 0xa1正常
OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction 0xc0上下反置 0xc8正常
OLED_WR_Byte(0xA6,OLED_CMD);//--set normal display
OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 duty
OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset Shift Mapping RAM Counter (0x00~0x3F)
OLED_WR_Byte(0x00,OLED_CMD);//-not offset
OLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency
OLED_WR_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec
OLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge period
OLED_WR_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
OLED_WR_Byte(0xDA,OLED_CMD);//--set com pins hardware configuration
OLED_WR_Byte(0x12,OLED_CMD);
OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomh
OLED_WR_Byte(0x40,OLED_CMD);//Set VCOM Deselect Level
OLED_WR_Byte(0x20,OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02)
OLED_WR_Byte(0x02,OLED_CMD);//
OLED_WR_Byte(0x8D,OLED_CMD);//--set Charge Pump enable/disable
OLED_WR_Byte(0x14,OLED_CMD);//--set(0x10) disable
OLED_WR_Byte(0xA4,OLED_CMD);// Disable Entire Display On (0xa4/0xa5)
OLED_WR_Byte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7)
OLED_Clear();
OLED_WR_Byte(0xAF,OLED_CMD);
这里是main函数里面的代码
OLED_Init();
OLED_Clear();
//OLED_ShowStringCN(0,20,"Redfine",1);
OLED_ShowString(7,0,"Redfine",8,1); //表示x,y开始显示字符串
OLED_Refresh();
这是自己写的联合中英文混合显示
void OLED_ShowStringCN(u8 x,u8 y,u8 *chr,u8 mode)
{ unsigned short k,x0;
unsigned char i,j;
while(*chr) {
if((*chr) < 128)
{
OLED_ShowChar(x,y,*chr,16,mode);
x+=8;
chr++;
} else {
for (k=0; k<hz16_num; k++)
{
if ((hz16[k].Index[0]==*(chr))&&(hz16[k].Index[1]==*(chr+1)))
{
for(i=0; i<16; i++)
{
for(j=0; j<8; j++)
{
if(hz16[k].Msk[i*2]&(0x80>>j)) OLED_DrawPoint(x+j,y+i,mode);
else {
OLED_DrawPoint(x+j,y+i,!mode);;
}
}
for(j=0; j<8; j++)
{
if(hz16[k].Msk[i*2+1]&(0x80>>j)) OLED_DrawPoint(x+j+8,y+i,mode);
else
{
OLED_DrawPoint(x+j+8,y+i,!mode);;
}
}
}
}
}
chr+=2;
x+=16;
}
}
}
|
此文章已获得独家原创/原创奖标签,著作权归21ic所有,未经允许禁止转载。
共1人点赞
|