標題: 一鍵多功能按鍵識別 [打印本頁]
作者: 564654654 時間: 2017-7-27 19:38
標題: 一鍵多功能按鍵識別
如圖4.9.1所示,開關(guān)SP1接在P3.7/RD管腳上,在AT89S51單片機的P1端口接有四個發(fā)光二極管,上電的時候,L1接在P1.0管腳上的發(fā)光二極管在閃爍,當(dāng)每一次按下開關(guān)SP1的時候,L2接在P1.1管腳上的發(fā)光二極管在閃爍,再按下開關(guān)SP1的時候,L3接在P1.2管腳上的發(fā)光二極管在閃爍,再按下開關(guān)SP1的時候,L4接在P1.3管腳上的發(fā)光二極管在閃爍,再按下開關(guān)SP1的時候,又輪到L1在閃爍了,如此輪流下去。
2.電路原理圖
file:///C:/Users/DELL/AppData/Local/Temp/msohtmlclip1/01/clip_image001.jpg
圖4.9.1
3.系統(tǒng)板上硬件連線
(1. 把“單片機系統(tǒng)”區(qū)域中的P3.7/RD端口連接到“獨立式鍵盤”區(qū)域中的SP1端口上;
(2. 把“單片機系統(tǒng)”區(qū)域中的P1.0-P1.4端口用8芯排線連接到“八路發(fā)光二極管指示模塊”區(qū)域中的“L1-L8”端口上;要求,P1.0連接到L1,P1.1連接到L2,P1.2連接到L3,P1.3連接到L4上。
4.程序設(shè)計方法
(1. 設(shè)計思想由來
在我們生活中,我們很容易通過這個叫張三,那個叫李四,另外一個是王五;那是因為每個人有不同的名子,我們就很快認出,同樣,對于要通過一個按鍵來識別每種不同的功能,我們給每個不同的功能模塊用不同的ID號標識,這樣,每按下一次按鍵,ID的值是不相同的,所以單片機就很容易識別不同功能的身份了。
(2. 設(shè)計方法
從上面的要求我們可以看出,L1到L4發(fā)光二極管在每個時刻的閃爍的時間是受開關(guān)SP1來控制,我們給L1到L4閃爍的時段定義出不同的ID號,當(dāng)L1在閃爍時,ID=0;當(dāng)L2在閃爍時,ID=1;當(dāng)L3在閃爍時,ID=2;當(dāng)L4在閃爍時,ID=3;很顯然,只要每次按下開關(guān)K1時,分別給出不同的ID號我們就能夠完成上面的任務(wù)了。下面給出有關(guān)程序設(shè)計的框圖。
5.程序框圖
file:///C:/Users/DELL/AppData/Local/Temp/msohtmlclip1/01/clip_image002.gif
圖4.9.2
6.匯編源程序
ID EQU30H ; EQU ——標號賦值偽指令
SP1 BITP3.7 ;??不知定義這干嘛,后面又沒用到….
L1 BITP1.0
L2 BITP1.1
L3 BITP1.2
L4 BITP1.3
ORG0 ; ORG ——地址定義偽指令
MOVID,#00H
START: JBK1,REL ;直接尋址位為1轉(zhuǎn)移
LCALLDELAY10MS
JBK1,REL
INCID
MOVA,ID
CJNEA,#04,REL ;累加器A與立即數(shù)data比較不相等時轉(zhuǎn)rel
MOVID,#00H
REL: JNBK1,$ ;直接尋址為0轉(zhuǎn)移
MOVA,ID
CJNEA,#00H,IS0
CPLL1 ;閃爍
LCALLDELAY
SJMPSTART
IS0: CJNEA,#01H,IS1
CPLL2
LCALLDELAY
SJMPSTART
IS1: CJNEA,#02H,IS2
CPLL3
LCALLDELAY
SJMPSTART
IS2: CJNEA,#03H,IS3
CPLL4
LCALLDELAY
SJMPSTART ;SJMP---相對短轉(zhuǎn)移
IS3: LJMPSTART ;LJMP -- 2KB范圍內(nèi)長轉(zhuǎn)移
DELAY10MS: MOVR6,#20
LOOP1: MOVR7,#248
DJNZR7,$
DJNZR6,LOOP1
RET
DELAY: MOVR5,#20
LOOP2: LCALLDELAY10MS
DJNZR5,LOOP2
RET
END
7.C語言源程序
#include <AT89X51.H>
unsigned char ID;
void delay10ms(void)
{
unsigned char i,j;
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}
void delay02s(void)
{
unsigned char i;
for(i=20;i>0;i--)
{delay10ms();
}
}
void main(void)
{ while(1)
{if(P3_7==0)
{delay10ms();
if(P3_7==0)
{
ID++;
if(ID==4)
{
ID=0;
}
while(P3_7==0);
}
}
switch(ID)
{ case 0:
P1_0=~P1_0; /* ~ 為求反*/
delay02s();
break;
case 1:
P1_1=~P1_1;
delay02s();
break;
case 2:
P1_2=~P1_2;
delay02s();
break;
case 3:
P1_3=~P1_3;
delay02s();
break;
}
}
}
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |