📄 new.asm
字号:
;说明,复位是数码管将显示68的计时初值,此时可按下启动键或设置键(后两键同时按下)
;而此时后两键是分别被屏蔽的,只有进入了设置状态才有效。进入设置状态后,当前正置数的
;数位相应数码管的小数点会亮。右边的键是增值键,每按一次相应的位会加一,中间的是跳位键
;设值时在个位和十位中跳转。
BITF BIT 00H
SETF BIT 01H
WORKF BIT 03H
ORG 0000H
LJMP 0100H
ORG 001BH
LJMP 0350H
ORG 0100H
MOV TMOD,#11H
MOV IE,#88H
CLR BITF
CLR SETF
CLR WORKF
MOV R2,#08H ;RESET THE SYSTEM,INITIAL THE VALUE 68S
MOV R3,#06H
MOV DPTR,#TAB
MAIN: MOV A,R2
MOVC A,@A+DPTR
JNB SETF,CONTI
JB BITF,CONTI
ORL A,#20H
CONTI: MOV P0,A
MOV P2,#0AFH
ORL P2,#0FH
ACALL DELAY
MOV A,R3
MOVC A,@A+DPTR
JNB SETF,CONTI2
JNB BITF,CONTI2
ORL A,#20H
CONTI2: MOV P0,A
MOV P2,#5FH
ORL P2,#0FH
ACALL DELAY
JB WORKF,MAIN
MOV A,P2 ;TEST THE KEY
ORL A,#0F8H
CPL A
JZ MAIN
EASY: MOV R0,#14H ;20MS DELAY
SUBEA: ACALL DELAY
DJNZ R0,SUBEA ;20MS DELAY
MOV A,P2 ;TEST THE KEY AGAIN
ORL A,#0F8H
CPL A
JZ MAIN
MOV 40H,A ;SAVE THE VALUE OF KEY
TEST: CJNE A,#01H,TEST1
CALL ADDP ;IF THE KEY "ADD" WAS PUSHED
JMP FINISH
TEST1: CJNE A,#02H,TEST2
CALL SHIFT ;IF THE HDY "SHIFT" WAS PUSHED
JMP FINISH
TEST2: CJNE A,#03H,TEST3
SETB SETF ;IF BOTH THE "ADD" AND "SHIFT" WERE BUSHED
JMP FINISH ;IT MEANS ENTER THE SETTING MODE
TEST3: CJNE A,#04H,FINISH
CALL START
FINISH: JMP MAIN
;////////////////////////////////////////////////////////
DELAY: MOV R6,#0AH ;1MS DELAY
DL2: MOV R7,#18H
DL1: NOP
NOP
DJNZ R7,DL1
DJNZ R6,DL2
RET ;1MS DELAY
;////////////////////////////////////////////////////
ORG 0250H
ADDP: JB SETF,NEXT ;MASK THE KEY,WHEN IT IS NOW IN THE NORMAL MODE
RET
NEXT: MOV A,P2 ;等待松键
ORL A,#0F8H
CPL A
JNZ NEXT
JB BITF,TWO ;结果不为0说明当前的是十位
CJNE R2,#09H,SMALL ;检测个位是否已等于9
MOV R2,#00H ;等于9重置为0
RET
SMALL: INC R2 ;不等于9自增
RET
TWO: CJNE R3,#09H,SMALL2 ;按键表示要置十位
MOV R3,#00H
RET
SMALL2: INC R3
RET
;/////////////////////////////////////////////////////////
ORG 0300H ;位选择程序
SHIFT: JB SETF,NEXT2
RET
NEXT2: MOV A,P2 ;等待松键
ORL A,#0F8H
CPL A
JNZ NEXT2
JB BITF,SW ;标心位为一则说明当前在十位
SETB BITF ;否则在个位则要变为十位
RET
SW: CLR BITF ;否则选中个位
RET
;////////////////////////////////////////////////////////
ORG 0320H ;确定按键响应程序
START: CLR SETF
SETB WORKF
NEXT3: MOV A,P2 ;等待松键
ORL A,#0F8H
CPL A
JNZ NEXT3
MOV R5,#32H ;1000MS为一秒
MOV 43H,R3
MOV 42H,R2
MOV TH1,#0B1H ;20ms的初值
MOV TL1,#0E0H
SETB TR1
MOV P1,#0EEH ;亮红绿灯
RET
;///////////////////////////////////////////////////////////
ORG 0350H ;倒计时程序
DJNZ R5,GOON
MOV A,R2
ORL A,R3
JNZ NOEND ;1s到,计时没完成就跳转
MOV R2,42H
MOV R3,43H
MOV A,P1
RL A
MOV P1,A ;改变灯色
ORL P1,#20H ;灭黄灯
MOV R5,#32H ;重置20ms初值
MOV TH1,#0B1H
MOV TL1,#0E0H
SETB TR1
RETI
GOON: MOV TH1,#0B1H ;1s未到
MOV TL1,#0E0H
SETB TR1
RETI
NOEND: MOV A,R2
ADD A,#0
JNZ NOOVER
MOV R2,#09H
DEC R3
JMP MOVEON
NOOVER: DEC R2
JMP MOVEON
MOVEON: CJNE R3,#00H,NOYL ;判断是否还有五秒钟
CJNE R2,#05H,NOYL
ANL P1,#0DBH ;是则亮黄灯11111100B
NOYL: MOV R5,#32H
MOV TH1,#0B1H ;重装1S计时初值
MOV TL1,#0E0H
SETB TR1
RETI ;否则不变
;/////////////////////////////////////////////////////////////
TAB: DB 0CFH
DB 0CH
DB 5BH
DB 5DH
DB 9CH
DB 0D5H
DB 0D7H
DB 4CH
DB 0DFH
DB 0DDH
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -