最近剛學單片機,為了方便,用了proteus和keil 電腦仿真,剛調試成功,用兩個數碼管顯示按鍵次數,經測試正確。
代碼可能不是很有效,也希望有朋友幫忙改進.
以此而推可以顯示更多位.現傳上proteus 設計圖和源碼,帶注解,因為看了論壇上那位肺腑之言的貼,要養好寫注解的習慣。
KEYCARD BIT 00H ;用于標志是否有鍵按下
KEYCOU EQU 5AH ;用于記錄按下鍵的次數
ORG 0000H ;程序開始
AJMP START
ORG 30H ;為避免占用中斷向量區,主程序從30H開始
START:
MOV SP,#5FH ;設置堆棧的初始地址
MOV P2,#0H ;P2,P3的初始化
MOV P3,#0FFH
CLR KEYCARD ;有按鍵標志清0
MOV KEYCOU,#0 ;計數初值賦0
LOOP: ;循環掃描鍵盤
ACALL KEY_CHECK
JNB KEYCARD,DISPLAY
INC KEYCOU
DISPLAY: ;顯示程序
MOV DPTR,#ASCII ;獲得對應的顯示碼
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 ;真的有鍵按下,則置標志位
RET
DELAY1S: ;延時函數
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
jishu.jpg (90.95 KB, 下載次數: 116)
下載附件
2011-3-12 19:26 上傳
|