51單片機(jī)驅(qū)動(dòng)LCD1602程序設(shè)計(jì)(C語言)_第1頁
51單片機(jī)驅(qū)動(dòng)LCD1602程序設(shè)計(jì)(C語言)_第2頁
51單片機(jī)驅(qū)動(dòng)LCD1602程序設(shè)計(jì)(C語言)_第3頁
51單片機(jī)驅(qū)動(dòng)LCD1602程序設(shè)計(jì)(C語言)_第4頁
51單片機(jī)驅(qū)動(dòng)LCD1602程序設(shè)計(jì)(C語言)_第5頁
已閱讀5頁,還剩78頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、51單片機(jī)驅(qū)動(dòng)LCD1 602程序設(shè)計(jì)(C語言)字符液晶絕大多數(shù)是基于HD44780液晶芯片的,控制原理是完全相同的,因此HD44780寫 的控制程序可以很方便地應(yīng)用于市面上大部分的字符型液晶。字符型LCD通常有14條引腳線或 16條引腳線的LCD,多出來的2條線是背光電源線VCC(15腳)和地線GND(16腳),其控制原理 與14腳的LCD完全一樣,定義如下表所示:字符型LCD的引腳定義引腳號引腳名電平輸入/輸出作用1Uss電源地2Ucc電源(+SU)3Uee對比調(diào)整電壓4RS0/1輸入1 齬入數(shù)據(jù)5R/W0/1輸入A向LCD寫入指今或數(shù)據(jù) "從LCD讀取信壷6E1 ,1-*0輸入

2、使能信號,H吋誘取信息. 下降沿)執(zhí)希指令7DBG0/1輸入/輸出數(shù)據(jù)總線line 0(最低位)8DBH0/1輸入/輸出數(shù)據(jù)總線丄inR9DB20/1輸入/輸出數(shù)據(jù)總線丄5E21 0DB30/1輸入/輸出數(shù)據(jù)總線"ne3110/1輸入/輸出數(shù)據(jù)總線丄in*12DBS0/1輸入/輸出數(shù)據(jù) Saline?13DB60/1輸入/輸出數(shù)據(jù)總線丄5"DB70/1輸入/輸出數(shù)據(jù)總線line?(最高位)15A*UccLCD背光電源正極16K接地LCD背光電源負(fù)極HD44780內(nèi)置了 DDRAM. CGROM和CGRAMc DDRAM就是顯示數(shù)據(jù)RAM,用來寄存待顯示的字符代碼。共80個(gè)字

3、節(jié),其地址和屏幕的對應(yīng)關(guān)系如下表:顯示位置123*56740DDRAM笫一行09H01H02H03H04H05H06 H27H地址第二行49HU2H43HU5HA6H67H也就是說想要在LCD1602屏幕的第一行第一列顯示一個(gè)”A”字,就要向DDRAM的00H地址寫入“A”字的代碼就行了。但具體的寫入是要按LCD模塊的指令格式來進(jìn)行的。在1602中我們用前16個(gè)就行了。第二行也一樣用前16個(gè)地址。對應(yīng)如下:40H 41H 42H 43H iplH 45H 46H *l7H 48H U9H 4fiH 4BH 卻CH 4DH 4EH >lFH來 1 2 3 4 5 6 7 8 9101112

4、13141516OxCO0x800x8F文本文件中每一個(gè)字符都是用一個(gè)字節(jié)的代碼記錄的。一個(gè)漢字是用兩個(gè)字節(jié)的代碼記錄。在PC上我們只要打開文本文件就能在屏幕上看到對應(yīng)的字符是因?yàn)樵诓僮飨到y(tǒng)里和BIOS里都固化有字符字模。什么是字模?就代表了是在點(diǎn)陣屏幕上點(diǎn)亮和熄滅的信息數(shù)據(jù)。例如“A”字的字模:011100.010001BOOOB10001ooo.10001BOOOB11111這一組數(shù)據(jù)送到顯卡去點(diǎn)亮屏幕上相應(yīng)的點(diǎn),你就看到“A”這個(gè)字了。剛才說了想要在LCD1602屏幕的第一行第一列顯示一個(gè)”A”字,就要向DDRAM的00H地址 寫入“A”字的代碼41H就行了,可41H這一個(gè)字節(jié)的代碼如何

