?? 51單片機綜合學習系統之1602字符型液晶顯示篇_希希.htm
字號:
<P align=center>0</P></TD>
<TD width=35>
<P align=center>0</P></TD>
<TD width=36>
<P align=center>0</P></TD>
<TD width=35>
<P align=center>1</P></TD>
<TD width=35>
<P align=center>DL</P></TD>
<TD width=35>
<P align=center>N</P></TD>
<TD width=35>
<P align=center>F</P></TD>
<TD width=35>
<P align=center>*</P></TD>
<TD width=37>
<P align=center>*</P></TD></TR>
<TR>
<TD width=55>
<P align=center>7</P></TD>
<TD vAlign=top width=168>
<P align=left>置字符發生存貯器地址</P></TD>
<TD width=39>
<P align=center>0</P></TD>
<TD width=36>
<P align=center>0</P></TD>
<TD width=35>
<P align=center>0</P></TD>
<TD width=36>
<P align=center>1</P></TD>
<TD vAlign=top width=214 colSpan=6>
<P align=left>字符發生存貯器地址</P></TD></TR>
<TR>
<TD width=55>
<P align=center>8</P></TD>
<TD vAlign=top width=168>
<P align=left>置數據存貯器地址</P></TD>
<TD width=39>
<P align=center>0</P></TD>
<TD width=36>
<P align=center>0</P></TD>
<TD width=35>
<P align=center>1</P></TD>
<TD vAlign=top width=250 colSpan=7>
<P align=left>顯示數據存貯器地址</P></TD></TR>
<TR>
<TD width=55>
<P align=center>9</P></TD>
<TD vAlign=top width=168>
<P align=left>讀忙標志或地址</P></TD>
<TD width=39>
<P align=center>0</P></TD>
<TD width=36>
<P align=center>1</P></TD>
<TD width=35>
<P align=center>BF</P></TD>
<TD vAlign=top width=250 colSpan=7>
<P align=left>計數器地址</P></TD></TR>
<TR>
<TD width=55>
<P align=center>10</P></TD>
<TD vAlign=top width=168>
<P align=left>寫數到CGRAM或DDRAM)</P></TD>
<TD width=39>
<P align=center>1</P></TD>
<TD width=36>
<P align=center>0</P></TD>
<TD vAlign=top width=285 colSpan=8>
<P align=left>要寫的數據內容</P></TD></TR>
<TR>
<TD width=55>
<P align=center>11</P></TD>
<TD vAlign=top width=168>
<P align=left>從CGRAM或DDRAM讀數</P></TD>
<TD width=39>
<P align=center>1</P></TD>
<TD width=36>
<P align=center>1</P></TD>
<TD vAlign=top width=285 colSpan=8>
<P align=left>讀出的數據內容</P></TD></TR></TBODY></TABLE>
<P align=left> 表10-14:控制命令表</P>
<P>
1602液晶模塊的讀寫操作、屏幕和光標的操作都是通過指令編程來實現的。(說明:1為高電平、0為低電平)</P>
<P>指令1:清顯示,指令碼01H,光標復位到地址00H位置。</P>
<P>指令2:光標復位,光標返回到地址00H。</P>
<P>指令3:光標和顯示模式設置 I/D:光標移動方向,高電平右移,低電平左移
S:屏幕上所有文字是否左移或者右移。高電平表示有效,低電平則無效。</P>
<P>指令4:顯示開關控制。 D:控制整體顯示的開與關,高電平表示開顯示,低電平表示關顯示 C:控制光標的開與關,高電平表示有光標,低電平表示無光標
B:控制光標是否閃爍,高電平閃爍,低電平不閃爍。</P>
<P>指令5:光標或顯示移位 S/C:高電平時移動顯示的文字,低電平時移動光標。</P>
<P>指令6:功能設置命令 DL:高電平時為4位總線,低電平時為8位總線 N:低電平時為單行顯示,高電平時雙行顯示 F:
低電平時顯示5x7的點陣字符,高電平時顯示5x10的點陣字符。</P>
<P>指令7:字符發生器RAM地址設置。</P>
<P>指令8:DDRAM地址設置。</P>
<P>指令9:讀忙信號和光標地址 BF:為忙標志位,高電平表示忙,此時模塊不能接收命令或者數據,如果為低電平表示不忙。</P>
<P>指令10:寫數據。</P>
<P>指令11:讀數據。</P>
<P> 與HD44780相兼容的芯片時序表如下:</P>
<TABLE cellSpacing=0 cellPadding=0 border=1>
<TBODY>
<TR>
<TD vAlign=top width=67>
<P>讀狀態</P></TD>
<TD vAlign=top width=48>
<P>輸入</P></TD>
<TD vAlign=top width=264>
<P>RS=L,R/W=H,E=H</P></TD>
<TD vAlign=top width=48>
<P>輸出</P></TD>
<TD vAlign=top width=114>
<P>D0—D7=狀態字</P></TD></TR>
<TR>
<TD vAlign=top width=67>
<P>寫指令</P></TD>
<TD vAlign=top width=48>
<P>輸入</P></TD>
<TD vAlign=top width=264>
<P>RS=L,R/W=L,D0—D7=指令碼,E=高脈沖</P></TD>
<TD vAlign=top width=48>
<P>輸出</P></TD>
<TD vAlign=top width=114>
<P>無</P></TD></TR>
<TR>
<TD vAlign=top width=67>
<P>讀數據</P></TD>
<TD vAlign=top width=48>
<P>輸入</P></TD>
<TD vAlign=top width=264>
<P>RS=H,R/W=H,E=H</P></TD>
<TD vAlign=top width=48>
<P>輸出</P></TD>
<TD vAlign=top width=114>
<P>D0—D7=數據</P></TD></TR>
<TR>
<TD vAlign=top width=67>
<P>寫數據</P></TD>
<TD vAlign=top width=48>
<P>輸入</P></TD>
<TD vAlign=top width=264>
<P>RS=H,R/W=L,D0—D7=數據,E=高脈沖</P></TD>
<TD vAlign=top width=48>
<P>輸出</P></TD>
<TD vAlign=top width=114>
<P>無</P></TD></TR></TBODY></TABLE>
<P> 表10-15:基本操作時序表</P>
<P> 讀寫操作時序如圖10-55和10-56所示:</P>
<P><IMG height=250 src="51單片機綜合學習系統之1602字符型液晶顯示篇_希希.files/image128.jpg"
width=553></P>
<P align=center>圖10-55 讀操作時序</P>
<P align=left><IMG height=266
src="51單片機綜合學習系統之1602字符型液晶顯示篇_希希.files/image130.jpg" width=553></P>
<P align=center>圖10-56 寫操作時序</P>
<P><STRONG>10.8.2.4 1602LCD的RAM地址映射及標準字庫表</STRONG></P>
<P>
液晶顯示模塊是一個慢顯示器件,所以在執行每條指令之前一定要確認模塊的忙標志為低電平,表示不忙,否則此指令失效。要顯示字符時要先輸入顯示字符地址,也就是告訴模塊在哪里顯示字符,圖10-57是1602的內部顯示地址。</P>
<P><IMG height=199 src="51單片機綜合學習系統之1602字符型液晶顯示篇_希希.files/image132.jpg"
width=554></P>
<P align=center>圖10-57 1602LCD內部顯示地址</P>
<P align=left>
例如第二行第一個字符的地址是40H,那么是否直接寫入40H就可以將光標定位在第二行第一個字符的位置呢?這樣不行,因為寫入顯示地址時要求最高位D7恒定為高電平1所以實際寫入的數據應該是01000000B(40H)+10000000B(80H)=11000000B(C0H)。</P>
<P>
在對液晶模塊的初始化中要先設置其顯示模式,在液晶模塊顯示字符時光標是自動右移的,無需人工干預。每次輸入指令前都要判斷液晶模塊是否處于忙的狀態。</P>
<P align=left>
1602液晶模塊內部的字符發生存儲器(CGROM)已經存儲了160個不同的點陣字符圖形,如圖10-58所示,這些字符有:阿拉伯數字、英文字母的大小寫、常用的符號、和日文假名等,每一個字符都有一個固定的代碼,比如大寫的英文字母“A”的代碼是01000001B(41H),顯示時模塊把地址41H中的點陣字符圖形顯示出來,我們就能看到字母“A”</P>
<P align=left><IMG height=390
src="51單片機綜合學習系統之1602字符型液晶顯示篇_希希.files/image134.jpg" width=552></P>
<P align=center>圖10-58 字符代碼與圖形對應圖</P>
<P><STRONG>10.8.2.5 1602LCD的一般初始化(復位)過程</STRONG></P>
<P>延時15mS</P>
<P>寫指令38H(不檢測忙信號)</P>
<P>延時5mS</P>
<P>寫指令38H(不檢測忙信號)</P>
<P>延時5mS</P>
<P>寫指令38H(不檢測忙信號)</P>
<P>以后每次寫指令、讀/寫數據操作均需要檢測忙信號</P>
<P>寫指令38H:顯示模式設置</P>
<P>寫指令08H:顯示關閉</P>
<P>寫指令01H:顯示清屏</P>
<P>寫指令06H:顯示光標移動設置</P>
<P>寫指令0CH:顯示開及光標設置</P>
<P align=left><STRONG>10.8.3 1602LCD的軟硬件設計實例</STRONG></P>
<P align=left>
在1602LCD第一行顯示網站名:www.hificat.com在第二行顯示聯系電話:0571-85956028。實驗前應先將顯示切換開關切換到LCD工作狀態。</P>
<P align=left><IMG height=324
src="51單片機綜合學習系統之1602字符型液晶顯示篇_希希.files/image136.jpg" width=553></P>
<P align=left><IMG height=250
src="51單片機綜合學習系統之1602字符型液晶顯示篇_希希.files/image138.jpg" width=553></P>
<P align=center>圖10-59 1602LCD實驗演示圖</P>
<P align=left><STRONG>10.8.3.1 硬件原理圖</STRONG></P>
<P align=left>
1602液晶顯示模塊可以和單片機AT89C51直接接口,電路如圖10-60所示。</P>
<P align=center><IMG height=342
src="51單片機綜合學習系統之1602字符型液晶顯示篇_希希.files/image140.gif" width=489></P>
<P align=center>圖10-60 硬件原理圖</P>
<P align=left>10.8.3.2 程序流程圖</P>
<P align=center><IMG height=596
src="51單片機綜合學習系統之1602字符型液晶顯示篇_希希.files/image142.gif" width=95></P>
<P align=center>圖10-61 軟件流程圖</P>
<P align=left>10.8.3.3 軟件代碼</P>
<P>/***************************************************************************/</P>
<P>/*杭州電子&計算機工作室*/</P>
<P>/*http://www.hificat.com*/</P>
<P>/*1602LCD演示程序*/</P>
<P>/*目標器件:AT89S51*/</P>
<P>/*晶振:11.0592MHZ*/</P>
<P>/*編譯環境:Keil 7.50A*/</P>
<P>/***************************************************************************/</P>
<P>/*********************************包含頭文件********************************/</P>
<P>#include <reg51.h></P>
<P>#include <intrins.h></P>
<P>/*********************************端口定義**********************************/</P>
<P>sbit rs= P2^0;</P>
<P>sbit rw = P2^1;</P>
<P>sbit ep = P2^2;</P>
<P>/********************************顯示數據表*********************************/</P>
<P>unsigned char code dis1[] = {"www.hificat.com"};</P>
<P>unsigned char code dis2[] = {"0571-85956028"};</P>
<P>/*****************************************************************************</P>
<P>函數功能:LCD延時子程序</P>
<P>入口參數:ms</P>
<P>出口參數:</P>
<P>*****************************************************************************/</P>
<P>void delay(unsigned char ms)</P>
<P>{</P>
<P>unsigned char i;</P>
<P>while(ms--)</P>
<P>{</P>
<P>for(i = 0; i< 250; i++)</P>
<P>{</P>
<P>_nop_();</P>
<P>_nop_();</P>
<P>_nop_();</P>
<P>_nop_();</P>
<P>}</P>
<P>}</P>
<P>}</P>
<P>/*****************************************************************************</P>
<P>函數功能:測試LCD忙碌狀態</P>
<P>入口參數:</P>
<P>出口參數:result</P>
<P>*****************************************************************************/</P>
<P>bit lcd_bz()</P>
<P>{</P>
<P>bit result;</P>
<P>rs = 0;</P>
<P>rw = 1;</P>
<P>ep = 1;</P>
<P>_nop_();</P>
<P>_nop_();</P>
<P>_nop_();</P>
<P>_nop_();</P>
<P>result = (bit)(P0 & 0x80);</P>
<P>ep = 0;</P>
<P>return result;</P>
<P>}</P>
<P>/*****************************************************************************</P>
<P>函數功能:寫指令數據到LCD子程序</P>
<P>入口參數:cmd</P>
<P>出口參數:</P>
<P>*****************************************************************************/</P>
<P>void lcd_wcmd(unsigned char cmd)</P>
<P>{</P>
<P>while(lcd_bz());//判斷LCD是否忙碌</P>
<P>rs = 0;</P>
<P>rw = 0;</P>
<P>ep = 0;</P>
<P>_nop_();</P>
<P>_nop_();</P>
<P>P0 = cmd;</P>
<P>_nop_();</P>
<P>_nop_();</P>
<P>_nop_();</P>
<P>_nop_();</P>
<P>ep = 1;</P>
<P>_nop_();</P>
<P>_nop_();</P>
<P>_nop_();</P>
<P>_nop_();</P>
<P>ep = 0;</P>
<P>}</P>
<P>/*****************************************************************************</P>
<P>函數功能:設定顯示位置子程序</P>
<P>入口參數:pos</P>
<P>出口參數:</P>
<P>*****************************************************************************/</P>
<P>void lcd_pos(unsigned char pos)</P>
<P>{</P>
<P>lcd_wcmd(pos | 0x80);</P>
<P>}</P>
<P>/*****************************************************************************</P>
<P>函數功能:寫入顯示數據到LCD子程序</P>
<P>入口參數:dat</P>
<P>出口參數:</P>
<P>*****************************************************************************/</P>
<P>void lcd_wdat(unsigned char dat)</P>
<P>{</P>
<P>while(lcd_bz());//判斷LCD是否忙碌</P>
<P>rs = 1;</P>
<P>rw = 0;</P>
<P>ep = 0;</P>
<P>P0 = dat;</P>
<P>_nop_();</P>
<P>_nop_();</P>
<P>_nop_();</P>
<P>_nop_();</P>
<P>ep = 1;</P>
<P>_nop_();</P>
<P>_nop_();</P>
<P>_nop_();</P>
<P>_nop_();</P>
<P>ep = 0;</P>
<P>}</P>
<P>/*****************************************************************************</P>
<P>函數功能:LCD初始化子程序</P>
<P>入口參數:</P>
<P>出口參數:</P>
<P>*****************************************************************************/</P>
<P>void lcd_init()</P>
<P>{</P>
<P>lcd_wcmd(0x38);</P>
<P>delay(1);</P>
<P>lcd_wcmd(0x0c);</P>
<P>delay(1);</P>
<P>lcd_wcmd(0x06);</P>
<P>delay(1);</P>
<P>lcd_wcmd(0x01);</P>
<P>delay(1);</P>
<P>}</P>
<P>/*****************************************************************************</P>
<P>函數功能:主程序</P>
<P>入口參數:</P>
<P>出口參數:</P>
<P>*****************************************************************************/</P>
<P>void main(void)</P>
<P>{</P>
<P>unsigned char i;</P>
<P>lcd_init();// 初始化LCD</P>
<P>delay(10);</P>
<P>lcd_pos(0x01);//設置顯示位置</P>
<P>i = 0;</P>
<P>while(dis1[i] != '\0')</P>
<P>{</P>
<P>lcd_wdat(dis1[i]);//顯示字符</P>
<P>i++;</P>
<P>}</P>
<P>lcd_pos(0x42);// 設置顯示位置</P>
<P>i = 0;</P>
<P>while(dis2[i] != '\0')</P>
<P>{</P>
<P>lcd_wdat(dis2[i]);// 顯示字符</P>
<P>i++;</P>
<P>}</P>
<P>while(1);</P>
<P>}</P></DIV></TD></TR></TBODY></TABLE><BR>
<DIV class=opt><A title=查看該分類中所有文章
href="http://hi.baidu.com/brave_xixi/blog/category/µ¥Æ¬»ú">類別:單片機</A> | <A
title=將此文章添加到百度搜藏 onclick="return addToFavor();"
href="http://cang.baidu.com/do/add" target=_blank>添加到搜藏</A> | 瀏覽(<SPAN
id=result></SPAN>) | <A
href="http://hi.baidu.com/brave_xixi/blog/item/800b7e1f49c42966f724e445.html#send">評論</A> (5)
<SCRIPT language=javascript>/*<![CDATA[*/var pre = [true,'寫好申請書是申請成功的關鍵', '寫好申請書是申請成功的關鍵','/brave%5Fxixi/blog/item/b0ca655026a886591038c2b1.html'];var post = [true,'自制作并口ISP下載線','自制作并口ISP下載線', '/brave%5Fxixi/blog/item/258ef531ada4f41ceac4af21.html'];if(pre[0] || post[0]){ document.write('<div style="height:5px;line-height:5px;"> </div><div id="in_nav">'); if(pre[0]){ document.write('上一篇:<a href="' + pre[3] + '" title="' + pre[1] + '">' + pre[2] + '</a> ');
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -