ORG 0030H
MAIN:MOV SP,#60H
MOV P2,#0FFH
MOV P0,#0CH ;输出P.
ACALL DL
;AJMP LOOP
;下面实现按键功能,P1.0启动,P1.1暂停,P1.2清零
FIRST:ACALL KEY
S0: JNB ACC.0,S1 ;启动键
ACALL DIR
AJMP LOOP
S1: JNB ACC.1,S2 ;暂停键
ACALL DIR
AJMP FIRST
S2: JNB ACC.2,FIRST ;清零键
MOV R0,#00H
MOV R1,#00H
MOV R2,#00H
MOV R3,#00H
MOV R4,#00H
MOV R5,#00H
MOV R6,#00H
ACALL DIR
AJMP FIRST
KS: ;MOV 20H,A
;ACALL DIR
MOV A,P1
CPL A
ANL A,#07H ;屏蔽高五位
RET
KEY: ACALL KS
JNZ AGAIN ;有键闭合则转向再次判断
MOV A,20H
AJMP EXTI ;无键闭合则转向 ,暂时保留不写
AGAIN:MOV 20H,A
ACALL DIR ;延时六毫秒
ACALL KS
JNZ LKP ;两次判断有键闭合,则转向按键键值判断
MOV A,20H
AJMP EXTI ;第二次判断无键闭合,则转向,暂时保留不写
LKP:PUSH ACC
LK: ACALL DIR
ACALL KS
JNZ LK
POP ACC
EXTI:RET
LOOP: ;计数器
MOV R3,25H ;个位数
CJNE R3,#0AH,LOOP1
TEN: MOV R3,#00H
INC R4 ;秒位
CJNE R4,#0AH,LOOP1
HUNDRED:
MOV R4,#00H
INC R5 ;十秒位
CJNE R5,#06H,LOOP1
THOUSAND: ;分位
MOV R5,#00H
INC R6
CJNE R6,#0AH,LOOP1
TEN_THOUSAND:
MOV R6,#00H ;十分位
INC R7
CJNE R7,#06H,LOOP1
MOV R7,#00H
LOOP1:ACALL DIR
ACALL DELAY
ACALL DIR
ACALL DELAY
MOV A,25H
CJNE A,#0AH,LOOP2
MOV 25H,#00H
LOOP2:INC 25H
AJMP FIRST
DIR: MOV P2,#80H ;位控制
MOV A,R3 ;取个位数
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0 ,A ;输出段控码
;SJMP $
ACALL DL ;延时1毫秒
MOV A,P2
RR A
MOV P2,A
MOV P0,#0BFH ;输出横杠线
ACALL DL
MOV A,P2
RR A
MOV P2,A
MOV A,R4 ;取十位数
MOVC A,@A+DPTR
MOV P0,A
ACALL DL
MOV A,P2
RR A
MOV P2,A
MOV A,R5 ;取百位数
MOVC A,@A+DPTR
MOV P0,A
ACALL DL
MOV A,P2
RR A
MOV P2,A
MOV P0,#0BFH ;输出横杠线
ACALL DL
MOV A,P2
RR A
MOV P2,A
MOV A,R6 ;取千位数
MOVC A,@A+DPTR
MOV P0,A
ACALL DL
MOV A,P2
RR A
MOV P2,A
MOV A,R7 ;取万位数
MOVC A,@A+DPTR
MOV P0,A
ACALL DL
RET
;延时一毫秒函数
DL: MOV IE,#00H
MOV TMOD,#10H ;工作方式1,
MOV TH1,#0FCH ;延时程序 延时一毫秒
MOV TL1,#18H
SETB TR1
STEP1:JBC TF1,STEP2
AJMP STEP1
STEP2:CLR TR1
RET
;延时47毫秒
DELAY:MOV IE,#00H
MOV TMOD,#10H ;工作方式1,
MOV TH1,#068H ;延时程序 计数初值6868貌似很准确
MOV TL1,#68H
SETB TR1
ST1:JBC TF1,ST2
AJMP ST1
ST2:CLR TR1
RET
TAB: DB 0C0H ;段码表 共阳
DB 0F9H
DB 0A4H
DB 0B0H
DB 99H
DB 92H
DB 82H
DB 0F8H
DB 80H
DB 90H
END
|