非常好12864带字库液晶学习.docx

上传人:b****5 文档编号:6510223 上传时间:2023-01-07 格式:DOCX 页数:59 大小:1.19MB
下载 相关 举报
非常好12864带字库液晶学习.docx_第1页
第1页 / 共59页
非常好12864带字库液晶学习.docx_第2页
第2页 / 共59页
非常好12864带字库液晶学习.docx_第3页
第3页 / 共59页
非常好12864带字库液晶学习.docx_第4页
第4页 / 共59页
非常好12864带字库液晶学习.docx_第5页
第5页 / 共59页
点击查看更多>>
下载资源
资源描述

非常好12864带字库液晶学习.docx

《非常好12864带字库液晶学习.docx》由会员分享,可在线阅读,更多相关《非常好12864带字库液晶学习.docx(59页珍藏版)》请在冰豆网上搜索。

非常好12864带字库液晶学习.docx

非常好12864带字库液晶学习

12864带字库(ST7920控制器)液晶学习

本帖最后由love_wjgyga于2010-12-211:

17编辑

在此指出,这一篇文章出至网络上zhaoshan413之手,感谢他的无私贡献,让大家轻松玩转带字库12864!

~~

之前说学完12864字库液晶后和大家交流一下心得,一直没有时间,今天整理一下发上来,希望对想学习的朋友能有点帮助…首先说明一点,本人也是初学者,自感水平不高,若有不足及不对之处,望情指正…以下以并行口传输为例,别的还不会,呵呵!

先传一下ST7920的芯片说明书:

ST7920(字库)12864.pdf(1.65MB)

下载次数:

582

2010-12-110:

46

一、首先说一下关于驱动函数的书写,这些是液晶显示的基础

    一般包括四个函数:

    1、写命令函数;

    2、写数据函数;

    3、读状态函数;

    4、读数据函数;

    这四个函数并不是必须全部写的,具体要看你实现的功能,如果只是单纯的显示汉字和字符,写命令、写数据、读状态这三个函数就够了,如过你还需要进行一些绘图的操作,那读数据函数也必须书写。

    另外关于读状态函数,其实也就是用于判忙操作,我看郭天祥的书里面是这样说的:

原则上每次对控制器进行读写操作之前,都必须进行读写检测,由于单片机的操作速度慢于液晶控制器的反应速度,因此可不进行读写检测,或者只进行简短的延时即可。

因此,读状态函数也可以不写,只用简短的延时函数替换即可。

1、写操作的编写:

首先看一下时序图

下载(30.03KB)

2010-12-110:

47

由图可见操作很简单:

1>RS=1(写数据操作);或者RS=0(写命令操作);

2>RW=0;//指明为写操作

3>E=1;

4>DB=data;//data为你要写入的命令或数据值

5>E=0;

以下是我的驱动函数,仅供参考:

1./********************************液晶端口定义**************************/

2.#define  lcd_data  P0      //数据口

3.sbit  RS  =P2^4;        //选择寄存器(并行)0:

指令寄存器1:

数据寄存器;

4.sbit  RW  =P2^5;        //读写控制脚(并行)0:

写入1:

读出

5.sbit  E    =P2^6;        //读写数据启始脚(并行)

6.sbit  PSB  =P2^1;        //串并方式选择引脚,0为串行模式,1为8/4位数据口模式

7.sbit  RST  =P2^3;        //复位引脚

8.

9.//********************************************************

10.//延时函数

11.//********************************************************

12.voiddelay(unsignedintk)

13.{  

14.    unsignedinti;

15.    unsignedcharj;

16.    for(i=0;i

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位并行口,扩展指

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 其它模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1