基于AT89C51單片機鍵盤控制和LCD顯示_第1頁
基于AT89C51單片機鍵盤控制和LCD顯示_第2頁
基于AT89C51單片機鍵盤控制和LCD顯示_第3頁
基于AT89C51單片機鍵盤控制和LCD顯示_第4頁
基于AT89C51單片機鍵盤控制和LCD顯示_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、基于AT89S52單片機鍵盤控制和LCD顯示摘要:提出一種基于單片機AT89S52的鍵盤輸入和液晶顯示系統(tǒng)的原理、器件、電路和編程設(shè)計。輸入和顯示部分是單片機的外圍電路,同時也是人機交流的重要接口。從C51程序上實現(xiàn)鍵盤的消抖、按鍵識別、按鍵內(nèi)容的液晶顯示以及按鍵功能的液晶顯示。關(guān)鍵詞:AT89S52 4×4行列式鍵盤 接口電路 LCD顯示 計算器0 引言這里提出一種基于單片機的行列式鍵盤數(shù)字字符輸入系統(tǒng)設(shè)計,該系統(tǒng)設(shè)計具有電路設(shè)計簡單、成本低等特點,可運用于各種控制系統(tǒng)。液晶顯示器LCD本身不會發(fā)光,是利用外部光的反射原理進(jìn)行顯示。它是基于AT89S52單片機可以顯示16×

2、;2個字符顯示系統(tǒng)。液晶顯示功效低,顯示美觀,廣泛運用于中小型測控儀器儀表。(一)硬件電路組成及工作原理該系統(tǒng)采用AT89S52單片機為核心芯片的電路實現(xiàn),主要由AT89S52芯片、時鐘電路、復(fù)位電路、4×4行列式鍵盤電路以及16×2字符的LCD1602電路。4×4非編碼矩陣行線分別接P3.0P3.3、列線接單片機的P3.4P3.7。LCD顯示接口電路的傳送命令和數(shù)據(jù)的高8位雙向并行總線分別接于單片機的輸入輸出接口P2端口。1602使能信號E接P1.3,讀寫選擇端(RW)接P1.4,數(shù)據(jù)命令選擇端(RS)接P1.0。系統(tǒng)硬件設(shè)計框圖如圖1復(fù)位電路定時電路AT89S

3、52單片機16×21602液晶顯示電路4×4非編碼行列式矩陣 圖11 AT89S52是一種帶4kB閃爍可編程課擦除只讀存儲器的低電壓、高性能CMOS型8位微處理器,俗稱單片機。它是一個低功耗、高性能的8位CMOS微控制器。由片內(nèi)可反復(fù)擦拭的FLASH只讀程序存儲器(ROM)、片外程序存儲器內(nèi)部硬件資源, P0P3 4×8 32位輸入輸出總線(IO)接口,其中P1、P3作為普通的接口,并有第二功能。P0可作為地址數(shù)據(jù)總線用于外接電路的擴(kuò)展端口。其引腳如圖2 圖22 時鐘電路由AT89S51得18、19引腳的時鐘端(XTL1及ATAL 2)以及12MHZ晶振、47pF

4、的電容C1、C2組成,采用片內(nèi)振蕩方式。其時間周期為1/12us,機器周期為1s。單片機的外部晶振電路如圖3 圖33 復(fù)位電路采用簡單的上位電路,由開關(guān)、1K電阻及22uF電容接至 AT89S52的RST復(fù)位端。電路如圖4 圖4 4 鍵盤電路的設(shè)計原理首先行列式鍵盤中的鍵實際上就是一個機械開關(guān),該開關(guān)位于行線和列線的交點處,通過按鍵加以連接。當(dāng)按下某個鍵時,該交點的行線和列線接通,相應(yīng)行線或列線上的的電平發(fā)生變化,從而可以確定被按下的功能鍵。4行×4列的行列式鍵盤如圖2. 圖5其次運用線翻轉(zhuǎn)法判斷有無鍵按下:鍵盤的高4位用于列控制,低4位用于行控制,并將全部行線Y0Y3置低電平,然后

5、再檢查列線電平的狀態(tài)。只要其中有一列電平為低,則表示右鍵按下,并且被按下的鍵位于低電平和4根行線交叉的某一個按鍵中。判斷被按下鍵的位置:依次將所有的行線Y4Y7置為低電平,在判斷4根列線的電平狀態(tài),當(dāng)遇到某一列的電平鍵盤識別有鍵按下?去抖動確定被按下鍵的位置計算鍵碼返回NY鍵盤掃描流程圖 為低時表示此鍵按下。 5 LCD1602 液晶顯示屏液晶顯示器具有顯示質(zhì)量高、發(fā)光恒定、不會刷新亮點和閃爍、體積小、電流小、字跡清晰以及功耗低的特點。本實驗才用了16×2個字符,5×7點陣,8位數(shù)據(jù)接口的液晶顯示。在使用1602都必須進(jìn)行初始化設(shè)置,并且每一個控制接口有固定的操作時序。其接

6、口電路如圖6 圖6 硬件電路設(shè)計圖(二)C51 程序設(shè)計設(shè)計思路主函數(shù)流程圖 開始初始化,顯示ENTER 1TO START按鍵為1?鍵盤掃描1 1按鍵操作子函數(shù)Keyscan()掃描判斷有鍵按下?計算處理數(shù)據(jù)數(shù)據(jù)送入LCD顯示返回?zé)o有附件1源程序/定義頭文件、函數(shù)和變量#include <reg52.h> #include <intrins.h> #include <math.h>#define uint unsigned int #define uchar unsigned char#define BUS P2 /定義P2端口unsigned char

7、code str1="ENTER 1 TO START"void keyscan();void keyscan_0(); sbit E=P13;sbit RS=P14;sbit RW=P10;char i,j,temp,num,num_0,num_1;long a,b,c; uchar flag,fuhao;uchar code table= /定義鍵盤數(shù)組,用于查表 1,2,3,0x2f-0x30,4,5,6,0x2a-0x30,7,8,9,0x2d-0x30,0x01-0x30,0,0x3d-0x30,0x2b-0x30;void delay(uchar m) /延時子

8、函數(shù) uchar y; for(m;m>0;m-) for(y=0;y<110;y+); unsigned char Test_busy(void) /檢測遇忙函數(shù) unsigned char Busy; BUS=0xff; RS=0; RW=1; E=1; _nop_(); Busy=BUS&0x80; E=0; return Busy; void write_cmd(unsigned char command) /寫命令函數(shù) while(Test_busy(); RW=0; RS=0; E=0; BUS=command; E=1; _nop_(); E=0; void

9、write_dat(unsigned char dat) /寫數(shù)據(jù)函數(shù) while(Test_busy(); RW=0; RS=1; E=0; BUS=dat; E=1; _nop_(); E=0;void Lcd_init(void) /LCD液晶復(fù)位函數(shù) write_cmd(0x38); write_cmd(0x01); write_cmd(0x06); write_cmd(0x0c); write_cmd(0x80); num_1=0; i=0; j=0; a=0; b=0; c=0; flag=0; fuhao=0; void keyscan_0() /選擇按鍵1,鍵盤開始工作P3=0

10、xf7; if(P3!=0xf7) temp=P3&0xf0; switch(temp) case 0xe0:num_0=0;write_cmd(0x01); break; void keyscan() / 鍵盤掃描程序操作P3=0xf7; if(P3!=0xf7) delay(20);/ 延遲20ms if(P3!=0xf7) temp=P3&0xf0; switch(temp) case 0xe0:num=0; break; case 0xd0:num=1; break; case 0xb0:num=2; break; case 0x70:num=3; break; whi

11、le(P3!=0xf7); if(num=0|num=1|num=2) /如果按下的是'1','2'或'3' if(j!=0) write_cmd(0x01); j=0; if(flag=0) /沒有按過符號鍵 a=a*10+tablenum; Else /如果按過符號鍵 b=b*10+tablenum; Else /如果按下的是'/' flag=1; fuhao=4; /4表示除號已按 i=tablenum; write_dat(0x30+i);P3=0xfb;if(P3!=0xfb) delay(5); if(P3!=0xfb

12、) temp=P3&0xf0; switch(temp) case 0xe0:num=4; break; case 0xd0:num=5; break; case 0xb0:num=6; break; case 0x70:num=7; break; while(P3!=0xfb); if(num=4|num=5|num=6&&num!=7) /如果按下的是'4','5'或'6' if(j!=0) write_cmd(0x01); j=0; if(flag=0) /沒有按過符號鍵 a=a*10+tablenum; else

13、/如果按過符號鍵 b=b*10+tablenum; else /如果按下的是'/' flag=1; fuhao=3; /3表示乘號已按 i=tablenum; write_dat(0x30+i);P3=0xfd;if(P3!=0xfd) delay(5); if(P3!=0xfd) temp=P3&0xf0; switch(temp) case 0xe0:num=8; break; case 0xd0:num=9; break; case 0xb0:num=10; break; case 0x70:num=11; break; while(P3!=0xfd); if(n

14、um=8|num=9|num=10) /如果按下的是7','8'或'9' if(j!=0) write_cmd(0x01); j=0; if(flag=0) /沒有按過符號鍵 a=a*10+tablenum; else /如果按過符號鍵 b=b*10+tablenum; else if(num=11) /如果按下的是'-' flag=1; fuhao=2; /2表示減號已按 i=tablenum; write_dat(0x30+i);P3=0xfe;if(P3!=0xfe) delay(5); if(P3!=0xfe) temp=P3&a

15、mp;0xf0; switch(temp) case 0xe0:num=12; break; case 0xd0:num=13; break; case 0xb0:num=14; break; case 0x70:num=15; break; while(P3!=0xfe); switch(num) case 12:write_cmd(0x80+0x4f); write_cmd(0x04); i=0; c=(long)(float)sqrt(a)*1000); while(c!=0) write_dat(0x30+c%10); c=c/10; i+; if(i=3) write_dat(0x2

16、e); if(sqrt(a)<=0) write_dat(0x30); write_dat(0x3d); a=0;b=0;flag=0;fuhao=0; /按下的是"*",開方 break; case 13: /按下的是"0" if(flag=0) /沒有按過符號鍵 a=a*10; write_dat(0x30); else if(flag=1) /如果按過符號鍵 b=b*10; write_dat(0x30); break; case 14:j=1; if(fuhao=0)write_cmd(0x01);a=0;b=0;fuhao=0;flag=

17、0; if(fuhao=1)write_cmd(0x80+0x4f);/按下等于鍵,光標(biāo)前進(jìn)至第二行最后一/個顯示處 write_cmd(0x04); /設(shè)置從后住前寫數(shù)據(jù),每寫完一個數(shù)據(jù),光標(biāo)后退/一格 c=a+b; while(c!=0) write_dat(0x30+c%10); c=c/10; write_dat(0x3d); /再寫"=" a=0;b=0;flag=0;fuhao=0; else if(fuhao=2)write_cmd(0x80+0x4f);/光標(biāo)前進(jìn)至第二行最后一個顯示處 write_cmd(0x04); /設(shè)置從后住前寫數(shù)據(jù),每寫完一個數(shù)據(jù),

18、光標(biāo)后退/一格 if(a-b>0) c=a-b; else c=b-a; while(c!=0) write_dat(0x30+c%10); c=c/10; if(a-b<0) write_dat(0x2d); write_dat(0x3d); /再寫"=" a=0;b=0;flag=0;fuhao=0; else if(fuhao=3)write_cmd(0x80+0x4f); write_cmd(0x04); c=a*b; while(c!=0) write_dat(0x30+c%10); c=c/10; write_dat(0x3d); a=0;b=0;flag=0;fuhao=0; else if(fuhao=4)write_cmd(0x80+0x4f); write_cmd(0x04); i=

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論