找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 19076|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)入門課堂實(shí)例:數(shù)碼管顯示4x4矩陣鍵盤的鍵號(hào)(仿真+代碼)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:452950 發(fā)表于 2018-12-25 10:11 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
目錄
數(shù)碼管顯示4x4矩陣鍵盤的鍵號(hào)              2
摘要              2
    關(guān)鍵詞              2
第一章 硬件              2
AT89C51              2
4*4鍵盤              6
第二章 軟件              9
    KEIL4              9
   匯編程序              10
   Proteus              15
   仿真電路圖              17
第三章 實(shí)物              17
   材料              17
   實(shí)物展示              18
課程設(shè)計(jì)心得              19
參考文獻(xiàn)              20
摘要:1、設(shè)計(jì)要求:?jiǎn)纹瑱C(jī)的p1口的p1.0-p1.7連接4x4矩陣鍵盤,p0口控制一只數(shù)碼管,當(dāng)4x4矩陣鍵盤中的某一按鍵按下時(shí),數(shù)碼管上顯示對(duì)應(yīng)的鍵號(hào)。例如,1號(hào)鍵按下時(shí),數(shù)碼管顯示“1”;九號(hào)鍵按下時(shí),數(shù)碼管顯示“9”,等等。原理說明:本設(shè)計(jì)的關(guān)鍵點(diǎn)是如何進(jìn)行鍵盤掃描,并計(jì)算出鍵號(hào),然后把鍵號(hào)送數(shù)碼管顯示。

4*4矩陣式鍵盤       矩陣式鍵盤(或者叫行列式鍵盤)常應(yīng)用在按鍵數(shù)量比較多的系統(tǒng)之中。這種鍵盤由行線和列線組成,按鍵設(shè)置在行、列結(jié)構(gòu)的交叉點(diǎn)上,行、列線分別接在按鍵開關(guān)的兩端。行列式鍵盤可分為非編碼鍵盤和編碼鍵盤兩大類。編碼鍵盤內(nèi)部設(shè)有鍵盤編碼器,被按下鍵的鍵號(hào)由鍵盤編碼器直接給出,同時(shí)具有防抖和解決重鍵的功能。非編碼鍵盤通常采用軟件的方法,逐行逐列檢查鍵盤狀態(tài),當(dāng)有鍵按下時(shí),通過計(jì)算或查表的方法獲取該鍵的鍵值,通常,計(jì)算機(jī)通過程序控制對(duì)鍵盤掃描,從而獲取鍵值,根據(jù)計(jì)算機(jī)掃描的方法可以分為定時(shí)掃描法和中斷掃描法兩種。  本系統(tǒng)中的4*4矩陣式鍵盤結(jié)構(gòu)簡(jiǎn)單,按鍵數(shù)較少,采用非編碼式鍵盤,當(dāng)有鍵按下時(shí),由單片機(jī)通過程序掃描確定鍵值,并將獲得的鍵值通過LED數(shù)碼管顯示出來。鍵盤掃描原理 :本設(shè)計(jì)采用中斷式掃描法,這樣可以節(jié)約單片機(jī)開銷,提高單片機(jī)工作效率,使得單片機(jī)在沒有鍵盤輸入時(shí)可以處理其他工作,其具體工作過程為:  在沒有鍵按下時(shí)矩陣鍵盤行線接高電平,列線接低電平,當(dāng)某個(gè)鍵被按下時(shí),該按鍵所在行線電位被拉低,觸發(fā)單片機(jī)的外部中斷INT0,進(jìn)入中斷子程序,在中斷程序中,單片機(jī)對(duì)矩陣鍵盤進(jìn)行掃描以確定按下的鍵值,掃描過程如下:1、檢測(cè)行線電平,確定是否有按鍵被按下;2、延時(shí)去抖動(dòng);  [7]3、重新確認(rèn)是否有按鍵被按下,若有,掃描鍵值,若沒有,返回主程序;4、掃描鍵值,首先行線接高電平,列線接低電平,對(duì)行線電平進(jìn)行檢測(cè), 以確定按下的鍵所在的行; 5、行線接低電平,列線接高點(diǎn)平,對(duì)列線電平進(jìn)行檢測(cè),確定按下的鍵所 在的列; 6、將掃描所得的按鍵值送入LED數(shù)碼管顯示。LED數(shù)碼管 本設(shè)計(jì)中使用的是七段共陰極LED數(shù)碼管。  如下圖所示為七段共陰極LED顯示器件的結(jié)構(gòu)及外形圖。七段LED顯示器件就是將7個(gè)發(fā)光二極管按一定的方式組合在一起,如下圖所示。下表給出了共陽極7段LED顯示器件所能顯示的部分字符與7段控制顯示代碼的對(duì)應(yīng)關(guān)系  下表給出了共陽段LED顯示器件所能顯示的部分字符與7段控制顯示代碼的對(duì)應(yīng)關(guān)系
顯示字符
控制顯示代碼(十[8]六進(jìn)制)
顯示字符
控制顯示代碼(十六進(jìn)制)
1
F9H
A
88H
2
A4H
B
83H
3
B0H
C
C6H
4
99H
D
A1H
5
92H
E
86H
6
82H
F
8EH
7
F8H
不顯示
FFH
8
80H


