- 獨(dú)立式鍵盤實(shí)驗(yàn)設(shè)計(jì)
使用AT89S52單片機(jī),設(shè)計(jì)一個(gè)具有8個(gè)按鍵的獨(dú)立式鍵盤,每個(gè)按鍵對(duì)應(yīng)一個(gè)發(fā)光二極管。功能要求:無(wú)鍵按下時(shí),鍵盤輸出全為“1”,發(fā)光二極管全部熄滅;有鍵按下時(shí),其所對(duì)應(yīng)發(fā)光二極管點(diǎn)亮。 獨(dú)立式鍵盤電路組成由單片機(jī)最小系統(tǒng);
8個(gè)按鍵電路;8個(gè)LED電路。
單片機(jī)I/O口引腳分配8個(gè)按鍵接P0口;按鍵一端接地;另一端接P0口引腳,并通過(guò)上拉電阻接+5V。
8個(gè)LED接P1口,LED采用共陽(yáng)極接法。 獨(dú)立式鍵盤電路設(shè)計(jì)時(shí),每個(gè)按鍵的一端與P0口的一個(gè)引腳相連,另一端接地。 無(wú)鍵按下時(shí),P0的8個(gè)I/O口均通過(guò)電阻接高電平,信息為“1” ,鍵盤輸出全為“1”發(fā)光二極管全部熄滅。 有鍵按下,將使對(duì)應(yīng)的I/O口通過(guò)該鍵接地,信息為“0” ,對(duì)應(yīng)發(fā)光二極管點(diǎn)亮。 CPU可以通過(guò)檢測(cè)P0的8個(gè)I/O口線哪個(gè)是“0”就可以識(shí)別是否有鍵按下,并能識(shí)別出是哪一個(gè)鍵按下。 - 在keil軟件中,新建項(xiàng)目,新建c語(yǔ)言獨(dú)立式鍵盤文件,輸入代碼保存并編譯,生成hex文件
代碼如下:
獨(dú)立式鍵盤功能實(shí)現(xiàn)分析
判斷是否有按鍵按下
while(x==0xff) //循環(huán)判斷是否有鍵按下
{
x=P0; //讀鍵盤狀態(tài)
}
delay10ms(); //延時(shí)10ms去抖動(dòng)
x=P0; //再次讀鍵盤狀態(tài)
if(x==0xff) continue;//如果無(wú)鍵按下則認(rèn)為是按
//鍵抖動(dòng),重新掃描根據(jù)鍵值點(diǎn)亮對(duì)應(yīng)的發(fā)光二極管
switch(~x)
{
case 0x01:P1=0xfe; break;//點(diǎn)亮第一個(gè)發(fā)光二極管
case 0x02:P1=0xfd; break;//點(diǎn)亮第二個(gè)發(fā)光二極管
case 0x04:P1=0xfb;break;//點(diǎn)亮第三個(gè)發(fā)光二極管
case 0x08:P1=0xf7; break;//點(diǎn)亮第四個(gè)發(fā)光二極管
case 0x10:P1=0xef; break;//點(diǎn)亮第五個(gè)發(fā)光二極管
case 0x20:P1=0xdf; break;//點(diǎn)亮第六個(gè)發(fā)光二極管
case 0x40:P1=0xbf; break;//點(diǎn)亮第七個(gè)發(fā)光二極管
case 0x80:P1=0x7f; break;//點(diǎn)亮第八個(gè)發(fā)光二極管
default:break;
}
} } - 運(yùn)行Proteus,新建“獨(dú)立式鍵盤”設(shè)計(jì)文件,放置并編輯ST89C52、CRYSTAL、CAP、CAP-ELEC 、RES 、BUTTON 、LED-YELLOW等元器件.有鍵按下,其發(fā)光二極管點(diǎn)亮。
程序要判斷是否有2個(gè)或2個(gè)以上的鍵盤同時(shí)按下,以免鍵盤分析錯(cuò)誤。 給每個(gè)不同的功能模塊用不同的ID號(hào)標(biāo)識(shí),這樣,每按下一次按鍵,ID 的值是不相同的,所以單片機(jī)就很容易識(shí)別不同功能的身份了。 D1到D4發(fā)光二極管在每個(gè)時(shí)刻的閃爍的時(shí)間是受按鍵來(lái)控制,我們給D1到D4閃爍的時(shí)段,定義出不同的ID號(hào),只要每次按下按鍵時(shí),分別給出不同的ID號(hào)我們就能夠完成上面的任務(wù)了。 |