|
====查詢程序=====
START: MOV R5,#0BH
MOV R4,#0BH
MOV R3,#0BH
ACALL DISPLAY;未開始搶答時(shí)候顯示FFF
JB P3.0,NEXT;ddddddd
ACALL DELAY
JB P3.0,NEXT;去抖動(dòng),如果"開始鍵"按下就向下執(zhí)行,否者跳到非法搶答查詢
ACALL BARK;按鍵發(fā)聲
MOV A,R1
MOV R6,A;送R1->R6,因?yàn)镽1中保存了搶答時(shí)間
SETB OK;搶答標(biāo)志位,用于COUNT只程序中判斷是否查詢搶答
MOV R7,#01H ;讀搶答鍵數(shù)據(jù)信號(hào)標(biāo)志,這里表示只讀一次有用信號(hào)
MOV R3,#0AH;搶答只顯示計(jì)時(shí),滅號(hào)數(shù)
AJMP COUNT;進(jìn)入倒計(jì)時(shí)程序,"查詢有效搶答的程序"在COUNT里面
NEXT: JNB P1.0,FALSE1
JNB P1.1,FALSE2
JNB P1.2,FALSE3
JNB P1.3,FALSE4
JNB P1.4,FALSE5
JNB P1.5,FALSE6
JNB P1.6,FALSE7
JNB P1.7,FALSE8
AJMP START
;=====INT0(搶答時(shí)間R1調(diào)整程序)=====
INT0SUB:MOV A,R1
MOV B,#0AH
DIV AB
MOV R5,A
MOV R4,B
MOV R3,#0AH
ACALL DISPLAY;先在兩個(gè)時(shí)間LED上顯示R1
JNB P3.4,INC0;P3.4為+1s鍵,如按下跳到INCO
JNB P3.5,DEC0;P3.5為-1s鍵,如按下跳到DECO
JNB P3.1,BACK0;P3.1為確定鍵,如按下跳到BACKO
AJMP INT0SUB
INC0: MOV A,R1
CJNE A,#63H,ADD0;如果不是99,R2加1,如果加到99,R1就置0,重新加起。
MOV R1,#00H
ACALL DELAY1
AJMP INT0SUB
ADD0: INC R1
ACALL DELAY1
AJMP INT0SUB
DEC0: MOV A,R1
JZ SETR1;如果R1為0, R1就置99,
DEC R1
ACALL DELAY1
AJMP INT0SUB
SETR1: MOV R1,#63H
ACALL DELAY1
AJMP INT0SUB
BACK0: RETI
;=====讀搶答按鍵數(shù)據(jù)口程序=====
;由于在讀搶答數(shù)據(jù)口的時(shí)候,單片機(jī)首先進(jìn)入倒計(jì)時(shí)程序,再調(diào)用顯示程序,最后才檢測(cè)按鍵口
;然而在檢測(cè)按鍵口時(shí)動(dòng)態(tài)掃描要調(diào)用三次(4ms)延時(shí)程序.這樣就會(huì)導(dǎo)致讀數(shù)據(jù)口出現(xiàn)滯后,造成1號(hào)優(yōu)先最高.8號(hào)最低.
;故采用在延時(shí)子程序中加了讀數(shù)據(jù)口程序.保證了靈敏度和可靠性
AAAA1: MOV A,P1
CJNE A,#0FFH,AA1 ;當(dāng)不全為1時(shí)的數(shù)據(jù)為有效數(shù)據(jù)
AA0: MOV 36H,A ;將有效數(shù)據(jù)送到36H暫存
AJMP LOOP2
AA1: DEC R7
AJMP AA0
;=====發(fā)聲程序=====
BARK: SETB RING
ACALL DELAY1
ACALL DELAY1
CLR RING;按鍵發(fā)聲
RET
;=====TO溢出中斷(響鈴程序)=====
T0INT: MOV TH0,#0ECH
MOV TL0,#0FFH
JNB RING,OUT;
CPL P3.6;RING標(biāo)志位為1時(shí)候P3.6口不短取反使喇叭發(fā)出一定頻率的聲音
OUT: RETI
;=====T1溢出中斷(計(jì)時(shí)程序)=====
T1INT: MOV TH1,#3CH
MOV TL1,#0B0H
INC R0
RETI
END
|
|