9
90H


0
C0H


在本設(shè)計(jì)中,4*4鍵盤共有16個(gè)鍵,對(duì)其編號(hào)0~9,A~F,所以用一個(gè)7段數(shù)碼管靜態(tài)顯示即可滿足即時(shí)顯示按鍵信息的要求。所謂靜態(tài)顯示,就是當(dāng)顯示器件顯示某個(gè)字符時(shí),相[9]應(yīng)的顯示段(發(fā)光二級(jí)管)恒定地導(dǎo)通或截止,直到顯示另一個(gè)字符為止。這種顯示方式顯示一個(gè)字符時(shí),只需要微處理器送一次代碼,因此占用機(jī)時(shí)少,而且顯示穩(wěn)定可靠,其缺點(diǎn)是,使用元器件相對(duì)較多,且線路比較復(fù)雜,相對(duì)而言成本較高,比較適合顯示位數(shù)較少的情況。第二章 軟件部分KeilKeil C51是美國Keil Software公司出品的51系列兼容單片機(jī)C語言軟件開發(fā)系統(tǒng),與匯編相比,C語言在功能上、結(jié)構(gòu)性、可讀性、可維護(hù)性上有明顯的優(yōu)勢(shì),因而易學(xué)易用。用過匯編語言后再使用C來開發(fā),體會(huì)更加深刻。Keil C51軟件提供豐富的庫函數(shù)和功能強(qiáng)大的集成開發(fā)調(diào)試工具,全Windows界面,并將這些部分組合在一起。其方便易用的集成環(huán)境、強(qiáng)大的軟件仿真調(diào)試工具也會(huì)令你事半功倍。Keil C51生成的目標(biāo)代碼效率非常之高,多數(shù)語句生成的匯編代碼很緊湊,容易理解。在開發(fā)大型軟件時(shí)更能體現(xiàn)高級(jí)語言的優(yōu)勢(shì)。  系統(tǒng)概述  :Keil C51軟件提供豐富的庫函數(shù)和功能強(qiáng)大的集成開發(fā)調(diào)試工具,全Windows界面。另外重要的一點(diǎn),只要看一下編譯后生成的匯編代碼,就能體會(huì)到Keil C51生成的目標(biāo)代碼效率非常之高,多數(shù)語句生成的匯編代碼很緊湊,容易理解。在開發(fā)大型軟件時(shí)更能體現(xiàn)高級(jí)語言的優(yōu)勢(shì)。 Keil C51單片機(jī)軟件開發(fā)系統(tǒng)的整體結(jié)構(gòu) C51工具包的整體結(jié)構(gòu),uVision與Ishell分別是C51 for Windows和for Dos的集成開發(fā)環(huán)境(IDE),可以完成編輯、編譯、連接、調(diào)試、仿真等整個(gè)開發(fā)流程。開發(fā)人員可用IDE本身或其它編輯器編輯C或匯編源文件。然后分別由C51及C51編譯器編譯生成目[10]標(biāo)文件(.OBJ)。目標(biāo)文件可由LIB51創(chuàng)建生成庫文件,也可以與庫文件一起經(jīng)L51連接定位生成絕對(duì)目標(biāo)文件(.ABS)。ABS文件由OH51轉(zhuǎn)換成標(biāo)準(zhǔn)的Hex文件,以供調(diào)試器dScope51或tScope51使用進(jìn)行源代碼級(jí)調(diào)試,也可由仿真器使用直接對(duì)目標(biāo)板進(jìn)行調(diào)試,也可以直接寫入程序存貯器如EPROM中。使用獨(dú)立的Keil仿真器時(shí),注意事項(xiàng)  仿真器標(biāo)配11.0592MHz的晶振,但用戶可以在仿真器上的晶振插孔中換插其他頻率的晶振。仿真器上的復(fù)位按鈕只復(fù)位仿真芯片,不復(fù)位目標(biāo)系統(tǒng)。  仿真芯片的31腳(/EA)已接至高電平,所以仿真時(shí)只能使用片內(nèi)ROM,不能使用片外ROM;但仿真器外引插針中的31腳并不與仿真芯片的31腳相連,故該仿真器仍可插入到擴(kuò)展有外部ROM(其CPU的/EA引腳接至低電平)的目標(biāo)系統(tǒng)中使用。

匯編程序如下:
scan_code EQU 30H
          ORG 0000H
                              JMP start
                              ORG 0030H
start:  
          MOV P0,#0FFH ;初始化p0口,使輸出無顯示
loop:                                                            ; 循環(huán)調(diào)用read—key獲取鍵盤信息,若鍵盤按下,
         CALL read_[11]key              ; 則用R7返回鍵值信息
         CJNE R7,#0FFH,next              ; 若R7返回值不為0xff,則調(diào)用顯示函數(shù)
                              JMP loop
next:                                                                          ;顯示程序
          MOV A,R7
                              MOV DPTR,#disp_code
                            MOVC A,@A+DPTR
                              MOV P0,A
                              JMP loop
read_key:
          MOV scan_code,#7FH
                              MOV P1,#0FH
                              MOV A,P1
                              MOV R7,#0FFH
                            CJNE A,#0FH,wait_key   ;鍵盤按下則p1的值會(huì)改變
                              JMP end_key
wait_key:[12]
   CALL delay_10ms   ;延時(shí)10ms,若p1口仍右鍵按下,則跳到scan—key
                              MOV A,P1
                              MOV R7,#0FFH
                              MOV R6,#4
                            CJNE A,#0FH,scan_key
                              JMP end_key
scan_key:
          MOV P1,scan_code       ;將0x7f循環(huán)右移并賦給P1
                              MOV A,P1
                            CJNE A,scan_code,get_key;p1的值改變則確定出其行數(shù)
                               RR A
                              MOV scan_code,A
                            DJNZ R6,scan_key
                              JMP end_key
get_key:
   ;       MOV P1,#0FH
              ;                MOV R1,P1
              ;              CJNE R1,#0FH,$[13]
                              MOV R7,#4
get_key0:
          JNB ACC.0,add_r6;移位循環(huán)判斷最低位,為0則確定其列數(shù)
                               RR A
                            DJNZ R7,get_key0
                              MOV R7,#0FFH
                              JMP end_key
add_r6:
    DEC R6 ;從第0個(gè)鍵盤數(shù)起,數(shù)滿(R6-1)*4個(gè)鍵盤,再加上第R6行
              MOV A,R6      ;的列數(shù)R7-1,便得第幾個(gè)鍵盤按下
                              MOV B,#4
                              MUL AB
                              DEC R7
                              ADD A,R7
                              MOV R7,A
end_key:
          RET[14]
delay_10ms:
          MOV R7,#10
delay0:
          MOV R6,#0FAH
delay1:
          NOP                                ;   1us
                              NOP                                          ;  1us
                            DJNZ R6,delay1              ; 2us+R6循環(huán)250次,延時(shí)250*4us
                            DJNZ R7,delay0                ;2us+R7循環(huán)10次,延時(shí)10*250*4us=10ms
                            RET
disp_code:
          DB 40H,79H,24H,30H
                              DB 19H,12H,02H,78H
                              DB 00H,18H,08H,03H
                              DB 46H,21H,06H,0EH
              END

使用Proteus 軟件進(jìn)行單片機(jī)系統(tǒng)仿真設(shè)計(jì),是虛擬仿真技術(shù)和計(jì)算機(jī)多媒體技術(shù)相結(jié)合的綜合運(yùn)用,有利于培養(yǎng)學(xué)生的電路設(shè)計(jì)能力及仿真軟件的操作能力;在單片機(jī)課程設(shè)計(jì)和全國大學(xué)生電子設(shè)計(jì)競(jìng)賽中,我們使用 Proteus 開發(fā)環(huán)境對(duì)學(xué)生進(jìn)行培訓(xùn),在不需要硬件投入的條件下,學(xué)生普遍反映,對(duì)單片機(jī)的學(xué)習(xí)比單純學(xué)習(xí)書本知識(shí)更容易接受,更容易提高。實(shí)踐證明,在使用 Proteus 進(jìn)行系統(tǒng)仿真開發(fā)成功之后再進(jìn)行實(shí)際制作,能極大提高單片機(jī)系統(tǒng)設(shè)計(jì)效率。因此,Proteus 有較高的推廣利用價(jià)值。仿真電路圖如下:第三章 實(shí)物材料:
材料名稱
晶振
22pf電容
10uf電容
按鍵
C51芯片
芯片卡槽
數(shù)碼管
USB接口
杜邦線
數(shù)量
1
2[18]
1
17
1
1
1
1
若干
實(shí)物展示:第四章  心得體會(huì)通過本次單片機(jī)課程設(shè)計(jì),我不僅加深了對(duì)單片機(jī)理論知識(shí)的理解,學(xué)會(huì)了學(xué)以致用的重要性;而且還學(xué)會(huì)了如何去加強(qiáng)鍛煉創(chuàng)新精神,同時(shí)也提高了自身的動(dòng)手能力,讓我深刻的意識(shí)到理論與實(shí)際結(jié)合的重要性。 在本次設(shè)計(jì)過程中,雖然設(shè)計(jì)的題目不是很難,但在實(shí)際操作過程當(dāng)中也遇到了不少困難,通過遇到的困難[19]也讓我不斷地去查找資料,不斷地詢問同學(xué),不斷地去開動(dòng)自己的腦子,從而也不斷地超越自我,讓自己的知識(shí)能夠得到不斷地完善;同時(shí)更重要的是,在這一設(shè)計(jì)過程當(dāng)中,讓我懂得了在學(xué)習(xí)的道路上會(huì)遇到很多的阻礙,但關(guān)鍵的是能做到堅(jiān)持不懈,不輕易放棄;最終達(dá)到自己想要的目標(biāo)。  單片機(jī)的學(xué)習(xí)對(duì)于我們專業(yè)來說非常的重要,通過本次設(shè)計(jì)也讓我更加清晰了對(duì)專業(yè)的了解,理論知識(shí)再豐富,沒有實(shí)際的操作經(jīng)驗(yàn)也是不行的;本次設(shè)計(jì)也運(yùn)用到了proteus仿真軟件,由于之前沒有學(xué)過該仿真軟件,所以在操作的過程中遇到了很多困難,但慶幸的是通過不斷的學(xué)習(xí),對(duì)proteus軟件也有了很大的了解,也學(xué)會(huì)了一些簡(jiǎn)單的操作,所以也讓我意識(shí)到,如果你想學(xué)好,通過自己的努力就一定會(huì)學(xué)好。 當(dāng)然在本次設(shè)計(jì)過程中,也遇到了很多的困難,比如很多關(guān)于單片機(jī)的基礎(chǔ)知識(shí)學(xué)的不是很好。當(dāng)然在設(shè)計(jì)過程中也少不了同學(xué)們的互相幫助,要是沒有同學(xué)幫助的幫助,我想我一個(gè)人也不可能在短時(shí)間內(nèi)完成設(shè)計(jì)要求;所以在此也要感謝在設(shè)計(jì)中給予我?guī)椭闹笇?dǎo)老師和同學(xué)們。