5、才能讓LCD模塊在屏幕的陣點(diǎn)上顯 示“A”字呢?同樣,在LCD模塊上也固化了字模存儲器,這就是CGROM和CGRAM。HD44780 內(nèi)置了 192個(gè)常用字符的字模,存丁字符產(chǎn)生器CGROM(Character Generator ROM)中,另外還 有8個(gè)允許用戶白定義的字符產(chǎn)生RAM,稱為CGRAM(Character Generator RAM)O下圖說明了CGROM和CGRAM與字符的對應(yīng)關(guān)系。UGFOd中字符碼與字字符字模關(guān)系對照表00000001001000110100010101100111100110101011110011011110xxxxOODO& oTRrxxx

6、xOODI! HIHIQIaHn|7|axxxxOOIOXX3CXO011xxxxOIDDxxxxOl 01xxxxOIIOxxxx0111 xxxx 10CM)wmxxxx1OD1-|2|B|R|b|r| #|3|C|S|c|s| *|4|D|T|d|t|&|6|F|U|m|7 |7|G|W|-gjw|CISIHIXIhlxl>l9IHV|i|y|引劃二曰Id-IISIUI-r曰F.ML尸xxxx1010xxxx1011+ l= IJIZUIs +rrrKTOFPcinii'iinjTrlVUzlnFxxxxllCM)xxxxl 1D1.KIL|¥|1|I一

7、I=iitom r?xxxx1110.l>INrin|XX3CX1111x|?|0|_|oKI-y|u|7?|n o1111£«U£HX=FT=iRIwen.匸 aLO.pi:ogT:a.mfa.iiuomblog, lluwentao . net從上圖可以看出,“A”字的對應(yīng)上面高位代碼為0100,對應(yīng)左邊低位代碼為0001,合起來就 是01000001,也就是41Ho可見它的代碼與我們PC中的字符代碼是基本一致的。因此我們在向 DDRAM寫C51字符代碼程字時(shí)共至可以直接用P1 =7V這樣的方法。PC在編譯時(shí)就把“A”先轉(zhuǎn)為 41H代碼了。字符代碼0x0

8、0OxOF為用戶口定義的字符圖形RAM(對于5X8點(diǎn)陣的字符,可以存放8組, 5X10點(diǎn)陣的字符,存放4組),就是CGRAM 了。后面我會(huì)詳細(xì)說的。0x200x7F為標(biāo)準(zhǔn)的ASCII碼,0xA0OxFF為日文字符和希臘文字符,其余字符碼(0x10 0x1 F及0x800x9F)沒有定義。那么如何對DDRAM的內(nèi)容和地址進(jìn)行具體操作呢,下面先說說HD44780的指令集及其設(shè)置說明,請瀏覽該指令集,并找出對DDRAM的內(nèi)容和地址進(jìn)行操作的指令。共"條指令:1淸屏指令指令功能拒令編碼/nsRSR/VDB7DB6DB5DB4DB3DB2DB1DB000000000011.6i*功能:清除液晶

9、顯示器,即將DDRAM的內(nèi)容全部填入”空白,的ASCII碼20H;2光標(biāo)歸位,即將光標(biāo)撤回液晶顯示屏的左上方;AC1 -2.湖利I位指令指令功能拒令編羽/nsRSR/WDB7DB6DB5DB4DB3DB2DB1DB0光標(biāo)歸位000000001X1.64功能:1把光標(biāo)撤回到顯示器的左上方;2把地址計(jì)數(shù)器(AC)的值設(shè)置為0;3保持DDRAM的內(nèi)容不變。3.進(jìn)入模式設(shè)置指令指令功能扌旨令編碼/U5RSR/WDB7DB6DBSDB4DB3DB2DB1DB0進(jìn)入模式設(shè)置00000001I/OS40功能:設(shè)定每次定入1位數(shù)據(jù)后光標(biāo)的移位方向,并且設(shè)定每次寫入的一個(gè)字符是否移動(dòng)。參數(shù)設(shè)定的情況如下所示:位

