LCD1602液晶顯示漢字
使用LCD1602 顯示字符會(huì)比使用七段數(shù)碼管方便 可顯示內(nèi)容也多的多 1602內(nèi)部的字符發(fā)生器 CGROM中已經(jīng)存儲(chǔ)了160多個(gè)字符 ,每一個(gè)字符都有一個(gè)固定的代碼,比如大寫的英文字母“A”的代碼是“01000001B,顯示時(shí)把41H的點(diǎn)陣字符顯示出來,就可以看到字符“A”。
常用的方法是 寫完數(shù)據(jù)顯示地址后 直接寫入字符串 “A”,其實(shí)直接寫入0x41也可以顯示“A”;
1602中有這樣幾個(gè)區(qū):
CGRAM 區(qū)為用戶自定義字符區(qū)
DDRAM 為字符顯示地址(位置)數(shù)據(jù)存貯器
CGROM為 液晶模塊內(nèi)部字符發(fā)生存儲(chǔ)器
使用1602顯示漢字 就需要是用到 CGRAM,需要將取模后的點(diǎn)陣字符寫入CGRAM ,以備后面讀出顯示。
1602 使用的顯示點(diǎn)陣大小是 5*8 ,可以使用取模軟件獲得文字的點(diǎn)陣顯示字符,但是點(diǎn)陣大小最小為8*8, 要取得5*8的字模 只需要空出前三列即可。
將生成的點(diǎn)陣數(shù)組保存到CGRAM存儲(chǔ)器中,生成自定義字符。1602內(nèi)部CGRAM用于自定義的字符點(diǎn)陣的存儲(chǔ),總共64字節(jié)。由上一步點(diǎn)陣提取可知,每一個(gè)字符由8個(gè)字節(jié)數(shù)據(jù)組成。所以64字節(jié)CGRAM存儲(chǔ)器,能夠存儲(chǔ)8組自定義字符的點(diǎn)陣數(shù)組。
按照CGRAM地址劃分為 0-7為第一組,8-15為第二組,依次類推56-63為第8組數(shù)據(jù)。
把自定義字符的數(shù)組按8個(gè)字節(jié)一組存儲(chǔ)到CGRAM中。
自定義字符存儲(chǔ)到CGRAM的任意一組以后,每一個(gè)組(8個(gè)字節(jié))也有一個(gè)顯示編碼。按順序依次為00H-07H 。顯示時(shí),只要調(diào)用每一組的編碼,即可以顯示相應(yīng)的字符。
注:內(nèi)部常用字符顯示時(shí),顯示編碼是從0x20開始的。0x00-0x0f是專門留給自定義字符顯示的。0x00-0x07和0x08-0x0f內(nèi)容是一樣的。例如:調(diào)用0x01 位置和0x09位置,顯示的內(nèi)容是一樣的。
1602顯示"你好":
51單片機(jī)的默認(rèn)是將變量定義在直接尋址data區(qū),這個(gè)區(qū)域是片內(nèi)RAM的低128字節(jié),所以存儲(chǔ)的空間有限,所以編程時(shí)可以把一些變量編譯在 間接尋址的idata區(qū)(52是80H~0FFH區(qū)域)或者 64 程序存儲(chǔ)器 code 區(qū)中。
LCD1602顯示程序代碼:
#include#include"lcd1602.h"#defineucharunsignedchar//宏定義uchar為無符號(hào)字符#defineuintunsignedintucharidatawords[4][8]={{0x01,0x02,0x06,0x02,0x02,0x02,0x02,0x00},//你字左邊{0x08,0x0F,0x15,0x04,0x15,0x15,0x04,0x0C},//你字右邊{0x00,0x04,0x1F,0x0A,0x04,0x0A,0x00,0x00},//好字左邊{0x1E,0x02,0x04,0x1F,0x04,0x04,0x0C,0x00}//好字右邊};voidmain(){uchari;LCD_Init();for(i=0;i<4;i++){LCD_CGRAM_WriteByte(words[i],i);LCD_WriteByte(0x80+i,0);LCD_WriteByte(i,1);}LCD_WriteString("Wrold!!",2);/******這樣也可以顯示“A”LCD_WriteByte(0xCA,0);LCD_WriteByte(0x41,1);***********/while(1);}
lcd1602.h :
#defineucharunsignedchar//宏定義uchar為無符號(hào)字符#defineuintunsignedint#defineDataPinP0sbitLCD_RS=P2^4;//LCD數(shù)據(jù)/命令選擇,高電平時(shí)選擇數(shù)據(jù)寄存器sbitLCD_RW=P2^5;//LCD讀/寫選擇,高電平時(shí)讀操作sbitLCD_E=P2^6;//LCD使能sbitIR_DQ=P2^3;//紅外接收頭數(shù)據(jù)線voidLCD_BusyCheck(void);voidLCD_WriteByte(ucharvar,bitRS);voidLCD_Init(void);voidLCD_WriteString(uchar*str,ucharline);voidLCD_CGRAM_WriteByte(uchar*p,ucharnum);voidLCD_Delay(uintn);voidLCD_Delay(uintn){while(--n);//8us一次}voidLCD_BusyCheck(void){ucharisBusy;LCD_RS=0;LCD_RW=1;LCD_E=1;LCD_Delay(10);isBusy=DataPin&0x80;LCD_E=0;if(isBusy==0x80){LCD_BusyCheck();}}voidLCD_WriteByte(ucharvar,bitRS)//參數(shù)RS為L(zhǎng)CD數(shù)據(jù)/命令選擇,高電平時(shí)選擇數(shù)據(jù)寄存器{LCD_BusyCheck();LCD_RS=RS;LCD_RW=0;DataPin=var;LCD_E=0;LCD_Delay(70);//必須延時(shí)500us左右LCD_E=1;LCD_Delay(5);LCD_E=0;}voidLCD_WriteString(uchar*str,ucharline){uchari=0,addr;if(line==1){addr=0x80;}if(line==2){addr=0xC0;}while(1){LCD_WriteByte(addr+i,0);//寫入地址LCD_WriteByte(str[i],1);i++;if(i==16||str[i]=='