全部資料51hei下載地址:
數(shù)碼管顯示4x4矩陣鍵盤的鍵號(hào).zip (149.2 KB, 下載次數(shù): 122)
課設(shè)數(shù)碼管顯示4x4矩陣鍵盤的鍵號(hào).doc (103 KB, 下載次數(shù): 32)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:115923 發(fā)表于 2020-3-24 20:31 | 只看該作者
------------------------------------
P1.0 P1.1 P1.2 P1.3
p1.4 S1 S5 S9 S13
P1.5 S2 S6 S10 S14
P1.6 S3 S7 S11 S15
P1.7 S4 S8 S12 S16
------------------------------------
實(shí)現(xiàn)原理:
當(dāng)高電平端口與低電平端口短接時(shí),高電平端口會(huì)被拉成低電平
------------------------
算法分析:
1,檢查是否有鍵按下:
P1=f0h (即0-3置1,4-7置0)
檢查P1口是否是0F0H
是,則無鍵按下
否,則有鍵按下
2,掃描按下的鍵值:
循環(huán)(依次將4至7口單獨(dú)置0)
檢查0-3口是否有低電平端
確定被按下的鍵
返回鍵值
3,鍵盤防抖:
抖動(dòng)原因:鍵按下時(shí),會(huì)產(chǎn)生電壓的波動(dòng),持續(xù)約10MS
去抖方法:10MS掃描一次,使前后兩次均有鍵按下
********************************************************/
#include<ytc51.h>
uchar jps,ks; //鍵盤緩存
/*鍵盤掃描程序1,檢查是否有按鍵*/
uchar keyfun()
{
uchar key_c;
P2 = P2 & 0x03;
P2 = P2 | 0x3c;
key_c = P2;
if((key_c & 0xfc) == 0x3c) return (0);
else return(1);
}
/*鍵盤掃描程序2,確定按鍵數(shù)值*/
uchar keyscan()
{
uchar i,k;
P2 = P2 & 0x03;
P2 = P2 | 0xbc;
if((P2 & 0x3c) != 0x3c)
{
i = 0;
k = (~P2) & 0x3c;
}
else
{
P2 = P2 & 0x03;
P2 = P2 | 0x7c;
if((P2 & 0x3c) != 0x3c)
{
i = 1;
k = (~P2) & 0x3c;
}
}
k = k>>3;
if( k==4 ) k=3;
k=i*4+k+1;
return(k);
}
/**********************************************************************
函數(shù)功能: 定時(shí)器中斷函數(shù)(掃描鍵盤)(10ms 16位定時(shí))
入口參數(shù): 無
出口參數(shù): 無
***********************************************************************/
void Time0_Func() interrupt 3 /*當(dāng)定時(shí)器中斷時(shí)執(zhí)行此函數(shù)*/
{
TH1=(0xffff-9259)/256; /*T0初始化*/
TL1=(0xffff-9259)%256;
WR = 1;
if((ks == 0) && ( keyfun() ))
{
jps = keyscan();
}
ks = keyfun();
}
/**********************************************************************
函數(shù)功能: 上電初始化函數(shù)
入口參數(shù): 無
出口參數(shù): 無
***********************************************************************/
void Power_Up(void)
{
TMOD = 0x10;/*Time0/1為16計(jì)數(shù)器*/
TH1=(0xffff-9216)/256;/*10ms*/
TL1=(0xffff-9216)%256;/*10ms*/
TR1=1;
SCON = 0x00;//串口工作模式設(shè)置
IE=0x88; /*EA=1 ET1=1*/
P0=0xff;
P2=0xff;
}
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表