10、名設(shè)置I/D 0二寫入新數(shù)據(jù)后光標(biāo)左移1二寫入新數(shù)據(jù)后光標(biāo)右移S 0二寫入新數(shù)據(jù)后顯示屏不移動(dòng)1二寫入新數(shù)據(jù)后顯示屏整體右移1個(gè)字符4.顯示開關(guān)控制捋令齢功能I I,讐解,離RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DBO /USD0=顯水功能關(guān)1二顯示功能開c0=無光標(biāo)B0二光標(biāo)閃爍1二光標(biāo)不閃爍5 設(shè)定顯示屏或光標(biāo)移動(dòng)方向指令.指令功能指令編碼執(zhí)斤 吋I可/U5RSR/WDB7DB6DB5DB4DB3DB2DB1DB0000001S/CR/LXX40功能:使光標(biāo)移位或使整個(gè)顯示屏幕移位。參數(shù)設(shè)定的情況如下:S/CR/L0001設(shè)定情況光標(biāo)左移1格,且AC值減1光

11、標(biāo)右移1格,且AC值加1顯示器上字符全部左移一格,但光標(biāo)不動(dòng) 顯示器上字符全部右移一格,但光標(biāo)不動(dòng)指令功能指令編碼/usRSR/WDB7DB6DB5DB4rDB3DB2DB1DB0功能設(shè)定00001DLNFXX40RIA "e功能:設(shè)定數(shù)據(jù)總線位數(shù)、顯示fML52位名設(shè)置1二數(shù)據(jù)總線為8位DL0二數(shù)據(jù)總線為4位N0二顯示1行F0=5x7點(diǎn)陣/每字符仁顯示2行1=5x10點(diǎn)陣/每字符6 功能設(shè)定指令7設(shè)定CGRAM地址指令指令功能指令編碼1/USRSR/WDB7DB6DB5DB4DB3 DB2DB1DB0設(shè)定CGRAM 地址0001CGRAM的地址(6位)40功能:設(shè)定下一個(gè)耍存入數(shù)據(jù)

12、的CGRAM的地址。8設(shè)定DDRAM地址指令指令功能擔(dān)令編碼1/USRSR/WDB7DB6DB5DB4DB3DB2DB1DB0設(shè)定DDRAM001CGRAM的地址(7位no功能:設(shè)定下一個(gè)要存入數(shù)據(jù)的CGRAM的地址。9讀取忙信號或AC地址指令.扌旨令功能扌旨令編碼/U5RSR/WDB7DB6 DB5 DB4 DB3 DB2 DB1 DBOr鸞髓號01FB也內(nèi)容(7位)40暫讀取忙碌信號BF的P指令V BL 口 功能;或指僉;當(dāng)BF=O時(shí),液晶顯示器,BF=1表示液晶顯示2讀取地址計(jì)數(shù)器(AC)的內(nèi)容。10.數(shù)據(jù)寫入DDRAM或CGRAM指令一覽拒令功能拒令編碼/usRSR/WDB7DB6DB

13、5DB4DB3DB2DB1DB0數(shù)據(jù)寫入到DDRAM或 CGRAM10要寫入的數(shù)據(jù)刃嘰40功能:將字符碼寫入DDRAM,以使液晶顯示屏顯示出相對應(yīng)的字符;2將使用者白己設(shè)計(jì)的圖形行入CGRAMo"從CGRAM或DDRAM讀出數(shù)據(jù)的指令一覽拒令功能指令編碼/usRSR/WDB7DB6DB5DB4DB3 DB2DB1DBO從CGRAM或DDRAMi真出 數(shù)據(jù)11要讀岀聚數(shù)據(jù)D7DQ40功能:讀取DDRAM或CGRAM中的內(nèi)容?;静僮鲿r(shí)序:讀狀態(tài) 輸入:RS=L, RW=H, E=H輸出:DBODB7=狀態(tài)字顯示操作的過程:首先確認(rèn)顯示的位置,即在第兒行,第兒個(gè)字符開始顯示。也就是要顯示

14、的地址,如下表所示的顯示地址。第一行的顯示地址是0x80-0x8F,第二行的顯示地址是OxCO-OxCFo例如想要在第2行,第3個(gè)位置顯示一個(gè)字符,那么地址碼就是0xC2°在編程過程中,通常編寫一個(gè)函數(shù)確定在某行某個(gè)位置顯示捱匚函數(shù)需耍行參數(shù)(y),和列參數(shù)(x)來確定顯示位置。程序參考如下設(shè)置顯示位置 * * *void LCD_set_xy( unsigned char x, unsigned char y )unsigned char address;if (0 = y) x |= 0x80; 當(dāng)要顯示第一行時(shí)地址碼+0x80; else x | = 0xC0; /在第二行顯示

15、是地址碼+ OxCO;Write_com(x); 發(fā)送地址碼 0x800x8F 或者 OxCO-OxCF其次設(shè)置要顯示的內(nèi)容,即上面提到的CGROM內(nèi)的字符編碼。如顯示“A”,將編碼41 H寫 入到液晶屏顯示即可。通常設(shè)置地址和顯示內(nèi)容用一個(gè)函數(shù)來完成。代碼參考如下:功能:按指定位置顯示一個(gè)字符/輸入:列顯示地址x(収值范fflO-15)行顯示地址y(取值范R0-1),指定字符void DisplayOneChar(unsigned char x, unsigned char y, unsigned char Data)if (0 = y) x |= 0x80; 當(dāng)要顯示第一行時(shí)地址碼+0x8

16、0;else x | = OxCO; /在第二行顯示是地址碼+ OxCO;Write_com(x); /發(fā)送地址碼Write_dat(Data); 發(fā)送要顯示的字符編碼 顯示字符“A”調(diào)用過程如下代碼:DisplayOneChar (0, 0, 0x41 );void DisplayListChar (unsigned char x,unsigned char y,unsigned char* p,unsigned char count)unsigned char i;for(i= 0;i< coun t;i+ + )if (0 = y) x |= 0x80; 當(dāng)要顯示第一行時(shí)地址碼+0

17、x80; else x | = OxCO; /在第二行顯示是地址碼+ 0xC0;Write_com(x); /發(fā)送地址碼Write_dat(*p); 發(fā)送要顯示的字符編碼P+ + ;x+ +;調(diào)用方法如下:DisplayListChar(O,O,"hello world*,11); 液晶 1602 第一行顯示Display List Char (0,1 /'www.qm ", 1 2); 液晶 1602 第二行顯示舉個(gè)實(shí)例,就在LCD1602屏幕上第一行第一列顯示個(gè)“A”字。先定義接口P2.0RSP2.1RWP2.2E# define LCD_DBP1sbitLCD

18、._RS=P2A0;sbitLCD._RW=P2A1;sbitLCD._E=P2A2;定 54 pjCj*/# define uchar unsigned char# define uint unsigned intvoid LCDnit(void);初始化函數(shù)void LCD_write_command(uchar command);/寫指令函數(shù)void LCD-write_data(uchar dat);/寫數(shù)據(jù)函數(shù)void LCD_disp_char(uchar x,uchar y,uchar dat);/在某個(gè)屏幕位置上顯示一個(gè)字符,X(016),y(12)/void LCD_chec

19、k_busy(void);/檢查忙函數(shù)。我沒用到此函數(shù),因?yàn)橥ㄟ^率極低。void delay-n40us(uint n);/延時(shí)函數(shù)/LCD_write_command(OxOc);/整體顯示,關(guān)光標(biāo),不閃爍/*/*寫指令函數(shù)"LCD_write_command(0x06);/設(shè)定輸入方式,增韁不移位LCD_write_command(0x01);/ 清除屏幕顯示delay_n40us(100);/實(shí)踐證明,用for循環(huán)200次就能可靠完成清屏指令。*void LCD_write_command(uchar dat)LCD DB=dat;LCD_RS=O;/ 指令LCD_RW=O;

20、寫入LCD_E=1; 允許LCD E=0;delay_n40us(1);/實(shí)踐證明,我的LCD1602 ±,用for循環(huán)1次就能完成普通寫指令。/*/*寫數(shù)據(jù)函 i&*LCD_RW=0; 寫入LCD_E=1; 允許LCD_E=0; delay_n40us(1);/*顯示一個(gè)字符函數(shù)*void LCD_disp_char(uchar x,uchar y,uchar dat)uchar address;if(y=1)address=0x80+x;elseaddress=OxcO+x;LCD_write_comma nd(address);LCD_write_data(dat);

21、LCD_E=O;fo循環(huán)作延時(shí),普通指令只要1次循就可完成。清屏指令LCD_RS=O;要用200次循環(huán)便能完成。LCD_RW=1;LCD_DB=0xff;LCD_E=1;while(LCD_DBA7=1);/*延時(shí)函 *void delay_n4Ous(uint n) uint i;uchar j;for(i=n;i>0;i-)for0=O;j<2;j+);在這個(gè)延時(shí)循環(huán)函數(shù)中我只做了 2次循環(huán),/實(shí)踐證明我的LCD1602上普通的指令只需1次循環(huán)就能可幕完成。/*主函數(shù)*void main(void)wniie( I);/*具體電路的制作是很簡單的,就接了兩個(gè)電阻,一個(gè)是10歐姆

22、的背光限流電阻,另一個(gè)是 2K的LCD極板電床調(diào)節(jié)電阻。這兩個(gè)電阻的阻值怎么定呢?背光比較簡單,它就相當(dāng)于在后而接 了兒個(gè)發(fā)光二極管,任何時(shí)候你只要在15、16腳串上個(gè)100歐的電位器接上電源,調(diào)節(jié)電位器, 覺得亮度合適。此時(shí)的阻值便可。LCD液晶極板驅(qū)動(dòng)電斥調(diào)節(jié)電阻的確定就稍微麻煩一點(diǎn)。在各 數(shù)據(jù)線,控制線接好關(guān)通上電源的前提下在第3腳(VEE)和地之間接一個(gè)10K的電位器。調(diào)節(jié)電位 器。當(dāng)3腳電圧高時(shí)為全亮,電壓為0時(shí)為全暗(液晶全顯示為黑塊)。你用電位器把屏幕從全暗剛好調(diào)到變亮。這時(shí)便可調(diào)試程序。待屏幕能正確顯示后再細(xì)調(diào)電位器,使對比度合適。這時(shí)的阻値便可確定,然后換成等值的固定電阻焊上

23、便可。16FLECTROIITE9Q94V-0MADE IN TAIWAN組裝后:具體電路圖:接口說明:我們從CGROM表上可以看到,在表的最左邊是一列可以允許用戶自定義的CGRAM,從上 往下看著是16個(gè),實(shí)際只有8個(gè)字節(jié)可用。它的字符碼是00000000-00000111這8個(gè)地址, 表的下面還有8個(gè)字節(jié),但因?yàn)檫@個(gè)CGRAM的字符碼規(guī)定02位為地址,3位無效,4一7全 為零。因此CGRAM的字符碼只有最后三位能用也就是8個(gè)字節(jié)了。等效為0000X111, X為無效位,最后三位為000-111共8個(gè)。如果我們要想顯示這8個(gè)用戶自定義的字符,操作方法和顯示CGROM的一樣,先設(shè)置DDRAM位

24、置,再向DDRAM寫入字符碼,例如“A”就是4伯?,F(xiàn)在我們要顯示CGRAM的第一個(gè)白定義字符,就向DDRAM寫入00000000B(00H),如果要顯示第8個(gè)就寫入00000111(08H),簡單吧!pTff快再找出來看看。9 HLI37.設(shè)定CGRA哋址擔(dān)令ZX5S*令功能指令編碼1/USRSR/WDB7DB6DB5DB4DB3DB2DB1DBO設(shè)定CGRAM地址0001CGRA啲地址(6位)40功能;設(shè)定下一個(gè)要存入數(shù)據(jù)的CGRAM的地址。從這個(gè)指令可以看出指令數(shù)據(jù)的高2位已固定是01,只有后面的6位是地址數(shù)據(jù),而這6位 中的高3位就表示這八個(gè)白定義字符,最后的3位就是字模數(shù)據(jù)的八個(gè)地址了

25、。例如第一個(gè)自定 義字符的字模地址為01000000-01000111 個(gè)地址。我們向這8個(gè)字節(jié)寫入字模數(shù)據(jù),讓它能 顯示出“°C”地址:01000000數(shù)據(jù):00010000圖示:ooooooo0100000100000110OOOOOBBO0100001000001001OOOOBOOB0100001100001000OOOOBOOO0100010000001000OOOOBOOO0100010100001001OOOOBOOB01000110010001110000011000000000ooooobbooooooooo可以通過手動(dòng)提取的方法。如下圖所示,對應(yīng)一個(gè)字符顯示區(qū)域。

26、每8個(gè)字節(jié),組成一個(gè)點(diǎn)陣數(shù)組。MLTfi十誑 制十k i&'JASCII寧符0000自圭文寧符10 10 1自走乂字待20202自臣乂寧符30303自走火寧符4040-4自塵火字待50505自定乂寧符60606自圭火字持70707自定乂寧符8OSOS自走火宇捋10909自左火寧符210OA自左義寧符31 1OB自圭火寧符41 2OC自左乂寧符51 3OD自臣丸寧持6?!?114F自左乂寧符71 5OF廣亠一.一一亠 W一terftTL_一15/xArw.eeliQme.“ET的點(diǎn)陣數(shù)組即為 0x1 f90x11,0x11,0x1 f,0x11,0x11,0x1 f,0x0000

27、0111110001000100010001000111110001000100010001001111Ox1f0x110x11Ox1f0x110x11Ox1fOOCOOOOO 0x00辛 www.ee liome.CTi)"車”字取模數(shù)組為: 0x00,OxOf,0x02,0x04,0x07,0x00,OxOf,0x00,0x1 0,0x1 e,0x 00,0x1 0,0x1 c, 0x1 0,0x1 e, 0x1 0仔儲8組自定義字符的;旳g字符點(diǎn)陣的存儲,總共64 丿詒'丈64字節(jié)CGRAM #儲器,胡 S-7W紐,8-15為第二組,WLSS字節(jié)擊組存儲到CGRAM中,

28、程片功能:將I定義了符的編碼數(shù)組與入到CGRAr輸入:自定義字符的編碼數(shù)組void Write_CGRAM(unsigned char * p)unsigned char i,j,kk;unsigned char tmp= 0x40; 操作 CGRAM 的命令碼kk=O;for(j=0;j<8;j+ + )/64字節(jié)存儲空間,可以生成8個(gè)自定義字符點(diǎn)陣for(i=0;i<8;i+ + )/ 8個(gè)字節(jié)生成1個(gè)字符點(diǎn)陣Write_com(tmp+ i);/操作 CGRAM 的命令碼 + 寫入 CGRAM 地址.Write_dat(pkk);與入數(shù)抓kk+ +;tmp + = 8;上一步

29、中,自定義字符存儲到CGRAM的任意一組以后,每一個(gè)組(8個(gè)字節(jié))也有一個(gè)顯 示編碼。按順序依次為00H-07H o顯示時(shí),只要調(diào)用每一組的編碼,即可以顯示相應(yīng)的字符。注:內(nèi)部常用字符顯示時(shí),顯示編碼是從0x20開始的。0x00-0x0f是專門留給口定義字符顯示 的。0x000x07和0x08 0x0f內(nèi)容是一樣的。例如:調(diào)用0x01位置和0x09位置,顯示的 內(nèi)容是一樣的。宜接按照單個(gè)字符的顯示方式調(diào)用顯示函數(shù),就可以顯示自定義字符了。代碼參考如下: 在第1行,第7個(gè)位置顯示自定義漢字“年”DisplayOneChar(6,0,0); /顯示”年” /CGRAM 碼 00單個(gè)和兩個(gè)點(diǎn)陣的漢字

30、顯示:圖形顯示效果:下面一段程序讓這8個(gè)自定義字符顯示出一個(gè)心的圖案:# in elude <reg51 h>unsigned char tablel =0x03,0x07,OxOf,0x1 f,0x1 f,0x1 f,0x1 f,0x1 f,0x18,0x1 E,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,Ox1f,0x1(,0x11,0x10x10x00x07,0x01,0x1 f,0x1 f,0x1 f,0x1 f, 0x1 f,0x1 c,0x18,0x00,0x1 c,0x18,0x10,0x00,0x00,0x00,0x00,0x00;/ 心圖案unsi

31、gned char table=0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00;/字符°C#define CLEARSCREEN LCD_write_command(0x01)/*定義接口*#define LCDIO P2 sbit LCD1602_RS=P3A0;sbit LCD1602 RW=P3A1;sbit LCD1602 EN=P3A2;MB廣,足 義函 *void LCD_write_comma nd(unsigned char comma nd);/寫入指令函數(shù)void LCD_write_dat(unsigned char dat);/

32、寫入數(shù)據(jù)函數(shù)void LCD_set_xy( unsigned char x, unsigned char y );/設(shè)置顯示位置函數(shù)void LCD_dsp_char( unsigned x,unsigned char y,unsigned char dat);/顯示一個(gè)字符函數(shù)void LCD_dsp_string(unsigned char X,unsigned char Y,unsigned char *s);/顯示字符串函數(shù)void LCDit(void);/初始化函數(shù)CLEARSCREEN;/clear screenLCD_write_command(0x38);/set 8 bi

33、t data transmission mode LCD_write_command(0x0c);/open display (enable led display) LCD_write_command(0x80);/set led first display address CLEARSCREEN;/clear screen*void LC D_write_com ma nd(unsigned char comma nd)LCDIO=command;LCD1602 RS=0;LCD1602 RW=0;LCD1602 EN=0;LCD1602 EN=1;delay_ nm s(10);LCDI

34、O=dat;LCD1602_RS=1;LCD1602_RW=0;LCD1602_EN=0;delay_ nms ;LCD1602_EN=1;void LCD_set_xy( unsigned char x, unsigned char y ) unsigned char address;if(y =1)address = 0x80 + x;elseaddress =0xc0+ x;LCD_write_comma nd(address);LCD_set_xy( x, y );LCD_write_dat(dat);顯示字符串函數(shù)mm*/void LCD_dsp_string(unsigned ch

35、ar X,unsigned char Y,unsigned char *s)LCD_set_xy( X, Y );while (*s)LCD_write_dat(*s);s+;*/延時(shí)void delay_nms(unsigned int n)unsigned int i=0,j=0; OLDfor (i=n;i>0;i-):for (>O;jv1O;j+);/*am主函 */void main (void)unsigned char ij,k,tmp;LCD_init();delay_ nm s(100);tmp=0x40;/設(shè)置CGRAM地址的格式字k=0;for(j=0;j&

36、lt;8;j+)for(i=0;i<8;i+)LCD_write_command(tmp+i); / 設(shè)置白定義字符的 CGRAM 地址 delay_ nms(2);LCD_write_dat(table1k); 向CGRAM寫入白定義字符表的數(shù)據(jù) k+;LCD_dsp_string(1,1,LCD TEST”);/在第一行第一列顯示“LCD TEST*LCD_dsp_string(1,2, “SUCCESSFUL”);在第二行第一列顯示 “SUCCESSFUL”for (i=0;i<4;i+)LCD_dsp_char( 12+i,1,i);/在第一行第12列位置顯示心圖案的上半部

37、 delay_ nms ;for (i=4;i<8;i+)實(shí)際效果如圖:LCD_dsp_char( 12+i-4,2,i);在第二行第12列位置顯示心圖案的下半部delay_ nm s(1);while (1);*/*LCD 1602編程實(shí)例*標(biāo)題:LCD1602滾動(dòng)顯示*Me* *描述:LCD 1602滾動(dòng)顯示,*顯示方式:* 1從左到右逐字顯示,閃動(dòng)二次,清屏。*2、再從右到左逐字顯示,閃動(dòng)二次,清屏。*3周期性地重復(fù)上述顯示方式。*:«:* * 卄*/#mclude <AT89X5 l.H>#mclude <intiins.li> tvpedef

38、unsigned char BYTE; tvpedef bit BOOL;sbit LCD_RS = P2A0;char code SST5163 _at_ 0x003b;delav(uit ms)/延時(shí)子程序mt i;while(ms)foi(i = 0; i< 250; i-H-)-nop_0;_nop_();_nop_0;_nop_0;BOOL lcd_bz()/測試LCD忙碌狀態(tài)BOOL result;LCD_RS = 0;LCD_RW = 1;LCD_EP = 1;_nop_0;_nop_0;_nop_Q;_nop_0;result = (BOOL)(P1 & 0x80

39、);LCD_EP = 0;return result;lcd_wcind(BYTE cmd) while(lcd_bz();LCD_RS = 0;LCD_RW = 0,寫入指令數(shù)據(jù)到LCDLCD_EP = 0;設(shè)定顯示位置寫入字符顯示數(shù)據(jù)到LCDPgd;0P4J;LCD_EP= 1;_nop_();_nop_0;_nop_0;_nop_0;LCD_EP = 0; lcd_pos(BYTE pos)lcd_wcnid(pos | 0x80); lcd_vdat(BYTE dat) while(lcd_bz(J);LCD_RS = 1;LCD_RW = 0;LCD.EP = 0; Pl = dat

40、;_nop_0; _nop_Q;_nop_();_nop_0;LCD_EP= 1;_nop_Q;_nop_();_nop_0; _nop_Q;LCD.EP = 0; lcd_nutOlcd_wcmd(Ox38);/LCD初始化設(shè)定/16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)顯示開,關(guān)光標(biāo)delay(l);lcd_wcmd(0x0c);lccLwciiid(Ox06);移動(dòng)|lcd_ycmd(0x01);- 清廚delay®fHLTfima m()BYTE i;lcd_mitO;/ 初始化 LCDdelay(lO);wlnle(l)lcd_wcmd(0x06);lcd_pos(0);1 = 0

41、, wlule(disli !=,0,) lcd_wdat(disl 1 );i卄;delay(30);lcd_pos(0x40);向右移動(dòng)光標(biāo)設(shè)置顯示位置為第一行的第1個(gè)字符顯示字符”Welcome TO”控制兩字之間顯示速度設(shè)置顯示位置為第二行第1個(gè)字符1 = 0;while(dis2 1 != W) lcd_wdat(dis2 1 );i卄;delay(30);delay(SOO);顯示字符” WWW.51C51.COM ”控制兩字z間顯示速度控制停留時(shí)間lcd_wcmd(0x01); delay(l);lcd_wcmd(0x04);清除LCD的顯示內(nèi)容向左移動(dòng)光標(biāo)lcd_pos(15)

42、;1 = 0;while(dis3 i != 0)設(shè)置顯示位置為第一行的第16個(gè)字符顯示字符”Welcome TO”lcd_wdat(dis3 i ); i卄;i卄;delay(30); delay(SOO);控制兩字之間顯不速度控制停留時(shí)間lcd_wcmd(0x01); delay(200);清除LCD的顯示內(nèi)容控制兩屏轉(zhuǎn)換時(shí)間*標(biāo)題:LCD 1602移動(dòng)顯示杓* *:*:*:*描述LCD 1602移動(dòng)顯示*顯示方式:* 1 > LCD 第一行顯示:llove 8051 mcu”* LCD 第二行顯示2、先將兩行字符寫入DDRAM中,然后從右至左逐字移出顯示。

43、*3>在指定位置停留1.6秒后,閃爍2次,清屏。*4.反復(fù)循環(huán)上述顯示方式。*include <AT89X51.H>#include <mtniis.li> #defliie uchai unsigned chai #define unit unsigned intsbit LCD_RS = P2A0; sbit LCD_RW = P2A1;/*延時(shí)子程序嚴(yán)嚴(yán)*”* char code SST5163 _at_ 0x003b;void delay(mt ms)int 1;while(ms-)foi(i = 0; i< 250; 1-H-)_nop_0;_no

44、p_Q;_nop_Q;_nop_0;嚴(yán)嚴(yán)檢査LCD忙狀態(tài)/*lcd_busy為1時(shí),忙,等待。lcd-busv為0時(shí),閑,可寫指令與數(shù)據(jù)。bit lcd_busyQ bit result;LCD_RS = 0;LCD_RW = 1;LCD_EN=1;_nop_Q; _nop_();_nop_0;_nop_0;嚴(yán)寫指令數(shù)據(jù)到LCD/*RS=L, RW=L,己=高脈沖,D0-D7=指令碼。void lcd_wcmd(uchai cmd) wlule(lcd_busyO); LCD_RS = 0; LCD_RW = 0; LCD_EN = 0;_nop_0;_nop_0; Pl = cmd;_nop_0;_nop_0;_nop_Q;_nop_0;LCD_EN=1;_nop_0;_nop_Q;_nop_0;_n

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論