打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
LCD1602液晶显示汉字-Changing's Blog
使用LCD1602 显示字符会比使用七段数码管方便 可显示内容也多的多  1602内部的字符发生器 CGROM中已经存储了160多个字符 ,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是“01000001B,显示时把41H的点阵字符显示出来,就可以看到字符“A”。
常用的方法是 写完数据显示地址后 直接写入字符串 “A”,其实直接写入0x41也可以显示“A”;
1602中有这样几个区:
CGRAM 区为用户自定义字符区  
DDRAM 为字符显示地址(位置)数据存贮器
CGROM为 液晶模块内部字符发生存储器
使用1602显示汉字 就需要是用到 CGRAM,需要将取模后的点阵字符写入CGRAM ,以备后面读出显示。
1602 使用的显示点阵大小是 5*8 ,可以使用取模软件获得文字的点阵显示字符,但是点阵大小最小为8*8, 要取得5*8的字模 只需要空出前三列即可。

将生成的点阵数组保存到CGRAM存储器中,生成自定义字符。1602内部CGRAM用于自定义的字符点阵的存储,总共64字节。由上一步点阵提取可知,每一个字符由8个字节数据组成。所以64字节CGRAM存储器,能够存储8组自定义字符的点阵数组。
按照CGRAM地址划分为 0-7为第一组,8-15为第二组,依次类推56-63为第8组数据。
把自定义字符的数组按8个字节一组存储到CGRAM中。
自定义字符存储到CGRAM的任意一组以后,每一个组(8个字节)也有一个显示编码。按顺序依次为00H-07H 。显示时,只要调用每一组的编码,即可以显示相应的字符。
注:内部常用字符显示时,显示编码是从0x20开始的。0x00-0x0f是专门留给自定义字符显示的。0x00-0x07和0x08-0x0f内容是一样的。例如:调用0x01 位置和0x09位置,显示的内容是一样的。
1602显示"你好":
51单片机的默认是将变量定义在直接寻址data区,这个区域是片内RAM的低128字节,所以存储的空间有限,所以编程时可以把一些变量编译在 间接寻址的idata区(52是80H~0FFH区域)或者 64 程序存储器 code 区中。
LCD1602显示程序代码:
01#include <reg52.h>
02#include "lcd1602.h"
03 
04#define uchar unsigned  char     // 宏定义uchar 为无符号字符
05#define uint  unsigned  int 
06 
07uchar idata words[4][8] = {
08                    { 0x01,0x02,0x06,0x02,0x02,0x02,0x02,0x00},    //你字左边
09                    { 0x08,0x0F,0x15,0x04,0x15,0x15,0x04,0x0C},    //你字右边
10                    { 0x00,0x04,0x1F,0x0A,0x04,0x0A,0x00,0x00},    //好字左边
11                    { 0x1E,0x02,0x04,0x1F,0x04,0x04,0x0C,0x00}     //好字右边
12                };
13 
14void main()
15{      
16    uchar i;       
17 
18    LCD_Init();
19     
20    for(i=0;i<4;i++)
21    {
22        LCD_CGRAM_WriteByte(words[i],i);
23        LCD_WriteByte(0x80+i,0);
24        LCD_WriteByte(i,1);
25    }
26         
27    LCD_WriteString("Wrold !!",2);
28 
29 
30    /******这样也可以显示“A”
31 
32    LCD_WriteByte(0xCA,0);           
33    LCD_WriteByte(0x41,1);
34 
35    ***********/
36    while(1);
37 
38}
lcd1602.h :
001#define uchar unsigned  char     // 宏定义uchar 为无符号字符
002#define uint  unsigned  int 
003 
004#define DataPin P0
005 
006sbit  LCD_RS = P2^4;    //  LCD 数据/ 命令选择 ,高电平时选择数据寄存器
007sbit  LCD_RW = P2^5;    //  LCD 读 / 写选择    ,高电平时读操作
008sbit  LCD_E  = P2^6;    //  LCD 使能
009sbit  IR_DQ  = P2^3;    //  红外接收头数据线
010 
011void  LCD_BusyCheck(void);
012void  LCD_WriteByte(uchar var,bit RS);
013void  LCD_Init(void);
014void  LCD_WriteString(uchar *str,uchar line);
015void  LCD_CGRAM_WriteByte(uchar *p,uchar num);
016void  LCD_Delay(uint n);
017 
018void LCD_Delay(uint n)
019{
020    while(--n);             // 8us一次
021}
022 
023void LCD_BusyCheck(void)
024{
025    uchar isBusy;
026 
027    LCD_RS = 0;
028    LCD_RW = 1;
029 
030    LCD_E  = 1;
031    LCD_Delay(10);
032    isBusy = DataPin & 0x80;    
033    LCD_E  = 0;
034 
035    if(isBusy == 0x80)
036    {
037        LCD_BusyCheck();
038    }
039}
040 
041void LCD_WriteByte(uchar var,bit RS )      //参数 RS为 LCD数据/ 命令选择 ,高电平时选择数据寄存器
042{
043    LCD_BusyCheck();
044      
045    LCD_RS = RS;
046    LCD_RW = 0;
047    DataPin = var;
048 
049    LCD_E = 0;
050    LCD_Delay(70);                    //必须延时500us左右    
051    LCD_E  = 1;
052    LCD_Delay(5);
053    LCD_E = 0;
054 
055}
056 
057void LCD_WriteString(uchar *str,uchar line)
058{
059    uchar i = 0,addr;
060 
061    if(line == 1) { addr = 0x80;}
062    if(line == 2) { addr = 0xC0;}
063 
064    while(1)       
065    {          
066        LCD_WriteByte(addr+i,0);       //写入地址
067        LCD_WriteByte(str[i],1);
068        i++;
069        if(i==16 || str[i] == '\0'){ break;}
070    }          
071}
072 
073void LCD_CGRAM_WriteByte(uchar *p,uchar num)           //将自定义字符写入CGRAM中,最多64字节,uchar num为自定义字符存放位置 0-7
074{
075    uchar i,place;
076 
077    place = 0x40 + 8*(num&0x07);                    // num&0x07 保证num取值范围为 0-7
078 
079    for(i=0;i<8;i++)
080    {
081        LCD_WriteByte(place+i,0);      
082        LCD_WriteByte(p[i],1);
083    }
084}
085 
086 
087void LCD_Init(void)
088{
089    LCD_Delay(1875);            //延时15ms
090 
091    LCD_WriteByte(0x38,0);
092 
093    LCD_Delay(625);             //延时5ms
094 
095 
096    LCD_WriteByte(0x38,0);  //配置LCD为4位数据总线,双行显示,5*7点阵字符
097 
098    LCD_WriteByte(0x08,0);  //配置LCD关闭显示,无光标,无闪烁
099 
100    LCD_WriteByte(0x01,0);  //LCD清屏
101 
102    LCD_WriteByte(0x06,0);  //LCD光标右移
103 
104    LCD_WriteByte(0x0C,0);  //打开LCD显示
105 
106}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
51入门系列教程| 华丽的显示(LCD篇)
晨辉教你轻松学51--------液晶篇(1602)
LCD1602液晶显示完全资料
LCD1602显示中文汉字
一、常用液晶的使用之LCD1602显示自定义字符及汉字
LCD1602的单片机驱动详解
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服