找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5774|回复: 1
打印 上一主题 下一主题
收起左侧

关于LCD1602显示指定字符(教程+仿真+源码+工具)

[复制链接]
跳转到指定楼层
楼主
LCD1602显示自定义字符
1.1  怎么显示?
要想让LCD显示自定义字符,只需要把要显示的字符写入LCD的CGRAM寄存器中,再读取出来就行了。
问题是,怎么将自定义字符写入CGRAM呢?
根据数据手册可知,CGRAM起始地址为0x40,那么第一个字符的CGRAM地址为0x40~0x47(一个字节占用一个地址,一个自定义字符为8个字节),依次第二个字符地址为0x48~0x4F第三个为0x50~0x57···
那么在我们将自定义的字符写入到CGRAM后,LCD1602内部的DDRAM(字符显示地址数据存贮器)会给你自定义的字符分配一个显示地址,第一个字符的显示地址为0x00,第二个字符的显示地址为0x01,第三个的显示地址为0x02···
1.2  具体实现步骤
  • 打开取模软件(附件)
  • 文件->新建->8*8
  • 在右5*8点阵中写入想要显示的字符
  • 设置
  • 生成字模(八个十六进制的数)
1.3  简短参考程序
  1. 1 code uchar User[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};//自定义字符℃
  2. 2 LCD_write_com(0x40); //设定 CGRAM 地址
  3. 3 for(i=0;i<8;i++ )
  4. 4 {
  5. 5     LCD_write_data(User[i]); //写入自定义图形 ℃
  6. 6 }
  7. 7 LCD_write_com(0x8d); //设定屏幕上的显示位置
  8. 8 LCD_write_data(0x00); //从 CGRAM 里取出自定义图形显示
复制代码
2  LCD12864显示汉字在真实的LCD12864中,是存在字符的。但是在proteus仿真中的12864是不支持显示汉字的!
不支持显示汉字,并不是不能显示汉字!
在这里仅介绍LCD12864在仿真中的汉字取模问题。
  • 打开取模软件(附件下载
  • 文件->新建->16*16(在中国汉字中,任何一个汉字都可以用16*16点阵表示!)
  • 在16*16点阵中画出先要显示的汉字
  • 设置
  • 生成字模(十六个十六进制的数)
【注】12864显示数字、字母等,也要设置取模字符串,但不再是16*16像素,而为16*8像素。但是相应的显示程序中,也不能在用显示汉字的for(16),而要改成for(8)。

仿真:


单片机源程序如下:
  1. #include "lcd12864.h"

  2. /*******数据口的最高位DB7==1,则busy*****************/
  3. /*void lcd_r_busy()
  4. {
  5.         P2=0x00;
  6.         RS=0;
  7.         RW=1;
  8.         EN=1;
  9.         while(P2&0x80);   
  10.         EN=0;
  11. }*/

  12. /****************LCD写命令函数********************/
  13. void lcd_w_cmd(u8 value)
  14. {
  15.         //lcd_r_busy();        //每次读写操作前都要忙判断
  16.         RS=0;
  17.         RW=0;
  18.         P2=value;
  19.         //lcd_databus=value;
  20.         EN=1;                //下降沿锁存写入的数据/命令
  21.         delay_ms(2);
  22.         EN=0;
  23. }

  24. /****************LCD写数据************************/
  25. void lcd_w_data(u8 value)
  26. {
  27.         //lcd_r_busy();
  28.         RS=1;
  29.         RW=0;
  30.         P2=value;
  31.         //lcd_databus=value;
  32.         EN=1;                //下降沿锁存写入的数据/命令
  33.         delay_ms(2);
  34.         EN=0;
  35. }

  36. /***************页设置:显示在哪一页******************/
  37. /*************共8页,一页是8行像素点*****************/
  38. void lcd_set_page(u8 page)
  39. {
  40.         page=0xb8 | page;     //页的首地址为0xb8:page或上0xb8=选择page页
  41.         lcd_w_cmd(page);
  42. }

  43. /************行设置:起始在哪一行********************/
  44. /**********每页共8行,一般从0行开始******************/
  45. void lcd_set_line(u8 sline)
  46. {
  47.         sline=0xc0 | sline;   //起始行地址为0xc0:sline或上0xc0=选择行
  48.         lcd_w_cmd(sline);
  49. }

  50. /*************起始列设置+像素点选择********************/
  51. /***********每半片共64列,列值不得大于63***************/
  52. void lcd_set_column(u8 column)
  53. {
  54.         column=0x3f & column;   //与上列的最大值63:0x3f  可得所选列值<63
  55.         column=0x40 | column;   //得列的首地址
  56.         lcd_w_cmd(column);
  57. }

  58. /*************设置显示的开关********************/
  59. /**********0为关闭显示;1为 开启显示************/
  60. void lcd_on_off(u8 set)
  61. {
  62.         set=0x3e | set;        //=0011 111x----0x3e为关闭显示;0x3f为开启显示
  63.         lcd_w_cmd(set);
  64. }

  65. /*************选择左右半屏显示********************/
  66. /********0-全屏显示;1-左;2-右********************/
  67. /************cs片选端低电平有效********************/
  68. void lcd_cs(u8 sel)
  69. {
  70.         switch(sel)
  71.         {
  72.                 case 0:CS1=0; CS2=0; break;     //全屏显示
  73.                 case 1:CS1=0; CS2=1; break;     //左显示
  74.                 case 2:CS1=1; CS2=0; break;     //右显示
  75.                 default:break;
  76.         }
  77. }

  78. /*************清屏:选择半屏********************/
  79. /********0-清全屏;1-清左;2-清右***************/
  80. void lcd_clear(u8 sel)
  81. {
  82.         u8 i,j;
  83.         lcd_cs(sel);
  84.         for(i=0;i<8;i++)
  85.         {
  86.                 lcd_set_page(i);
  87.                 lcd_set_column(0);
  88.                 for(j=0;j<64;j++)
  89.                 {
  90.                         lcd_w_data(0x00);   //每列全部写0,列地址指针自动+1
  91.                 }
  92.         }
  93. }

  94. /****************LCD的初始化********************/
  95. void lcd_init()
  96. {
  97.         //lcd_r_busy();
  98.         lcd_cs(0);
  99.         lcd_on_off(0);  //关显示
  100.         lcd_cs(0);
  101.         lcd_on_off(1);  //开显示
  102.         lcd_cs(0);
  103.         lcd_clear(0);   //清全屏
  104.         lcd_set_line(0);    //起始行设为0
  105. }

  106. /****************16*16像素的汉字显示程序********************/
  107. void display(u8 cs, u8 page, u8 column, u8 *p)
  108. {
  109.         u8 i;
  110. ……………………

  111. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
07.中文字库.rar (2.16 MB, 下载次数: 30)
12864显示.rar (54.71 KB, 下载次数: 15)
取模工具下载:http://www.51hei.com/bbs/dpj-54570-1.html

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:319331 发表于 2018-5-3 11:40 | 只看该作者
666666,完美的取模软件
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表