Createdon:2012-8-30
Author:zhangbin
学习笔记
for12864
redesignedbyzhangbin
2012-08-30
versions:12_08_01
这是我对12864的学习笔记,12864液晶功用很全面,运用起来也很便利,能够满意一般的研讨和工程运用的需求。
下面我就对几个方面叙述一下我对它学习过程中的一些领会。我会尽量全面的介绍,并且会首要针对一些特别的运用和一些我以为要特别注意的当地进行较为详细的阐明。而关于那些较为固定的,常用的方面会简略一些。
其间的不论串行形式仍是并行形式,对液晶的写指令,写数据,读操作等这些根本的操作都是一些比较固定的,根底的东西。我以为只需能够看懂,并且能够在不同的处理器上移植就够了,没有必要非要自己对着手册时序图写出来。因为有人现已写好了,并且作业安稳,咱们只需在它的根底上学会运用就能够了。现在是常识爆破时期,常识,信息敏捷胀大,咱们要学会运用已有的作用,然后在这个根底上自己再进行开发运用的研讨。咱们不用必定要从底层开端把他人现已做的很老练的东西再做一遍,这样不光功率不高,并且咱们一般人的精力也不允许。
好了,不说废话了,下面就开端介绍,当然,那些根底层面的东西我也会介绍的。
下面所涉及到的程序,是针对msp430g2553的,都是我现已调通的,能够直接运用。
一,12864的介绍
1,液晶显现模块是128×64点阵的汉字图形型液晶显现模块,可显现汉字及图形,内置国标GB2312码简体中文字库(16X16点阵)、128个字符(8X16点阵)及64X256点阵显现RAM(GDRAM)。可与CPU直接接口,供给两种界面来衔接微处理机:8-位并行及串行两种衔接方法。具有多种功用:光标显现、画面移位、睡觉形式等。
2,常用的12864液晶内部都是运用ST7920操控器。
1),ST7920供给8位元,4位元及串行三种微处理器操控方法,大陆常用的是8位元和串行操控方法。
2),ST7920能够操控显现字母,数字符号,中文字型和自定义的图像。能够用来显现图形,演示动画,制造曲线等。
3),字符显现RAM(DDRAM)
ST7920的字符显现RAM(DDRAM)最多能够操控16字元*4行,LCD的显现规模为16字元*2行。
这儿要注意,其实ST7920的DDRAM每一行能够操控16个汉字的,共有4行。可是LCD的每行只能显现8个字符,为了显现调查的便利,在lcd制造的过程中,是将DDRAM的其间两行拆分开成四行,然后在lcd上显现,也便是DDRAM只用到了一半。
lcd的显现字符的坐标地址如下表:
汉字显现坐标
Line180H81H82H83H84H85H86H87H
Line290H91H92H93H94H95H96H97H
Line388H89H8AH8BH8CH8DH8EH8FH
Line498H99H9AH9BH9CH9DH9EH9FH
从上表不难看出,其间榜首行和第三行是DDRAM中的同一行拆分来的,同理24行也是DDRAM中的同一行拆分而来的。
了解了这一点就不难了解下面程序中在换行显现时,要以为手动地指定下一行的地址。例如:假如榜首行显现完了,下面的数据我要接着显现在第二行,这样才契合人调查的习气,那么我就要在换第二行显现之前要手动地把显现地址切换到第二行。要不然的话,榜首行显现完了,地址会主动添加,就会显现到第三行上去,这样的话咱们调查起来就不天然了。程序实例会在下面涉及到的。
4),中文字库ROM(CGROM)
内置的是GB2312码简体中文字库,共供给了8192个16*16点的中文字型。
5),半宽字型ROM(HCGROM)
供给126个16*8点半字宽的字母符号字型。
6),图像显现RAM(GDRAM)
供给64*256位元的GDRAM
其间咱们常用的RAM便是上面所说到的,还有一些CGRAM,IRAM这些咱们不常常运用,就不再介绍了。
上面介绍的DDRAM操控显现汉字,字符。GDRAM操控显现图像,上电后,默许DDRAM是翻开的,操控液晶显现。GDRAM默许不翻开,它里边的数据是随机的,假如此刻翻开了GDRAM的话,lcd会一起遭到DDRAM和GDRAM的操控,因为GDRAM中的数据是随机的,所以会显现乱码。所以在运用GDRAM之前要先铲除里边的随机数据。
铲除GDRAM的函数如下:
voidClear_GDRAM(void)//铲除GDRAM中的的随机数据。因为上电后GDRAM中的数据是随机的,假如不铲除而直接翻开GDRAM显现时,会显现乱码
//所以在部分运用GDRAM显现图形时,要先铲除随机数据。假如是大局运用GDRAM,即整个lcd屏悉数设置显现数据,则能够
//不用铲除,因为新数据会把随机数据给覆盖掉
{
uchari,j,k;
wr_lcd(comm,0x34);//翻开扩展指令集操作GDRAM是扩展指令集
i=0x80;
for(j=0;j<32;j++)
{
wr_lcd(comm,i++);
wr_lcd(comm,0x80);
for(k=0;k<16;k++)
{
wr_lcd(dat,0x00);//写入空字符,就相当于清零
}
}
i=0x80;
for(j=0;j<32;j++)
{
wr_lcd(comm,i++);
wr_lcd(dat,0x88);
for(k=0;k<16;k++)
{
wr_lcd(dat,0x00);
}
}
wr_lcd(comm,0x30);//回到根本指令集
}
3,12864有两种作业形式
1),并行形式和串行形式。并行形式便是常用的8位数据线,4为操控线。这种方法尽管占用的IO口较多,可是向液晶收发数据较简略完成,数据传输速度较快。所以在一些接连显现多幅图像,演示动画或对显现的实时性要求较高的场合应该考虑这种方法。其间在并行形式中,在向液晶写数据或指令前,要进行液晶忙标志判别BF,要确认液晶显现不忙了,才干进行操作。
其间并行形式的液晶的读写数据,指令函数如下:
voidWrite_Cmd(ucharcmd)
{
ucharlcdtemp=0;
LCD_RS_L;
LCD_RW_H;
LCD_DataIn;//数据输入单片机
do//判忙
{
LCD_EN_H;
_NOP();
lcdtemp=LCD2MCU_Data;
LCD_EN_L;
}
while(lcdtemp&0x80);//判别忙标志等候忙
LCD_DataOut;//数据输出到lcd
LCD_RW_L;
MCU2LCD_Data=cmd;//单片机向lcd输入指令
LCD_EN_H;
_NOP();
LCD_EN_L;
}
voidWrite_Data(uchardat)
{
ucharlcdtemp=0;
LCD_RS_L;
LCD_RW_H;
LCD_DataIn;
do//判忙
{
LCD_EN_H;
_NOP();
lcdtemp=LCD2MCU_Data;
LCD_EN_L;
}
while(lcdtemp&0x80);//等候忙
LCD_DataOut;
LCD_RS_H;
LCD_RW_L;
MCU2LCD_Data=dat;//单片机向lcd中输入数据
LCD_EN_H;
_NOP();
LCD_EN_L;
}
2),串行形式只用到了两根线WREN于单片机进行通讯。这种方法能够大大削减单片机IO口的开支,适用于IO口资源有限的单片机(如msp430g2553)。可是这种方法完成起来较费事,数据的传输功率不高。关于一般的文字,简略图形的显现仍是能够的。(有或许是因为msp430g2553的处理才能较强,我现在用串行衔接方法,显现下面的几幅图像,显现作用很好,看不出有什么数据传输速度慢的问题)。
因为我用的是msp430g2553,所以我一向都是运用串行的操控形式。
//下面要点讲一下串行的时序
//SCLK:串行同步时钟线,每操作一位数据都要有一个SCLK跳变沿,并且在这儿是上升沿有用。也便是说,每次SCLK由低电平变为高电平的瞬间,液晶控
//制器将SID上的数据读入或输出。
//SID:串行数据,每一次操作都由三个字节数据组成,榜首个字节向操控器发送指令操控字,告知操控器接下来是什么操作,若为写指令则发送11111000
//(0xf8),若为若为写数据则发送11111010(0xfa),若为读状况则发送11111100(0xfc),若为读数据则发送11111110(0xfe)。
//第二个字节的高4位为发送指令或数据的高4位,第二个字节的低4位补0.
//第三个字节的高4位为发送指令或数据的低4位,第三个字节的低4位补0
//详细的能够调查时序进行了解
其间数据的传输的函数如下:
//12864串行衔接写数据,写指令函数依照手册上的时序进行编程
void wr_lcd(uchar dat_comm,uchar content)//
{//要写的数据
uchar a,i,j;
delay_us(50);
a=content;
LCD_SCLK0; //en=0;
LCD_SID1;//wr=1
for(i=0;i<5;i++) //数据时序*****************8前5个高电平的同步码
{
LCD_SCLK1;
LCD_SCLK0;
}
LCD_SID0;//wr=0写操作
LCD_SCLK1;//en=1来一个时钟
LCD_SCLK0;//en=0
if(dat_comm)
LCD_SID1;//RS=1写数据
else
LCD_SID0;//RS=0写指令
LCD_SCLK1; //来一个时钟
LCD_SCLK0;
LCD_SID0;//操控字的最终一位为0
LCD_SCLK1;//来一个时钟
LCD_SCLK0;
for(j=0;j<2;j++)//************总共2*4次循环写写一字节数据,榜首次大循环写高4位,第2次大循环写低4位
{
for(i=0;i<4;i++)
{
if(a&0x80)
LCD_SID1;
else
LCD_SID0;
a=a<<1;
LCD_SCLK1;
LCD_SCLK0;
}
LCD_SID0;
for(i=0;i<4;i++)//时钟下面来4个时钟脉冲
{
LCD_SCLK1;
LCD_SCLK0;
}
}
}
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/chanpin/256243.html