Library ieee; Use ieee.std_logic_1164.all; Use ieee.std_logic_unsigned.all; Entity LCD1602 is Port(clk,CR:in std_logic; RW,EN,RS:out std_logic; Qdata:out std_logic_vector(7 downto 0)); end; Architecture LCD of LCD1602 is signal Qfp:integer range 0 to 4999999; signal cp:std_logic; begin process(clk,CR) begin if CR='0' then Qfp<=0; cp<='0'; elsif clk'event and clk='1' then Qfp<=Qfp+1; if Qfp=0 then cp<=not cp; end if; end if; end process; RW<='0'; EN<=cp; process(cp) variable cnt:integer range 0 to 37; begin if CR='0' then cnt:=0; Qdata<="00000001"; elsif cp'event and cp='1' then cnt:=cnt+1; end if; case cnt is -------Init LCD1602----------- when 0 =>RS<='0';Qdata<="00111000"; --0x38, when 1 =>RS<='0';Qdata<="00001100"; --0x0C when 2 =>RS<='0';Qdata<="00000001"; --0x01 when 3 =>RS<='0';Qdata<="00000110"; --0x60 ---------------------------------- when 4 =>RS<='0';Qdata<="10000000"; --display,0x00+0x80,1h1w -------data display------------- when 5=>RS<='1';Qdata<="10100000";--空格 when 6=>RS<='1';Qdata<="10100000";--空格 when 7=>RS<='1';Qdata<="10100000";--空格 when 8=>RS<='1';Qdata<="01011001"; --Y when 9=>RS<='1';Qdata<="01110101";--u when 10=>RS<='1';Qdata<="01101010";--j when 11=>RS<='1';Qdata<="01101001";--i when 12=>RS<='1';Qdata<="01100001";--a when 13=>RS<='1';Qdata<="01101110";--n when 14=>RS<='1';Qdata<="01110001";--q when 15=>RS<='1';Qdata<="01110101";--u when 16=>RS<='1';Qdata<="01100001";--a when 17=>RS<='1';Qdata<="01101110";--n when 18=>RS<='1';Qdata<="10100000";---空格 when 19=>RS<='1';Qdata<="10100000";---空格 when 20=>RS<='1';Qdata<="10100000";---空格 --------------------------- when 21=>RS<='0';Qdata<="11000000";--设定显示的位置在10H+80H, ---------------------------- when 22=>RS<='1';Qdata<="01000100";---D diangong xueyuan when 23=>RS<='1';Qdata<="01101001";---i when 24=>RS<='1';Qdata<="01100001";---a when 25=>RS<='1';Qdata<="01101110";---n when 26=>RS<='1';Qdata<="01100111";---g when 27=>RS<='1';Qdata<="01101111";---o when 28=>RS<='1';Qdata<="01101110";--n when 29=>RS<='1';Qdata<="01100111";---g when 30=>RS<='1';Qdata<="10100000";--- 空格 when 31=>RS<='1';Qdata<="01011000";---X when 32=>RS<='1';Qdata<="01110101";---u when 33=>RS<='1';Qdata<="01100101";---e when 34=>RS<='1';Qdata<="01111001";---y when 35=>RS<='1';Qdata<="01110101";---u when 36=>RS<='1';Qdata<="01100001";---a when 37=>RS<='1';Qdata<="01101110";---n end case; end process; end; LCD1602显示自定义字符或汉字
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.std_logic_unsigned.all;
Use ieee.std_logic_arith.all;
Entity LCD1602 is
Port(clk,CR:in std_logic;
RW,EN,RS:out std_logic;
Qdata:out std_logic_vector(7 downto 0));
end;
Architecture LCD of LCD1602 is
signal Qfp:integer range 0 to 499999;
signal cp:std_logic;
Type GCROM is array(0 to 63)of std_logic_vector(7 downto 0);
constant xx:GCROM:=(
X"00",X"00",X"00",X"1F",X"00",X"00",X"00",X"00",--一
X"00",X"00",X"0E",X"00",X"1F",X"00",X"00",X"00",--二
X"00",X"1F",X"00",X"0E",X"00",X"1F",X"00",X"00",--//三
X"02",X"04",X"0F",X"12",X"0F",X"0A",X"1F",X"02",--//年
X"0F",X"09",X"0F",X"09",X"0F",X"09",X"09",X"11",--//月
X"1F",X"11",X"11",X"1F",X"11",X"11",X"1F",X"00",--//日
X"00",X"00",X"00",X"0A",X"15",X"0A",X"04",X"00",--//心型
X"00",X"04",X"15",X"0E",X"1F",X"0E",X"11",X"00"
);
constant yy:GCROM:=(
"01000000","01000001","01000010","01000011", "01000100","01000101","01000110","01000111",
"01001000","01001001","01001010","01001011", "01001100","01001101","01001110","01001111",
"01010000","01010001","01010010","01010011", "01010100","01010101","01010110","01010111",
"01011000","01011001","01011010","01011011", "01011100","01011101","01011110","01011111", "01100000","01100001","01100010","01100011", "01100100","01100101","01100110","01100111",
"01101000","01101001","01101010","01101011", "01101100","01101101","01101110","01101111",
"01110000","01110001","01110010","01110011", "01110100","01110101","01110110","01110111",
"01111000","01111001","01111010","01111011", "01111100","01111101","01111110","01111111"
);
begin
process(clk,CR)
begin
if CR='0' then
Qfp<=0;
cp<='0';
elsif clk'event and clk='1' then
Qfp<=Qfp+1;
if Qfp=0 then
cp<=not cp;
end if;
end if;
end process;
RW<='0';
EN<=cp;
process(cp)
variable cnt:integer range 0 to 195;
begin
if CR='0' then
cnt:=0;
Qdata<="00000001";
elsif cp'event and cp='1' then
cnt:=cnt+1;
end if;
case cnt is
when 0=>RS<='0';Qdata<="01000000";
when 1=>RS<='1';Qdata<=xx(cnt-1);
when 2=>RS<='0';Qdata<="01000001";
when 3=>RS<='1';Qdata<=xx(cnt-2);
when 4=>RS<='0';Qdata<="01000010";
when 5=>RS<='1';Qdata<=xx(cnt-3);
when 6=>RS<='0';Qdata<="01000011";
when 7=>RS<='1';Qdata<=xx(cnt-4);
when 8=>RS<='0';Qdata<="01000100";
when 9=>RS<='1';Qdata<=xx(cnt-5);
when 10=>RS<='0';Qdata<="01000101";
when 11=>RS<='1';Qdata<=xx(cnt-6);
when 12=>RS<='0';Qdata<="01000110";
when 13=>RS<='1';Qdata<=xx(cnt-7);
when 14=>RS<='0';Qdata<="01000111";
when 15=>RS<='1';Qdata<=xx(cnt-8);
when 16=>RS<='0';Qdata<="01001000";
when 17=>RS<='1';Qdata<=xx(cnt-9);
when 18=>RS<='0';Qdata<="01001001";
when 19=>RS<='1';Qdata<=xx(cnt-10);
when 20=>RS<='0';Qdata<="01001010";
when 21=>RS<='1';Qdata<=xx(cnt-11);
when 22=>RS<='0';Qdata<="01001011";
when 23=>RS<='1';Qdata<=xx(cnt-12);
when 24=>RS<='0';Qdata<="01001100";
when 25=>RS<='1';Qdata<=xx(cnt-13);
when 26=>RS<='0';Qdata<="01001101";
when 27=>RS<='1';Qdata<=xx(cnt-14);
when 28=>RS<='0';Qdata<="01001110";
when 29=>RS<='1';Qdata<=xx(cnt-15);
when 30=>RS<='0';Qdata<="01001111";
when 31=>RS<='1';Qdata<=xx(cnt-16);
--------------
when 32=>RS<='0';Qdata<="01010000";
when 33=>RS<='1';Qdata<=xx(cnt-17);
when 34=>RS<='0';Qdata<="01010001";
when 35=>RS<='1';Qdata<=xx(cnt-18);
when 36=>RS<='0';Qdata<="01010010";
when 37=>RS<='1';Qdata<=xx(cnt-19);
when 38=>RS<='0';Qdata<="01010011";
when 39=>RS<='1';Qdata<=xx(cnt-20);
when 40=>RS<='0';Qdata<="01010100";
when 41=>RS<='1';Qdata<=xx(cnt-21);
when 42=>RS<='0';Qdata<="01010101";
when 43=>RS<='1';Qdata<=xx(cnt-22);
when 44=>RS<='0';Qdata<="01010110";
when 45=>RS<='1';Qdata<=xx(cnt-23);
when 46=>RS<='0';Qdata<="01010111";
when 47=>RS<='1';Qdata<=xx(cnt-24);
when 48=>RS<='0';Qdata<="01011000";
when 49=>RS<='1';Qdata<=xx(cnt-25);
when 50=>RS<='0';Qdata<="01011001";
when 51=>RS<='1';Qdata<=xx(cnt-26);
when 52=>RS<='0';Qdata<="01011010";
when 53=>RS<='1';Qdata<=xx(cnt-27);
when 54=>RS<='0';Qdata<="01011011";
when 55=>RS<='1';Qdata<=xx(cnt-28);
when 56=>RS<='0';Qdata<="01011100";
when 57=>RS<='1';Qdata<=xx(cnt-29);
when 58=>RS<='0';Qdata<="01011101";
when 59=>RS<='1';Qdata<=xx(cnt-30);
when 60=>RS<='0';Qdata<="01011110";
when 61=>RS<='1';Qdata<=xx(cnt-31);
when 62=>RS<='0';Qdata<="01011111";
when 63=>RS<='1';Qdata<=xx(cnt-32);
---------------------------------
when 64=>RS<='0';Qdata<="01100000";
when 65=>RS<='1';Qdata<=xx(cnt-33);
when 66=>RS<='0';Qdata<="01100001";
when 67=>RS<='1';Qdata<=xx(cnt-34);
when 68=>RS<='0';Qdata<="01100010";
when 69=>RS<='1';Qdata<=xx(cnt-35);
when 70=>RS<='0';Qdata<="01100011";
when 71=>RS<='1';Qdata<=xx(cnt-36);
when 72=>RS<='0';Qdata<="01100100";
when 73=>RS<='1';Qdata<=xx(cnt-37);
when 74=>RS<='0';Qdata<="01100101";
when 75=>RS<='1';Qdata<=xx(cnt-38);
when 76=>RS<='0';Qdata<="01100110";
when 77=>RS<='1';Qdata<=xx(cnt-39);
when 78=>RS<='0';Qdata<="01100111";
when 79=>RS<='1';Qdata<=xx(cnt-40);
when 80=>RS<='0';Qdata<="01101000";
when 81=>RS<='1';Qdata<=xx(cnt-41);
when 82=>RS<='0';Qdata<="01101001";
when 83=>RS<='1';Qdata<=xx(cnt-42);
when 84=>RS<='0';Qdata<="01101010";
when 85=>RS<='1';Qdata<=xx(cnt-43);
when 86=>RS<='0';Qdata<="01101011";
when 87=>RS<='1';Qdata<=xx(cnt-44);
when 88=>RS<='0';Qdata<="01101100";
when 89=>RS<='1';Qdata<=xx(cnt-45);
when 90=>RS<='0';Qdata<="01001101";
when 91=>RS<='1';Qdata<=xx(cnt-46);
when 92=>RS<='0';Qdata<="01101110";
when 93=>RS<='1';Qdata<=xx(cnt-47);
when 94=>RS<='0';Qdata<="01101111";
when 95=>RS<='1';Qdata<=xx(cnt-48);
--------------
when 96=>RS<='0';Qdata<="01110000";
when 97=>RS<='1';Qdata<=xx(cnt-49);
when 98=>RS<='0';Qdata<="01110001";
when 99=>RS<='1';Qdata<=xx(cnt-50);
when 100=>RS<='0';Qdata<="01110010";
when 101=>RS<='1';Qdata<=xx(cnt-51);
when 102=>RS<='0';Qdata<="01110011";
when 103=>RS<='1';Qdata<=xx(cnt-52);
when 104=>RS<='0';Qdata<="01010100";
when 105=>RS<='1';Qdata<=xx(cnt-53);
when 106=>RS<='0';Qdata<="01110101";
when 107=>RS<='1';Qdata<=xx(cnt-54);
when 108=>RS<='0';Qdata<="01110110";
when 109=>RS<='1';Qdata<=xx(cnt-55);
when 110=>RS<='0';Qdata<="01110111";
when 111=>RS<='1';Qdata<=xx(cnt-56);
when 112=>RS<='0';Qdata<="01111000";
when 113=>RS<='1';Qdata<=xx(cnt-57);
when 114=>RS<='0';Qdata<="01111001";
when 115=>RS<='1';Qdata<=xx(cnt-58);
when 116=>RS<='0';Qdata<="01111010";
when 117=>RS<='1';Qdata<=xx(cnt-59);
when 118=>RS<='0';Qdata<="01111011";
when 119=>RS<='1';Qdata<=xx(cnt-60);
when 120=>RS<='0';Qdata<="01111100";
when 121=>RS<='1';Qdata<=xx(cnt-61);
when 122=>RS<='0';Qdata<="01111101";
when 123=>RS<='1';Qdata<=xx(cnt-62);
when 124=>RS<='0';Qdata<="01111110";
when 125=>RS<='1';Qdata<=xx(cnt-63);
when 126=>RS<='0';Qdata<="01111111";
when 127=>RS<='1';Qdata<=xx(cnt-64); -------Init LCD1602-----------
when 128 =>RS<='0';Qdata<="00111000"; --0x38,
when 129 =>RS<='0';Qdata<="00001100"; --0x0C
when 130=>RS<='0';Qdata<="00000001"; --0x01
when 131 =>RS<='0';Qdata<="00000110"; --0x60
-------------------------------
----------------------------------
when 132 =>RS<='0';Qdata<="10000000"; --display,0x00+0x80,1h1w
-------data display-------------
when 133=>RS<='1';Qdata<="00000000";--空格
when 134=>RS<='1';Qdata<="00000001";--空格
when 135=>RS<='1';Qdata<="00000010";--空格
when 136=>RS<='1';Qdata<="00000011"; --Y
when 137=>RS<='1';Qdata<="00000100";--u
when 138=>RS<='1';Qdata<="00000101";--j
when 139=>RS<='1';Qdata<="00000110";--i
when 140=>RS<='1';Qdata<="00000111";--a
when 141=>RS<='1';Qdata<="00000000";--n
when 142=>RS<='1';Qdata<="00000001";--q
when 143=>RS<='1';Qdata<="00000010";--u
when 144=>RS<='1';Qdata<="00000100";--a
when 145=>RS<='1';Qdata<="00000110";--n
when 146=>RS<='1';Qdata<="00000111";---空格
when 147=>RS<='1';Qdata<="10100100";---空格
when 148=>RS<='1';Qdata<="10100110";---空格
---------------------------
when 149=>RS<='0';Qdata<="11000000";--设定显示的位置在10H+80H,
----------------------------
when 150=>RS<='1';Qdata<="00000111";---D diangong xueyuan
when 151=>RS<='1';Qdata<="00000110";---i
when 152=>RS<='1';Qdata<="00000101";---a
when 153=>RS<='1';Qdata<="00000100";---n
when 154=>RS<='1';Qdata<="00000011";---g
when 155=>RS<='1';Qdata<="00000010";---o
when 156=>RS<='1';Qdata<="00000001";--n
when 157=>RS<='1';Qdata<="00000000";---g
when 158=>RS<='1';Qdata<="00000000";--- 空格
when 159=>RS<='1';Qdata<="00000001";---X
when 160=>RS<='1';Qdata<="00000010";---u
when 161=>RS<='1';Qdata<="00000011";---e
when 162=>RS<='1';Qdata<="00000100";---y
when 163=>RS<='1';Qdata<="00000101";---u
when 164=>RS<='1';Qdata<="00000110";---a
when 165=>RS<='1';Qdata<="00000111";---n
--------------------------------------------
when 166 =>RS<='0';Qdata<="10000000"; --display,0x00+0x80,1h1w
-------data display-------------
when 167=>RS<='1';Qdata<="00000000";--空格
when 168=>RS<='1';Qdata<="00000001";--空格
when 169=>RS<='1';Qdata<="00000010";--空格
when 170=>RS<='1';Qdata<="00000011"; --Y
when 171=>RS<='1';Qdata<="00000100";--u
when 172=>RS<='1';Qdata<="00000101";--j
when 173=>RS<='1';Qdata<="00000110";--i
when 174=>RS<='1';Qdata<="00000111";--a
when 175=>RS<='1';Qdata<="00000000";--n
when 176=>RS<='1';Qdata<="00000001";--q
when 177=>RS<='1';Qdata<="00000010";--u
when 178=>RS<='1';Qdata<="00000011";--a
when 179=>RS<='1';Qdata<="00000100";--n
when 180=>RS<='1';Qdata<="00000101";---空格
when 181 =>RS<='1';Qdata<="00000110"; --display,0x00+0x80,1h1w
-------data display-------------
when 182=>RS<='1';Qdata<="00000000";--空格
when 183=>RS<='1';Qdata<="00000001";--空格
when 184=>RS<='1';Qdata<="00000010";--空格
when 185=>RS<='1';Qdata<="00000011"; --Y
when 186=>RS<='1';Qdata<="00000100";--u
when 187=>RS<='1';Qdata<="00000101";--j
when 188=>RS<='1';Qdata<="00000110";--i
when 189=>RS<='1';Qdata<="00000111";--a
when 190=>RS<='1';Qdata<="00000000";--n
when 191=>RS<='1';Qdata<="00000001";--q
when 192=>RS<='1';Qdata<="00000010";--u
when 193=>RS<='1';Qdata<="00000100";--a
when 194=>RS<='1';Qdata<="00000110";--n
when 195=>RS<='1';Qdata<="00000111";---空格
when others=>null;
end case;
end process;
end;
LCD1602相比大家都比较了解,但是我们一般只用来显示字符,数字。
最近在网上看许多人用LCD1602来显示汉字,觉得有趣 于是拜读了一些资料,教程,但感觉大部分相当晦涩难懂,本人认为既然是教程,就不必要相当的复杂,毕竟人家看完许久后还是不能得出实验结果~!! 接下我谈谈我得做法,保证你10分钟之内一样可以在LCD1602上显示你想显示的各种符号,汉字!!!
首先:我们要弄清楚一个概念,其实我们使用1602显示中文汉字,就是利用其内部的自定义字节空间,我们都知道LCD1602内部有一个64字节的自定义CGRAM,那么好,我们就是要利用自定义字节来达到显示汉字的效果. 我们知道一个字符占8个字节,所以在CGRAM能够存放8个字符。 也就是说,这个64字节的CGRAM是给我们提供写入数据的, 那么我们怎么把我们要的汉字写入CGRAM呢? 不要急,大家查看LCD1602的用户手册,里面提到当我们需要想CGRAM写入数据时,我们需要先写入CGRAM的地址,从手册上可知,CGRAM的地址为0x40.所以当我们要写入数据时,要先写入一条地址命令 write_com(0x040); 然后把你要写入的数据通过写数据命令写入 write_date( 你要写得数据);
做完以上步骤了,是不是LCD1602就会显示你输入的汉字呢? 不要急,以上你只是把你要显示汉字的代码存放在CGRAM里,就相当于其他常用字符一样固定在LCD里面了,如果你不把它读出来,LCD是不会显示的。。
当你把上面的步骤做完后,接下来要做的与你平常怎么使用LCD1602是一样的,只不过是LCD1602里面增加了一些你自定义的字符,汉字。
可能到这里,也许会有些疑问,既然自定义字符、汉字的代码需要我们自己输入,那么我该怎么编写这些代码,呵呵,不要着急,接下来就要用到下面这个取字模软件。。
相信有的朋友应该都用过这个软件。那么我们怎么来使用这个软件来获取代码呢?大家有没有注意到,我们的LCD1602是5*8点阵(可以数一数)。但是5*8不能提取代码,最少只能8*8,所以我们这里只用后前5列,前3列不用。。 新建图像 8*8.然后再图像里面点你要显示的字符,汉字,注意是在后5列中点,黑点表示显示,白点不显示,用鼠标左键可以切换,下面是我点得一个坦克~~
点好后,就可以产生代码了,这软件里面可以选择C51或汇编,这里选择C51。 下面的8个代码就是要产生这个字符的数据。。也就是要输入到自定义字符CGRAM里面的 。
好的,怎么把获取汉字代码,怎么把代码输入到CGRAM里面都知道了, 下面就是要把我们的自定义汉字、字符显示在LCD1602屏幕上了。。 我们知道常用字符是从0x20开始显示,而0x00—0x0f都是没有用的,其实这个正式为我们自定义显示字符准备的。当你把上面的代码输入到CGRAM中,LCD1602机会把汉字或字符赋予地址,这个地址是从0x00开始,因为最多只能8个字符,所以当在CGRAM里面输入8个字符代码时,这8个字符的代码的数据地址就是0x00开始到0x07。 所以当你要在LCD1602上显示自定义字符时,只需要把这个地址用数据输入就OK。 Write_date(0x00—0x07); 也就是说现在你要显示自定义字符和你显示常用字符一样的做法了,先写地址,然后写数据 自定义字符的数据就是0x00—0x07。也就是你自定义的8个字符。 这里用 Proteus 仿真软件演示
附程序
编写时间:2011-11-25 功能:LCD显示自定义字符、汉字 - #include"reg52.h"
-
- #define uchar unsigned char
- #define uint unsigned int
-
- sbit lcdrs=P2^4;
- sbit lcdrw=P2^5;
- sbit lcden=P2^6;
-
- uchar code table[]={
- 0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x00,//一
- 0x00,0x00,0x0E,0x00,0x1F,0x00,0x00,0x00,//二
- 0x00,0x1F,0x00,0x0E,0x00,0x1F,0x00,0x00,//三
- 0x02,0x04,0x0F,0x12,0x0F,0x0A,0x1F,0x02,//年
- 0x0F,0x09,0x0F,0x09,0x0F,0x09,0x09,0x11,//月
- 0x1F,0x11,0x11,0x1F,0x11,0x11,0x1F,0x00,//日
- 0x00,0x00,0x00,0x0A,0x15,0x0A,0x04,0x00,//心型
- 0x00,0x04,0x15,0x0E,0x1F,0x0E,0x11,0x00//坦克
- };
- uchar code table1[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07}; //自定义字符数据地址
- uchar code table2[]="QQ:598852247";
- /******************************
- ms延时函数
- ******************************/
- void delay(uchar z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=122;y>0;y--);
- }
- /******************************
- lcd1602写命令函数
- ******************************/
- void write_cmd(uchar cmd)
- {
- lcdrs=0;
- lcdrw=0; //选择指令寄存器
- lcden=1;
- P0=cmd; //写了命令
- delay(5);
- lcden=0; //使能拉低
- lcden=1;
- }
- /******************************
- lcd1602写数据函数
- ******************************/
- void write_date(uchar date)
- {
- lcdrs=1;
- lcdrw=0; //选择数据寄存器
- lcden=1;
- P0=date; //写了命令
- delay(5);
- lcden=0; //使能拉低
- lcden=1;
- }
- /******************************
- lcd1602初始化
- ******************************/
- void init_lcd1602()
- {
- write_cmd(0x01); //清屏
- write_cmd(0x38); //功能设置
- write_cmd(0x0c); //显示设置
- write_cmd(0x06); //输入方式从左到右
- delay(1);
- }
- /******************************
- 主函数
- ******************************/
- void main()
- {
- uchar i;
- init_lcd1602();
- delay(1);
-
- while(1)
- {
- write_cmd(0x40); //开始写入你要显示的自定义字符、汉字代码
- for(i=0;i<64;i++)
- {
- write_date(table[i]);
- delay(5);
- }
- write_cmd(0x80); //从第一行第一列开始显示
- for(i=0;i<8;i++) //显示自定义字符
- {
- write_date(table1[i]);
- delay(5);
- }
- write_cmd(0xc0); //显示QQ:598852247
- for(i=0;i<12;i++)
- {
- write_date(table2[i]);
- delay(5);
- }
- }
- }
复制代码
|