第1个回答 2018-01-12
KEYVAL EQU 30H
KEYTM EQU 31H
KEYSCAN EQU 32H
DAT EQU 33H
SCANLED EQU 37H
TCNT EQU 38H
SEC EQU 39H
KEYO EQU 3AH
STARTF BIT 00H
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP ESS1
ORG 000BH
LJMP T0ISR
ORG 0100H
MAIN:
MOV TMOD,#01H
MOV TH0,#HIGH(65536-5000)
MOV TL0,#LOW(65536-5000)
SETB ET0
SETB TR0
SETB EA
SETB EX0
SETB IT0 ;外部中断1初始化
CLR STARTF
MOV TCNT,#0
MOV SCANLED,#0
MOV KEYO,#0
LOOP:
LCALL KEYSEL
MOV A,KEYVAL
JZ LOOP
CJNE A,KEYO,LOOP1
SJMP LOOP
LOOP1:
MOV KEYO,A
LCALL DISCHG
JNB STARTF,LOOP
MOV SEC,#20
JB STARTF,$
SJMP LOOP
;------------------------------------
ESS1:
SETB TR0 ;启动定时器1
SETB STARTF
MOV R2,#20
CLR P3.0
MOV SEC,#10
MOV KEYO,#0
LCALL DISCHG
LCALL ALARM
RETI
;-----------------------
ALARM:
MOV R4,#50
CLR P3.0
ALARM1:
LCALL DELAY
DJNZ R4,ALARM1
SETB P3.0
RET
;-----------------------
DISCHG:
MOV A,SEC
MOV B,#10
DIV AB
MOV 33H,A
MOV 34H,B
MOV A,KEYO
MOV B,#10
DIV AB
MOV 35H,A
MOV 36H,B
RET
;-----------------------
DELAY:
MOV R6,#10D ;延时10ms子程序
D0:
MOV R7,#248D
D1:
DJNZ R7,D1
DJNZ R6,D0
RET
;--------------------
T0ISR:
PUSH ACC
CLR TR0
MOV TH0,#HIGH(65536-5000)
MOV TL0,#LOW(65536-5000)
SETB TR0
JNB STARTF,T0CON
INC TCNT
MOV A,TCNT
CJNE A,#200,T0T
T0T:
JC T0CON
CPL P3.0
MOV TCNT,#0
MOV A,SEC
DEC A
JZ T0T1
MOV SEC,A
LCALL DISCHG
SJMP T0CON
T0T1:
CLR TR0
SETB P3.0
MOV P0,#0FFH
POP ACC
RETI
T0CON:
MOV DPTR,#TAB
T000: ;数字显示
MOV R0,#DAT
MOV A,SCANLED
ADD A,R0
MOV R0,A
MOV A,SCANLED
JNZ T001
MOV P2,#01H
SJMP T0DIS
T001:
DEC A
JNZ T002
MOV P2,#02H
SJMP T0DIS
T002:
DEC A
JNZ T003
MOV P2,#04H
SJMP T0DIS
T003:
MOV P2,#08H
T0DIS:
MOV A,@R0
MOVC A,@A+DPTR
MOV P0,A
INC SCANLED
MOV A,SCANLED
ANL A,#03H
MOV SCANLED,A
POP ACC
RETI
;------------------
KEYSEL:
MOV KEYVAL,#0
MOV KEYSCAN,#0FEH
LCALL GETKEY
MOV A,KEYTM
JZ KEYS1
MOV KEYVAL,A
SJMP KEYRTN
KEYS1:
MOV KEYSCAN,#0FDH
LCALL GETKEY
MOV A,KEYTM
JZ KEYS2
CLR C
ADD A,#4
MOV KEYVAL,A
SJMP KEYRTN
KEYS2:
MOV KEYSCAN,#0FBH
LCALL GETKEY
MOV A,KEYTM
JZ KEYS3
CLR C
ADD A,#8
MOV KEYVAL,A
SJMP KEYRTN
KEYS3:
MOV KEYSCAN,#0F7H
LCALL GETKEY
MOV A,KEYTM
JZ KEYRTN
CLR C
ADD A,#12
MOV KEYVAL,A
KEYRTN:
RET
;--------------------
GETKEY:
MOV KEYTM,#0
MOV A,KEYSCAN
MOV P1,A
NOP
MOV A,P1
ANL A,#0F0H
XRL A,#0F0H
JZ NOKEY
LCALL DELAY
MOV A,P1
ANL A,#0F0H
XRL A,#0F0H
JZ NOKEY
MOV A,P1
ANL A,#0F0H
CJNE A,#0E0H,NK1
MOV KEYTM,#1
SJMP NOKEY
NK1:
CJNE A,#0D0H,NK2
MOV KEYTM,#2
SJMP NOKEY
NK2:
CJNE A,#0B0H,NK3
MOV KEYTM,#3
SJMP NOKEY
NK3:
CJNE A,#70H,NOKEY
MOV KEYTM,#4
NOKEY: RET
TAB:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
END