标题: LCD1602A显示图片功能 [打印本页]

作者: 海盗船    时间: 2018-7-23 21:37
标题: LCD1602A显示图片功能
最近学习51单片机学会LCD1602A显示图片功能,这里分享给大家(上传显示效果和使用说明)

#include"reg52.h"
#define uchar unsigned char
#define uint unsigned int

sbit lcdrs=P1^0;
sbit lcdrw=P1^1;
sbit lcden=P2^5;

uchar code table[]={
                         0x03,0x07,0x0f,0x1f,0x1f,0x1f,0x1f,0x1f,
                         0x18,0x1E,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,
                         0x07,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,
                         0x10,0x18,0x1c,0x1E,0x1E,0x1E,0x1E,0x1E,
                         0x0f,0x07,0x03,0x01,0x00,0x00,0x00,0x00,
                         0x1f,0x1f,0x1f,0x1f,0x1f,0x0f,0x07,0x01,
                         0x1f,0x1f,0x1f,0x1f,0x1f,0x1c,0x18,0x00,
                         0x1c,0x18,0x10,0x00,0x00,0x00,0x00,0x00
                                        };         //心形图片       
uchar code table1[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};  //自定义字符数据地址

void delay(uchar z)
{
       uint x,y;
       for(x=z;x>0;x--)
              for(y=122;y>0;y--);      
}
void write_cmd(uchar cmd)        //写命令
{
       lcdrs=0;
       lcdrw=0;   
       lcden=1;
       P0=cmd;     
       delay(5);
       lcden=0;   
       lcden=1;
}
void write_date(uchar date)         //写入数据
{
       lcdrs=1;
       lcdrw=0;   
       lcden=1;
       P0=date;   
       delay(5);
       lcden=0;   
       lcden=1;
}
void init_lcd1602()          //1602初始化
{
       write_cmd(0x01);  
       write_cmd(0x38);  
       write_cmd(0x0c);  
       write_cmd(0x06);  
       delay(1);
}
void main()
{
       uchar i;
       init_lcd1602();
       delay(1);
              write_cmd(0x40);    //开始写入你要显示的自定义字符、汉字代码
              for(i=0;i<64;i++)
              {
                     write_date(table[i]);
                     delay(5);
              }
              write_cmd(0x80);   
              for(i=0;i<4;i++)     //写入心形前一半数据
              {
                     write_date(table1[i]);  
                     delay(5);
              }
                                       write_cmd(0xc0);   
              for(i=4;i<8;i++)                      //写入心形后一半数据
              {
                     write_date(table1[i]);  
                     delay(5);
              }
                                      
       while(1);
}

微信图片_20180723213232.jpg (84.13 KB, 下载次数: 82)

微信图片_20180723213232.jpg

参考资料.doc

43.5 KB, 下载次数: 29, 下载积分: 黑币 -5


作者: wpppmlah    时间: 2019-3-13 10:23
感谢分享,谢谢楼主了.
作者: 7358655    时间: 2019-3-13 22:03
有创意,买了12864,我的那个很久没用了,顶一下。
作者: ly_zhy    时间: 2025-7-2 19:34
由创意,赞!
作者: keemee    时间: 2025-7-3 03:07
为啥是:write date,而不是write data
作者: joyb    时间: 2025-7-3 09:26
     LCD1602内部有一个64字节的自定义CGRAM,一个字符占8个字节,所以在CGRAM能够存放8个字符。
CGRAM的地址为0x40.所以当我们要写入数据时,要先写入一条地址命令 write_com(0x040);然后把你要写入的数据通过写数据命令写入  write_date( 你要写得数据);
           write_cmd(0x40);    //开始写入你要显示的自定义字符、汉字代码
              for(i=0;i<64;i++)
              {
                     write_date(table[i]);
                     delay(5);
              }
以上只是把你要显示汉字的代码存放在CGRAM里,就相当于其他常用字符一样固定在LCD里面了,如果不把它读出来,LCD是不会显示的。
      常用字符是从0x20开始显示,而0x00—0x0f都是没有用的,其实这个正式为我们自定义显示字符准备的。当你把上面的代码输入到CGRAM中,LCD1602会把汉字或字符赋与地址,这个地址是从0x00开始,因为最多只能8个字符,所以当在CGRAM里面输入8个字符代码时,这8个字符的代码的数据地址就是0x00开始到0x07。
     要显示自定义字符和显示常用字符一样的做法了,先写地址,然后写数据
自定义字符的数据就是0x00—0x07。
Write_date(0x00) — Write_date(0x07);




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1