这是我对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;
}
}
}
voidDraw_TX(ucharYaddr,ucharXaddr,constuchar*dp)
{
ucharj;
uchark=0;
//wr_lcd(comm,0x01);//清屏,只能铲除DDRAM
wr_lcd(comm,0x34);//运用扩展指令集,封闭绘图显现翻开扩展指令集
for(j=0;j<16;j++)
{
wr_lcd(comm,Yaddr++);//Y地址
wr_lcd(comm,Xaddr);//X地址
wr_lcd(dat,dp[k++]);//写入数据
wr_lcd(dat,dp[k++]);
}
wr_lcd(comm,0x36);//翻开绘图显现
//wr_lcd(comm,0x30);//回到根本指令集形式
}
5,向液晶全屏写图画的函数如下:
voidDraw_PM(constuchar*ptr)//整屏显现图形
{
uchari,j,k;
wr_lcd(comm,0x34);//翻开扩展指令集
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,*ptr++);//先写入32*16个数据
}
}
i=0x80;
for(j=0;j<32;j++)
{
wr_lcd(comm,i++);
wr_lcd(comm,0x88);
for(k=0;k<16;k++)
{
wr_lcd(dat,*ptr++);//再写入32*16个数据
}
}
wr_lcd(comm,0x36);//翻开绘图显现
wr_lcd(comm,0x30);//回到根本指令集
}
6,下面我就贴上一个对液晶功用测验的函数,其间用到了液晶的许多功用,能够有完成现象调查得到,注释的也较具体,代码如下:
#include“msp430g2553.h”
#include“ser_12864.h”
voidmain(void)
{
uinti;
ucharlaba[]=//16*16巨细图形数据
{0x00,0x00,0x00,0xC0,0x01,0x48,0x02,0x44,0x04,0x52,0xF8,0x49,0x88,0x49,0x88,0x49,
0x88,0x49,0x88,0x49,0xF8,0x49,0x04,0x52,0x02,0x44,0x01,0x48,0x00,0xC0,0x00,0x00};
WDTCTL=WDTPW+WDTHOLD;//关狗
BCSCTL1=CALBC1_12MHZ;//设定cpu时钟DCO频率为12MHz
DCOCTL=CALDCO_12MHZ;
P2DIR|=BIT5+BIT4;//液晶的两条线
init_lcd();//初始化液晶
//下面是显现液晶字符表中的字符
wr_lcd(comm,0x80);//写榜首行的显现地址写指令0x80
for(i=0;i<16;i++)//每一行能够显现16个字符
wr_lcd(dat,0x00+i);//显现0x00~0x0f对应的字符写数据
wr_lcd(comm,0x90);//写第二行的显现地址因为12864的13行和24行分别由操控器ST7920的两行切割来的,为了看起来便利
//这儿要手动把地址切换到第二行。要不然的话,显现完了榜首行,液晶会主动切换显现到第三行上去
for(i=0;i<16;i++)
wr_lcd(dat,0x10+i);//显现0x10~0x1f对应的字符
wr_lcd(comm,0x88);//写第三行的显现地址
for(i=0;i<16;i++)
wr_lcd(dat,0x20+i);//显现0x20~0x2f对应的字符
wr_lcd(comm,0x98);//写第四行的显现地址
for(i=0;i<16;i++)
wr_lcd(dat,0x30+i);//显现0x30~0x3f对应的字符
//delay_ms(1000);//推迟1s,调查作用
//调试时,能够在此处设置断点,单步履行下面的指令,调查成果
//在显现时DDAM和GDRAM是一起显现的,也便是它们的显现成果是叠加在一起的
//1.设定DDRAM地址指令
wr_lcd(comm,0x90);//设定DDRAM地址,因为此刻DDRAM地址现已溢出
//2.显现状况指令
wr_lcd(comm,0x08);//全体显现关,游标关,游标位置关
wr_lcd(comm,0x0c);//全体显现开,游标关,游标位置关
wr_lcd(comm,0x0e);//全体显现开,游标开,游标位置关
wr_lcd(comm,0x0f);//全体显现开,游标开,游标位置开游标闪耀
//3.位址归位
wr_lcd(comm,0x02);//位址归位,游标回到原点
wr_lcd(comm,0x84);//将DDRAM地址设为0x88,游标在此闪耀
//4.点设定指令
//(以下四个指令是操控写入字符今后光标及整屏显现的移动)
wr_lcd(comm,0x07);//光标右移全体显现左移
wr_lcd(comm,0x20);//写入两个空格
wr_lcd(dat,0x20);
wr_lcd(comm,0x05);//光标左移全体显现右移
wr_lcd(dat,0x20);//写入两个空格
wr_lcd(dat,0x20);
wr_lcd(comm,0x06);//光标右移全体显现不移动
wr_lcd(dat,0x20);//写入两个空格
wr_lcd(dat,0x20);
wr_lcd(comm,0x04);//光标左移全体显现不移动
wr_lcd(dat,0x20);//写入两个空格
wr_lcd(dat,0x20);
//5.游标和显现移位操控
//(以下四个指令无需写入显现数据,直接操控光标和整屏显现的移动,上面履行的指令是写入空格完成光标移动和整屏的移动)
wr_lcd(comm,0x10);//光标左移
wr_lcd(comm,0x14);//光标右移
wr_lcd(comm,0x18);//全体显现左移,光标跟随
wr_lcd(comm,0x1c);//全体显现右移,光标跟随
wr_lcd(comm,0x0c);//封闭光标
//6.进入扩展功用形式指令
wr_lcd(comm,0x34);//翻开扩展功用形式,绘图显现封闭
//7.反白指令
wr_lcd(comm,0x04);//一起反白1、3行
wr_lcd(comm,0x04);//再次反白1、3行,相当于封闭1、3行反白
wr_lcd(comm,0x05);//一起反白2、4行
wr_lcd(comm,0x05);//再次反白2、4行,相当于封闭2、4行反白
//8.睡觉形式指令
wr_lcd(comm,0x08);//进入睡觉形式液晶的操控器ST7920封闭,降低功耗。可是背光仍是亮的
wr_lcd(comm,0x0c);//退出睡觉形式持续显现
//9.待命形式指令
wr_lcd(comm,0x01);//进入待命形式也是不显现内容的,液晶现已准备好承受数据或指令了
//10.翻开GDRAM显现//这样翻开GDRAM显现,液晶的GDRAM和DDRAM会一起操控液晶的显现
wr_lcd(comm,0x36);//翻开扩展功用形式,翻开绘图显现因为上电后GDRAM中的数据是随机的,所以假如在显现之前不铲除的话,会显现乱码
Draw_TX(0x80,0x84,laba);//显现16*16巨细图形显现上面界说的图画,是一个小喇叭
Clear_GDRAM();//铲除上电复位后GDRAM中的随机数值,此刻GDRAM显现空字符,可是DDRAM中仍是有数据,所以此刻会显现DDRAM中的数据
Draw_TX(0x80,0x84,laba);//从头显现设置16*16巨细图形
//11.封闭GDRAM显现
wr_lcd(comm,0x34);//翻开扩展功用形式,封闭绘图显现显现DDRAM中的数据
//12.设定根本指令集
wr_lcd(comm,0x30);//回到根本指令集
//13.铲除显现指令
wr_lcd(comm,0x01);//清屏只能铲除DDRAM此刻液晶就什么都不显现了
//下面是显现液晶字符表中的字符
wr_lcd(comm,0x80);//写榜首行的显现地址
for(i=0;i<16;i++)
wr_lcd(dat,0x40+i);//显现0x40~0x4f对应的字符
wr_lcd(comm,0x90);//写第二行的显现地址
for(i=0;i<16;i++)
wr_lcd(dat,0x50+i);//显现0x50~0x5f对应的字符
wr_lcd(comm,0x88);//写第三行的显现地址
for(i=0;i<16;i++)
wr_lcd(dat,0x60+i);//显现0x60~0x6f对应的字符
wr_lcd(comm,0x98);//写第二行的显现地址
for(i=0;i<16;i++)
wr_lcd(dat,0x70+i);//显现0x70~0x7f对应的字符
LPM4;
}
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/guandian/272766.html