新闻中心

EEPW首页>嵌入式系统>设计应用> 关于8位单片机驱动液晶屏的应用总结

关于8位单片机驱动液晶屏的应用总结

作者: 时间:2016-12-01 来源:网络 收藏
如何构成一个显示系统:
电源+MCU+TFT液晶屏
呵呵,是不是觉得少了点什么?驱动IC那里去了?
其实驱动IC我们是看不到的,它被集成在了液晶屏中,我们只要知道它的寄存器的定义,利用液晶屏的端口会进行读写即可。
电源:3.3V的直流电源,呵呵,这个不用细说,小功率的可以利用ASM1117-3;大功率的可以利用LM2596S-3.3(最高3A的输出)来构成一个电源。
MCU:主要是3个要求。
工作电压,3.3V
够大,
够快。
够大才能存的下程序和数据,够快才会图像流畅。
本人手头只有15L2K08S2这个单片机,8K程序存储区,2K的SRAM,最高时钟33.1776MHz,最高输出8MHz的外部时钟,比起60S2的60KB的FLASH,小了不少,但是对于普通的不太复杂的应用已经足够了,主要是搞通应用的原理。
液晶屏:
以上列举的液晶屏都是串口屏,所以屏的引出脚较少,除此之外还有引出管脚较多的并口屏,
当然串口屏的数据是一位一位的送出的,速度相对是比较慢的。
在操作上,串口和并口原理差不多。这里就先介绍串口屏的使用。
好了,你有了上面的3大件下面在准备点辅料。
1、数据线,USB转串口数据线,用于烧写MCU
2、字符LCD点阵提取软件:百度一下吧,zimo221.exe
3、图片点阵数据提取软件:同样百度,Image2Lcd.exe
4、编程软件:KEIL
5、单片机烧写软件:这个不多说了,看你用的芯片而定。
好的,齐活了,准备开工。
用导线将单片机的电源接口和LCD的电源及LED端口同3.3V电源的输出连接起来。供电的问题解决了。
用导线将自己选择的单片机的端口和LCD的REST、CS、SCL、AO、SDA一一对应的连接起来。数据输出的问题解决。
硬件问题解决,开始代码的编写
TFT初始化函数:
也就是对液晶屏进行基本的配置。
这个基本直接套用就行。(除了个别地方需要修改,后面会说)
TFT驱动芯片的手册还是有必要看看的,最好是看英文原版内容比较详细。
也没有必要全部看,但是下面初始化代码中涉及到的指令及4wireSPI的时序图,还是很有必要了解的,不然显示的界面出了问题,就会感觉无从下手解决。
写数据和写命令
很明显要想让液晶屏显示字符或图像,必须要把要显示的内容转换成数据写到液晶屏的控制器,想写内容数据还要对液晶屏的控制寄存器进行设置,也就是写命令数据。只有一条SDA串口数据线,怎么区分是内容数据还是命令数据呢,那就要靠AO(RS):寄存器选择信号(低电平:选择命令寄存器;高电平:选择数据寄存器)。
写命令
voidwrite_command(ucharc)
{
cs=0;//片选有效
rs=0;//选择命令寄存器
bitdata=c;//送数据
sda=bit7;scl=0;scl=1;
sda=bit6;scl=0;scl=1;
sda=bit5;scl=0;scl=1;
sda=bit4;scl=0;scl=1;
sda=bit3;scl=0;scl=1;
sda=bit2;scl=0;scl=1;
sda=bit1;scl=0;scl=1;
sda=bit0;scl=0;scl=1;
cs=1;//片选无效
}
写数据
voidwrite_data(uchard)
{
cs=0;
rs=1;
bitdata=d;
sda=bit7;scl=0;scl=1;
sda=bit6;scl=0;scl=1;
sda=bit5;scl=0;scl=1;
sda=bit4;scl=0;scl=1;
sda=bit3;scl=0;scl=1;
sda=bit2;scl=0;scl=1;
sda=bit1;scl=0;scl=1;
sda=bit0;scl=0;scl=1;
cs=1;
}
初始化
/*****************TFT初始化函数***************/
voidlcd_initial()
{
reset=0;
delay(100);
reset=1;
delay(100);
//------------------------------------------------------------------//
//-------------------SoftwareReset-------------------------------//
write_command(0x2A);//列地址设置
write_data(0x00);//列起始地址低8位
write_data(0x00);//列起始地址高8位
write_data(0x00);//列终止地址高8位
write_data(0x9F);//列终止地址低8位
//上面的列终止地址为什么设置成0x9f,0x9f=十进制的159,1.8寸的屏的分辨率是128*160.
//也就是说有0-159共160列。下面的同样的道理,只不过是说明行的起始和终止地址。
write_command(0x2B);//行地址设置
write_data(0x00);
write_data(0x00);
write_data(0x00);
write_data(0x7F);
write_command(0xCB);//功耗控制A
write_data(0x39);
write_data(0x2C);
write_data(0x00);
write_data(0x34);
write_data(0x02);
write_command(0xCF);//功耗控制B
write_data(0x00);
write_data(0XC1);
write_data(0X30);
write_command(0xE8);//驱动时序控制A
write_data(0x85);
write_data(0x00);
write_data(0x78);
write_command(0xEA);//驱动时序控制B
write_data(0x00);
write_data(0x00);
write_command(0xED);//电源序列控制
write_data(0x64);
write_data(0x03);
write_data(0X12);
write_data(0X81);
write_command(0xF7);//泵比控制
write_data(0x20);
write_command(0xC0);//Powercontrol功耗控制1
write_data(0x23);//VRH[5:0]`
write_command(0xC1);//Powercontrol功耗控制2
write_data(0x10);//SAP[2:0];BT[3:0]
write_command(0xC5);//VCMcontrol
write_data(0x3e);//对比度调节
write_data(0x28);
write_command(0xC7);//VCMcontrol2
write_data(0x86);//--
write_command(0x36);//MemoryAccessControl存储器访问控制
write_data(0x68);//C8//4868竖屏//28E8横屏
//cc同c8
write_command(0x3A);//像素格式设置
write_data(0x55);
write_command(0xB1);//帧速率控制
write_data(0x00);
write_data(0x18);
write_command(0xB6);//DisplayFunctionControl
write_data(0x08);
write_data(0x82);
write_data(0x27);
write_command(0xF2);//3GammaFunctionDisable
write_data(0x00);
write_command(0x26);//Gammacurveselected
write_data(0x01);//共4条曲线供选择,分别是1248;这里选择1,
write_command(0xE0);//SetGamma
write_data(0x0F);
write_data(0x31);
write_data(0x2B);
write_data(0x0C);
write_data(0x0E);
write_data(0x08);
write_data(0x4E);
write_data(0xF1);
write_data(0x37);
write_data(0x07);
write_data(0x10);
write_data(0x03);
write_data(0x0E);
write_data(0x09);
write_data(0x00);
write_command(0XE1);//SetGamma
write_data(0x00);
write_data(0x0E);
write_data(0x14);
write_data(0x03);
write_data(0x11);
write_data(0x07);
write_data(0x31);
write_data(0xC1);
write_data(0x48);
write_data(0x08);
write_data(0x0F);
write_data(0x0C);
write_data(0x31);
write_data(0x36);
write_data(0x0F);
write_command(0x11);//ExitSleep
delay(120);
write_command(0x29);//Displayon
write_command(0x2c);
}
在写入数据时要先确定,图像的起始坐标和终止坐标,可以用如下的代码实现
staticvoidLCD_SetPos(unsignedintx0,unsignedintx1,unsignedinty0,unsignedinty1)//设置位置
{
write_command(0x2A);//列地址设置
write_data(x0>>8);//列起始地址高8位
write_data(x0);//列起始地址低8位
write_data(x1>>8);//列终止地址高8位
write_data(x1);//列终止地址低8位
write_command(0x2B);//页地址设置
write_data(y0>>8);
write_data(y0);
write_data(y1>>8);
write_data(y1);
write_command(0x2c);//写存储器
}
写命令时,先将命令的地址写入,然后在将设定的数据写入寄存器。如
write_command(0x2A);//列地址设置
write_data(0x00);
write_data(0x00);
write_data(0x00);
write_data(0x9F);
至于这些写入的数据的意义及数值大小,请查阅液晶屏对应的液晶屏的数据手册。
了解一下颜色代码:
几种常用的颜色的代码
#defineWhite0xFFFF//白
#defineBlack0x0000//黑
#defineRed0x001F//红
#defineBlue0xF800//蓝
#defineMagenta0xF81F//紫
#defineGreen0x07E0//绿
#defineCyan0x07FF//青
#defineYellow0xFFE0//黄
好了说了这么多,一个字晕。好吧,来点实际的简单的,咱先啥字符也不显示,
只是让液晶屏显示不同的颜色。
刷整个屏幕的颜色
可以用如下代码实现
/*********显示色彩******************/
voiddsp_single_colour(DH,DL)//前景颜色,背景颜色
{
unsignedinti,j;
for(i=0;i<128;i++)
for(j=0;j<160;j++)
{
write_data(DH>>8);
write_data(DH);
write_data(DL>>8);
write_data(DL);
}
}
延时函数
/******延时函数************************/
voiddelay(uinttime)
{
uinti,j;
for(i=0;i for(j=0;j<500;j++);
}
好了,将上面的函数组合起来,准备刷屏。
main()
{
lcd_initial();//TFT初始化
while(1)
{
LCD_SetPos(0,159,0,10);//设置位置
dsp_single_colour(Blue,Black);//
delay(2000);
LCD_SetPos(0,159,10,20);//设置位置
dsp_single_colour(Blue,Blue);//
delay(2000);
LCD_SetPos(0,159,20,30);//设置位置
dsp_single_colour(Green,White);//
delay(2000);
LCD_SetPos(0,159,30,40);//设置位置
dsp_single_colour(Green,Green);//
delay(2000);
LCD_SetPos(0,159,40,50);//设置位置
dsp_single_colour(Yellow,White);//
delay(2000);
LCD_SetPos(0,159,50,60);//设置位置
dsp_single_colour(Yellow,Yellow);//
delay(2000);
LCD_SetPos(0,159,60,70);//设置位置
dsp_single_colour(Black,White);//
delay(2000);
LCD_SetPos(0,159,70,80);//设置位置
dsp_single_colour(Black,Black);//
delay(2000);
LCD_SetPos(0,159,80,90);//设置位置
dsp_single_colour(Red,White);//
delay(2000);
LCD_SetPos(0,159,90,100);//设置位置
dsp_single_colour(Red,Red);//
delay(2000);
LCD_SetPos(0,159,100,110);//设置位置
dsp_single_colour(Magenta,Black);//
delay(2000);
LCD_SetPos(0,159,110,120);//设置位置
dsp_single_colour(Magenta,Magenta);//
delay(2000);
LCD_SetPos(0,159,0,120);//设置位置
dsp_single_colour(White,White);//只刷到第121行留下了7行
delay(2000);
}

评论


技术专区