最近剛學(xué)單片機(jī),為了方便,用了proteus和keil 電腦仿真,剛調(diào)試成功,用兩個數(shù)碼管顯示按鍵次數(shù),經(jīng)測試正確。
代碼可能不是很有效,也希望有朋友幫忙改進(jìn).
以此而推可以顯示更多位.現(xiàn)傳上proteus 設(shè)計圖和源碼,帶注解,因為看了論壇上那位肺腑之言的貼,要養(yǎng)好寫注解的習(xí)慣。
KEYCARD BIT 00H ;用于標(biāo)志是否有鍵按下
KEYCOU EQU 5AH ;用于記錄按下鍵的次數(shù)
ORG 0000H ;程序開始
AJMP START
ORG 30H ;為避免占用中斷向量區(qū),主程序從30H開始
START:
MOV SP,#5FH ;設(shè)置堆棧的初始地址
MOV P2,#0H ;P2,P3的初始化
MOV P3,#0FFH
CLR KEYCARD ;有按鍵標(biāo)志清0
MOV KEYCOU,#0 ;計數(shù)初值賦0
LOOP: ;循環(huán)掃描鍵盤
ACALL KEY_CHECK
JNB KEYCARD,DISPLAY
INC KEYCOU
DISPLAY: ;顯示程序
MOV DPTR,#ASCII ;獲得對應(yīng)的顯示碼
PUSH B
MOV A,KEYCOU
MOV B,#0AH
DIV AB ;選顯示第一位高位
MOVC A,@A+DPTR
MOV P0,A ;把顯示碼傳至A口
SETB P2.1 ;選通P2.0,顯示
ACALL DELAY1S
CLR P2.1
MOV A, B
POP B
MOVC A,@A+DPTR
MOV P0,A ;把顯示碼傳至A口
SETB P2.0 ;選通P2.0,顯示
ACALL DELAY1S
CLR P2.0
AJMP LOOP
KEY_CHECK: ;看有沒有鍵按下
MOV A,P3
ANL A,#0fFH ;邏輯與
CJNE A,#0FFH,KEY_CER ;如果讀入的與寫出的不相等,延時消抖
CLR KEYCARD
RET
KEY_CER: ;延時,再讀入,看是否真的有鍵按下
ACALL DELAY1S
MOV A,P3
ANL A,#0FFH
CJNE A,#0FFH,KEY_CE
CLR KEYCARD
RET
KEY_CE:
MOV A,P3 ;直等到按鍵放下,則算作一次
ANL A,#0FFH
CJNE A,#0FFH,KEY_CE
SETB KEYCARD ;真的有鍵按下,則置標(biāo)志位
RET
DELAY1S: ;延時函數(shù)
MOV R7,#10
D1:
MOV R6,#50
DJNZ R6,$
DJNZ R7,D1
RET
ASCII: DB 0C0H,0F9H,0A4H,0B0H,099H
DB 092H,082H,0F8H,080H,090H
DB 088H,083H,0C6H,0A1H,086H
DB 08EH,08CH,0BFH,0FFH
END
|