51單片機STC89C52 矩陣鍵盤數碼管顯示

WELA BIT P2.7
DULA BIT P2.6
DIOLA BIT P2.5
FM BIT P2.3

ORG 0000H
SETB DIOLA
MOV SP,#0E0H
LOOP0:
LCALL key_Scan
JZ LOOP0
LCALL DELAY20MS
LCALL key_Scan
JZ LOOP0
MOV P1,A
LCALL Smg
HERE0:
LCALL key_Scan ;等待按鍵釋放
JZ LOOP0
LCALL DELAY20MS
SJMP HERE0

key_Scan:
SETB RS1
MOV P3,#0FH
ORL P3,#0FH
MOV A,P3  ;取低4位 行
MOV P3,#0F0H
ORL P3,#0F0H
MOV R0,P3 ;取高4位 列
ANL A,#0FH
MOV R1,A
MOV A,R0
ANL A,#0F0H
ORL A,R1
CPL A
JZ EXIT ;爲0說明無鍵,退出
MOV R0,A ; 暫存完整鍵狀態
ANL A,#0FH
CJNE A,#01H,NEXT0
MOV R1,#1
SJMP NEXT4
NEXT0:
CJNE A,#02H,NEXT1
MOV R1,#2
SJMP NEXT4
NEXT1:
CJNE A,#04H,NEXT2
MOV R1,#3
SJMP NEXT4
NEXT2:
CJNE A,#08H,NEXT3
MOV R1,#4
SJMP NEXT4
NEXT3:
MOV R1,#0 ;R1保存行號 無鍵爲0,有鍵1-4
CLR A ;退出前,清零累加器
SJMP EXIT
NEXT4:
MOV A,R0  ;開始算列
ANL A,#0F0H
CJNE A,#10H,NEXT00 
MOV R2,#1
SJMP NEXT40
NEXT00:
CJNE A,#20H,NEXT10
MOV R2,#2
SJMP NEXT40
NEXT10:
CJNE A,#40H,NEXT20
MOV R2,#3
SJMP NEXT40
NEXT20:
CJNE A,#80H,NEXT30
MOV R2,#4
SJMP NEXT40
NEXT30:
MOV R2,#0 ;R2保存列號,無鍵爲0,有鍵1-4
CLR A ;無鍵退出,並清零累加器
SJMP EXIT
NEXT40:
MOV A,R1
SUBB A,#1
RL A
RL A
ADD A,R2 ;鍵值 0-15
EXIT:
CLR RS1
RET

DELAY20MS:    ;延時 
SETB RS0
MOV R1,#20
DELAY1:
MOV R0,#0FAH
DELAY0:
NOP
NOP 
DJNZ R0,DELAY0
DJNZ R1,DELAY1
CLR RS0
RET

DELAY4S:    ;延時 
SETB RS1
MOV R3,#02H
DELAY30:
MOV R2,#04H
DELAY20:
MOV R1,#250
DELAY10:
MOV R0,#250
DELAY00:
NOP
NOP 
DJNZ R0,DELAY00
DJNZ R1,DELAY10
DJNZ R2,DELAY20
DJNZ R3,DELAY30
CLR RS1
RET

Smg:
SETB RS1
PUSH ACC
PUSH B
PUSH PSW
CLR DULA
CLR WELA
MOV P0,#00H
SETB DULA
CLR DULA
SETB WELA
CLR WELA
MOV DPTR,#TABLEK
DEC A
MOVC A,@A+DPTR
MOV P0,A
SETB DULA
CLR DULA
POP PSW
POP B
POP ACC
CLR RS1
RET
TABLEK:    ;共陰數碼管
DB 	3FH,06H,5BH,4FH
DB  66H,6DH,7DH,07H
DB  7FH,6FH,77H,7CH
DB  39H,5EH,79H,71H

END

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章