7、屏幕显示
大约 3 分钟
学习目标
1.学习了解IIC通讯基本知识。
2.学习如果使用板载0.96寸屏幕,用于显示汉字、字符串。
LCD简介
这块芯片支持通信接口,能适配5V到3.3V的供电电压,使得它方便与多种微控制器如STM32等进行连接和使用。
0.96寸IPS TFT显示屏不仅具有高分辨率和全彩显示能力,而且通过简化的SPI接口易于与STM32等微控制器进行集成,是开发小型、高性能嵌入式显示解决方案的理想选择。
程序分析
LCD初始化代码
void LCD_Init(void)
{
LCD_GPIO_Init();//初始化GPIO
LCD_RES_Clr();//复位
delay_ms(100);
LCD_RES_Set();
delay_ms(100);
LCD_BLK_Clr();//打开背光
delay_ms(100);
LCD_WR_REG(0x11); //Sleep out
delay_ms(120); //Delay 120ms
LCD_WR_REG(0xB1); //Normal mode
LCD_WR_DATA8(0x05);
LCD_WR_DATA8(0x3C);
LCD_WR_DATA8(0x3C);
LCD_WR_REG(0xB2); //Idle mode
LCD_WR_DATA8(0x05);
LCD_WR_DATA8(0x3C);
LCD_WR_DATA8(0x3C);
LCD_WR_REG(0xB3); //Partial mode
LCD_WR_DATA8(0x05);
LCD_WR_DATA8(0x3C);
LCD_WR_DATA8(0x3C);
LCD_WR_DATA8(0x05);
LCD_WR_DATA8(0x3C);
LCD_WR_DATA8(0x3C);
LCD_WR_REG(0xB4); //Dot inversion
LCD_WR_DATA8(0x03);
LCD_WR_REG(0xC0); //AVDD GVDD
LCD_WR_DATA8(0xAB);
LCD_WR_DATA8(0x0B);
LCD_WR_DATA8(0x04);
LCD_WR_REG(0xC1); //VGH VGL
LCD_WR_DATA8(0xC5); //C0
LCD_WR_REG(0xC2); //Normal Mode
LCD_WR_DATA8(0x0D);
LCD_WR_DATA8(0x00);
LCD_WR_REG(0xC3); //Idle
LCD_WR_DATA8(0x8D);
LCD_WR_DATA8(0x6A);
LCD_WR_REG(0xC4); //Partial+Full
LCD_WR_DATA8(0x8D);
LCD_WR_DATA8(0xEE);
LCD_WR_REG(0xC5); //VCOM
LCD_WR_DATA8(0x0F);
LCD_WR_REG(0xE0); //positive gamma
LCD_WR_DATA8(0x07);
LCD_WR_DATA8(0x0E);
LCD_WR_DATA8(0x08);
LCD_WR_DATA8(0x07);
LCD_WR_DATA8(0x10);
LCD_WR_DATA8(0x07);
LCD_WR_DATA8(0x02);
LCD_WR_DATA8(0x07);
LCD_WR_DATA8(0x09);
LCD_WR_DATA8(0x0F);
LCD_WR_DATA8(0x25);
LCD_WR_DATA8(0x36);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x08);
LCD_WR_DATA8(0x04);
LCD_WR_DATA8(0x10);
LCD_WR_REG(0xE1); //negative gamma
LCD_WR_DATA8(0x0A);
LCD_WR_DATA8(0x0D);
LCD_WR_DATA8(0x08);
LCD_WR_DATA8(0x07);
LCD_WR_DATA8(0x0F);
LCD_WR_DATA8(0x07);
LCD_WR_DATA8(0x02);
LCD_WR_DATA8(0x07);
LCD_WR_DATA8(0x09);
LCD_WR_DATA8(0x0F);
LCD_WR_DATA8(0x25);
LCD_WR_DATA8(0x35);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x09);
LCD_WR_DATA8(0x04);
LCD_WR_DATA8(0x10);
LCD_WR_REG(0xFC);
LCD_WR_DATA8(0x80);
LCD_WR_REG(0x3A);
LCD_WR_DATA8(0x05);
LCD_WR_REG(0x36);
if(USE_HORIZONTAL==0)LCD_WR_DATA8(0x08);
else if(USE_HORIZONTAL==1)LCD_WR_DATA8(0xC8);
else if(USE_HORIZONTAL==2)LCD_WR_DATA8(0x78);
else LCD_WR_DATA8(0xA8);
LCD_WR_REG(0x21); //Display inversion
LCD_WR_REG(0x29); //Display on
LCD_WR_REG(0x2A); //Set Column Address
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x1A); //26
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x69); //105
LCD_WR_REG(0x2B); //Set Page Address
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x01); //1
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0xA0); //160
LCD_WR_REG(0x2C);
}
屏幕填充代码
void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color)
{
u16 i,j;
LCD_Address_Set(xsta,ysta,xend-1,yend-1);//设置显示范围
for(i=ysta;i<yend;i++)
{
for(j=xsta;j<xend;j++)
{
LCD_WR_DATA(color);
}
}
}
字符串显示
void LCD_ShowString(u16 x,u16 y,const u8 *p,u16 fc,u16 bc,u8 sizey,u8 mode)
{
while(*p!='\0')
{
LCD_ShowChar(x,y,*p,fc,bc,sizey,mode);
x+=sizey/2;
p++;
}
}
汉字显示代码
void LCD_ShowChinese16x16(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)
{
u8 i,j,m=0;
u16 k;
u16 HZnum;//汉字数目
u16 TypefaceNum;//一个字符所占字节大小
u16 x0=x;
TypefaceNum=(sizey/8+((sizey%8)?1:0))*sizey;
HZnum=sizeof(tfont16)/sizeof(typFNT_GB16); //统计汉字数目
for(k=0;k<HZnum;k++)
{
if ((tfont16[k].Index[0]==*(s))&&(tfont16[k].Index[1]==*(s+1)))
{
LCD_Address_Set(x,y,x+sizey-1,y+sizey-1);
for(i=0;i<TypefaceNum;i++)
{
for(j=0;j<8;j++)
{
if(!mode)//非叠加方式
{
if(tfont16[k].Msk[i]&(0x01<<j))LCD_WR_DATA(fc);
else LCD_WR_DATA(bc);
m++;
if(m%sizey==0)
{
m=0;
break;
}
}
else//叠加方式
{
if(tfont16[k].Msk[i]&(0x01<<j)) LCD_DrawPoint(x,y,fc);//画一个点
x++;
if((x-x0)==sizey)
{
x=x0;
y++;
break;
}
}
}
}
}
continue; //查找到对应点阵字库立即退出,防止多个汉字重复取模带来影响
}
}
图片显示代码
void LCD_ShowPicture(u16 x,u16 y,u16 length,u16 width,const u8 pic[])
{
u16 i,j;
u32 k=0;
LCD_Address_Set(x,y,x+length-1,y+width-1);
for(i=0;i<length;i++)
{
for(j=0;j<width;j++)
{
LCD_WR_DATA8(pic[k*2]);
LCD_WR_DATA8(pic[k*2+1]);
k++;
}
}
}
主函数代码
int main(void)
{
delay_init();
LCD_Init();
LED_Init();
LCD_Fill(0,0,LCD_W,LCD_H,WHITE);
LCD_ShowString(10,0,"Hello!",BLACK,WHITE,16,0);
while(1)
{
}
}
主函数实现的功能很简单,首先调用LCD始化函数,屏幕填充白底,然后条用显示字符串、中文及图片的函数即可。
实验现象
程序下载完成之后,在0.96寸屏幕上会分行显示文字“Hello!”。