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);
- }
- }
- }
復制代碼
|