📄 ok.asm
字号:
K1 EQU P1.4
K2 EQU P1.5
K3 EQU P1.6
K4 EQU P1.7
CHUZHI EQU 30H
CISHU EQU 31H
KEYZHI EQU 32H
BHCZ EQU 33H
FLAG EQU 20H.0 ;亮红灯或亮绿灯的标志位
DG_1 EQU P2.2
DY_1 EQU P2.3
DR_1 EQU P2.4
DR_2 EQU P2.5
DY_2 EQU P2.6
DG_2 EQU P2.7
GEWEI EQU P2.0
SHIWEI EQU P2.1
;====================
ORG 0000H
AJMP START
ORG 001BH
AJMP INTT1
;=============初始化程序===================
START: MOV CHUZHI,#10
MOV 31H,#20
MOV SP,#60H
MOV TMOD,#10H
MOV TH1,#3cH
MOV TL1,#0b5H
SETB EA
SETB ET1
;=================主程序==========================
MAIN: ACALL DISPLAY
ACALL KEYSCAN
ACALL LED
JNB F0,MAIN ;判断是否有按键按下
CLR F0
ACALL KEY1
AJMP MAIN
;===================LED子程序===================
LED: MOV C,TR1
JNC LED_OFF ;是否开始倒计 是:亮 不是:全灭
JB FLAG,RED
GREEN: MOV A,CHUZHI
CLR C
SUBB A,#8
JNC g
LJMP SHANSHUO_1
g: CLR DG_1
CLR DR_2
SETB DG_2
SETB DR_1
SETB DY_1
SETB DY_2
LJMP OUT_LED
RED: MOV A,CHUZHI
CLR C
SUBB A,#8
JNC R
LJMP SHANSHUO_2
R: CLR DG_2
CLR DR_1
SETB DY_1
SETB DY_2
SETB DG_1
SETB DR_2
LJMP OUT_LED
YELLOW: SETB DG_1
SETB DR_2
SETB DG_2
SETB DR_1
CLR DY_1
CLR DY_2
LJMP OUT_LED
;==========闪烁============
SHANSHUO_1:MOV A,CHUZHI
CLR C
SUBB A,#2
JC YELLOW
CLR DG_1
ACALL DELAY_10
CLR DR_2
SETB DG_2
SETB DR_1
SETB DY_1
SETB DY_2
SETB DG_1
ACALL DELAY_2
LJMP OUT_LED
SHANSHUO_2:MOV A,CHUZHI
CLR C
SUBB A,#2
JC YELLOW
CLR DG_2
ACALL DELAY_10
CLR DR_1
SETB DY_1
SETB DY_2
SETB DG_1
SETB DR_2
SETB DG_2
ACALL DELAY_2
LJMP OUT_LED
LED_OFF:MOV P2,#0FFH
OUT_LED:RET
;===================按键扫描程序===========================
KEYSCAN:ACALL KEYS
JNZ QUDOU
LJMP FANHUI
QUDOU: ACALL DELAY_10
ACALL KEYS
JNZ DENGDAI
LJMP FANHUI
DENGDAI:MOV 32H,A ;保存键的位置
ACALL DISPLAY ;确保释放前有显示
ACALL KEYS
JNZ DENGDAI
SETB F0 ; 键释放后标志为1
FANHUI: RET
;=======判断是否有键按下==============
KEYS: MOV A,P1
CPL A
ANL A,#0F0H ;屏蔽无键的低四位
RET
;=====================判断按键及处理=========================
KEY1: MOV A,32H
JNB ACC.4,KEY2
CPL TR1 ;设置键按下停止倒计
MOV BHCZ,CHUZHI ;下次也按照设定的初值开始倒计
AJMP OUT
KEY2: JNB ACC.5,KEY3
MOV C,TR1
JC OUT ;是否先按下设置键 是:+10 不是:不处理
MOV A,CHUZHI
CLR C
SUBB A,#90
JNC QING0
MOV A,CHUZHI
ADD A,#10
MOV CHUZHI,A
AJMP OUT
KEY3: JNB ACC.6,KEY4
MOV C,TR1
JC OUT ;是否先按下设置键 是:+1 不是:不处理
MOV A,CHUZHI
CJNE A,#99,JIA1
QING0: MOV CHUZHI,#0
AJMP OUT
JIA1: ADD A,#1
MOV CHUZHI,A
AJMP OUT
KEY4: JNB ACC.7,OUT
CPL FLAG
OUT: RET
;================数码管显示程序==================
DISPLAY:MOV A,CHUZHI
MOV B,#10
DIV AB
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A
CLR P2.0
ACALL DELAY_2
SETB P2.0
MOV A,B
MOVC A,@A+DPTR
MOV P0,A
CLR P2.1
ACALL DELAY_2
SETB P2.1
RET
;================中断处理程序=====================
INTT1: CLR TF1
MOV TH1,#3cH
MOV TL1,#0b5H ;重新赋初值
DJNZ 31H,RETURN
MOV 31H,#20
DJNZ CHUZHI,RETURN
CPL FLAG ;标志位取反
MOV CHUZHI,BHCZ ;倒计到0后从新开始
RETURN: RETI
;===========2毫秒延时=============
NOP
DELAY_2: MOV 50H,#5
D_2: MOV 51H,#198
DJNZ 51H,$
DJNZ 50H,D_2
RET
;===========10毫秒延时=============
NOP
DELAY_10:MOV 50H,#25
D_10: MOV 51H,#198
DJNZ 51H,$
DJNZ 50H,D_10
RET
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\
TABLE:DB 3FH,06H,5BH,4FH,66H
DB 6DH,7DH,07H,7FH,6FH
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -