17. {
18. for(j=0;j<10;j++);
19. }
20.}
21.//********************************************************
22.//延时1ms函数
23.//********************************************************
24.voiddelay_ms(unsignedintk)//延时0.994us,晶振12M
25.{
26. unsignedintx,y;
27. for(x=k;x>0;x--)
28. for(y=121;y>0;y--);
29.}
30.//********************************************************
31.//写命令函数
32.//********************************************************
33.voidLcdWcom(unsignedcharWCom)
34.{
35. delay
(1);
36. RS=0; //指明操作对象为指令寄存器
37. RW=0;//指明为写操作
38. E=1;
39. lcd_data=WCom;//将命令写入总线
40. E=0;
41.}
42.//********************************************************
43.//写数据函数
44.//********************************************************
45.voidLcdWdata(unsignedcharWData)
46.{
47. delay
(1);
48. RS=1;//指明操作对象为数据寄存器
49. RW=0;//指明为写操作
50. E=1;
51. lcd_data=WData;//将数据写入总线
52. E=0;
53.}
复制代码
二、初始化操作
以8位并行操作为例,操作流程图如下:
下载(34.36KB)
2010-12-110:
49
初始化操作如下:
1>芯片上电;
2>延时40ms以上;
3>复位操作:
RST出现一个上升沿(RST=1;RST=0;RST=1;);
4>功能设定;
5>延时100us以上;
6>再次进行功能设定;
7>延时37us;
8>显示开关控制;
9>延时100us以上;
10>清除显示;
11>延时10ms以上;
12>进入点设置;
13>初始化结束;
这里我遇到了一个小问题,我的液晶按照这个顺序进行初始化结果不正确,无法显示,最后我把调整了一下就可以了,调整后的顺序为:
清除显示进入点设置显示开关控制,不知道是什么原因,知道的告诉我一声…
1.//********************************************************
2.//显示初始化函数
3.//********************************************************
4.voidDisplay_Init(void)
5.{
6. delay_ms(45);//延时45ms
7. PSB=1;//8位并行口
8. //复位操作
9. RST=1;delay
(1);
10. RST=0;delay
(1);
11. RST=1;delay
(1);
12. //功能设定
13. LcdWcom(0x30);//设置为8位并行口,基本指令集
14. delay(10);
15. LcdWcom(0x30);//再次设置为8位并行口,基本指令集
16. delay(5);
17.// //显示开关控制
18.// LcdWcom(0x0c);//游标显示关,正常显示,整体显示开
19.// delay(10);
20. //清除显示
21. LcdWcom(0x01);
22. delay_ms(12);//延时12ms
23. //进入点设置
24. LcdWcom(0x06);//设置为游标右移,DDRAM位地址加1,画面不移动
25. delay(5);
26. LcdWcom(0x0C);//开显示
27.}
复制代码
三、显示基本的字符和汉字
1、要想显示汉字或字符,首先要确定显示的位置,看看芯片说明书上关于屏幕地址的分配:
下载(30.15KB)
2010-12-111:
06
由于此液晶为128*64,即是横向128个点,竖向64个点,由于该液晶控制器支持的字符为8*16,汉字为16*16,因此只能显示四行,如果是汉字,为每行显示8个,如果是字符,每行显示16个。
由上图设置DDRAM地址的指令可知,最高位为1,余下7位为地址值,因此就对应了为什么起始地址为80H的原因(即对应的写地址指令为10000000);因此如果你要设定显示的地址为第一行的第一个位置,只需要调用写指令函数,写入0x80即可。
存在的问题:
参考网上的程序及在试验过程中发现,实际能显示出来的地址分布式这样的
0x800x810x820x830x840x850x860x87 //第一行汉字位置
0x900x910x920x930x940x950x960x97 //第二行汉字位置
0x880x890x8a0x8b0x8c0x8d0x8e0x8f //第三行汉字位置
0x980x990x9a0x9b0x9c0x9d0x9e0x9f //第四行汉字位置
百思不得其解,尤其让人受不了的是居然是第一行和第三行地址接续,而不是第二行,有明白的高手给讲解一下…
设定DDRAM地址参考程序:
1.//********************************************************
2.//设置光标函数
3.//参数说明:
x为行号,y为列号
4.//********************************************************
5.voidSet_Cursor(unsignedcharx,unsignedchary)
6.{
7. unsignedchari;
8. switch(x)//确定行号
9. {
10. case0x00:
i=0x80;break;//第一行
11. case0x01:
i=0x90;break;//第二行
12. case0x02:
i=0x88;break;//第三行
13. case0x03:
i=0x98;break;//第四行
14. default:
break;
15. }
16. i=y+i;//确定列号
17. LcdWcom(i);//写地址
18.}
复制代码
2、显示字符
由数据手册可查看可以显示的字符及其显示码:
下载(121.94KB)
2010-12-111:
36
因此,当你设置好所要显示的光标位置后,即可调用写数据函数,写入对应相应字符的显示码,比如要显示!
就应该写入0x21。
1.//********************************************************
2.//显示字符函数
3.//********************************************************
4.voidDisplay_Char(unsignedcharAlphabet)
5.{
6. delay
(1);
7. LcdWdata(Alphabet);//写入需要显示字符的显示码
8.}
复制代码
显示!
实例:
1./**********************显示单个字符*************************/
2.Set_Cursor(0,0);//光标地址设定
3.Display_Char(0x21);//显示字符!
复制代码
效果图:
下载(26.05KB)
2010-12-111:
38
扩展程序:
在指定位置显示字符串
1.//********************************************************
2.//指定位置显示字符串函数
3.//参数说明:
x为行号,y为列号
4.//********************************************************
5.voidDisplay_String(unsignedcharx,unsignedchary,unsignedchar*Alphabet)
6.{
7.unsignedchari=0;
8.Set_Cursor(x,y); //设置显示的起始地址
9.while(Alphabet[i]!
='\0')
10.{
11. LcdWdata(Alphabet[i]); //写入需要显示字符的显示码
12. i++;
13.}
14.}
复制代码
显示字符串实例:
1./***********************显示字符串*************************/
2.Display_String(1,0,"WWW.CEPARK.COM"); //显示字符串
复制代码
效果图:
下载(36.65KB)
2010-12-111:
39
3、显示汉字
因为一个汉字占用两个字节的大小,因此要想显示一个汉字,需要进行两个数据写入操作。
所支持的8192个16*16的汉字详见数据手册附录中的ST7920GB中文字型码表。
参考程序:
1.//********************************************************
2.//指定位置显示汉字函数
3.//参数说明:
x为行号,y为列号
4.//********************************************************
5.voidDisplay_HZ(unsignedcharx,unsignedchary,unsignedchar*HZ)
6.{
7. Set_Cursor(x,y); //设置显示的起始地址
8. LcdWdata(HZ[0]); //写入需要显示汉字的高八位数据
9. LcdWdata(HZ[1]); //写入需要显示字符的低八位数据
10.}
复制代码
显示汉字实例:
1./************************显示汉字*************************/
2.Display_HZ(0,1,"电"); //显示电
3.Display_HZ(0,2,"子"); //显示子
4.Display_HZ(0,3,"园"); //显示园
复制代码
效果图:
下载(27.15KB)
2010-12-111:
46
扩展程序:
1.//********************************************************
2.//指定位置显示一行汉字函数,可自动换行
3.//参数说明:
x为行号,y为列号
4.//********************************************************
5.voidDisplay_HZ_Line(unsignedcharx,unsignedchary,unsignedchar*HZ)
6.{
7. unsignedchari=0;
8. Set_Cursor(x,y); //设置显示的起始地址
9. while(HZ[i]!
='\0')
10. {
11. LcdWdata(HZ[i++]); //写入需要显示汉字的高八位数据
12. LcdWdata(HZ[i++]); //写入需要显示字符的低八位数据
13. if((y+i)%16==0) //如果满一行
14. {
15. x++;
16. if(x==4) //如果满一屏
17. x=0;
18. Set_Cursor(x,0); //重新设置显示的起始地址
19. }
20. }
21.}
复制代码
显示一行汉字实例:
1./************************显示一行汉字*********************/
2.Display_HZ_Line(2,0,"欢迎转载,转载请注明出处,谢谢!
");//显示一行汉字
复制代码
效果图:
下载(35.82KB)
2010-12-111:
46
再来一个整体的现实效果
1.//**************************************************************************
2.//说明:
程序主函数
3.//**************************************************************************
4.voidmain(void)
5.{
6./***********************液晶初始化***************************/
7.Display_Init();
8./**********************显示单个字符*************************/
9.Set_Cursor(0,0); //光标地址设定
10.Display_Char(0x21); //显示字符!
11./***********************显示字符串*************************/
12.Display_String(1,0,"WWW.CEPARK.COM"); //显示字符串
13./************************显示汉字*************************/
14.Display_HZ(0,1,"电"); //显示电
15.Display_HZ(0,2,"子"); //显示子
16.Display_HZ(0,3,"园"); //显示园
17./************************显示一行汉字*********************/
18.Display_HZ_Line(2,0,"欢迎转载,转载请注明出处,谢谢!
");//显示一行汉字
19.while
(1);
20.}
复制代码
下载(40.3KB)
2010-12-111:
52
四、关于CGRAM的使用:
可以参考这个网站的程序:
http:
//bbs.友好站点,请勿转贴.com/ShowTopic.aspx?
id=81220ST7920自行产生RAM提供使用者图像定义(造字)功能,可以提供四组16*16点的自定义图像空间,使用者可以将内部自行没有提供的图像自行定义到CGRAM中,便可以通过DDRAM显示在液晶屏上。
注意:
网上介绍说ST7920芯片同屏幕不能显示4个以上自定义汉字(用CGRAM)。
显示CGRAM字型:
将16位元资料写入DDRAM中,一共有0000H,0002H,0004H,0006H四种编码。
下载(23.54KB)
2010-12-112:
05
下载(21.55KB)
2010-12-112:
05
操作步骤:
1>设置为扩充指令集;
2>设置SR=O,允许设定CGRAM地址;
3>设置为基本指令集;
4>循环执行以下操作写入16个字节数据(设定CGRAM的存储地址;写入自定义数据);
5>设置DDRAM地址
6>写入显示CGRAM显示码
CGRAM参考程序:
1.//********************************************************
2.//设置CGRAM字库
3.//ST7920CGRAM(用户自定义图标)空间分布
4.//空间1地址:
40H~4FH共16个地址,一个地址对应两个字节数据;对应调用码:
0000H
5.//空间2地址:
50H~5FH共16个地址,一个地址对应两个字节数据;对应调用码:
0002H
6.//空间3地址:
60H~6FH共16个地址,一个地址对应两个字节数据;对应调用码:
0004H
7.//空间4地址:
70H~7FH共16个地址,一个地址对应两个字节数据;对应调用码:
0006H
8.//参数说明:
num为空间编号,CGRAM_ZIKU为地址指针
9.//********************************************************
10.voidSET_CGRAM(unsignedcharnum,unsignedchar*CGRAM_ZIKU)
11.{
12.unsignedchari,add;
13.LcdWcom(0x34); //再次设置为8位并行口,扩展指