📄 main.asm
字号:
#include <def.inc>
ORG 0000H
JMP START
;-------- 1mS中断 ----------
ORG 000BH
JMP INT_T0
;-------- 外部中断1 ----------
ORG 0013H
MOV COUNT100uS, #0
RETI
;-------- 串口中断 ----------
ORG 0023H ;串行中断服务程序
JBC RI, RECEI
CLR TI ;发送
RETI
RECEI: MOV CMD, SBUF
RETI
;-------- T0 中断 ----------
INT_T0: PUSH PSW
PUSH ACC
CLR G1
CLR G2
INC COUNT100uS
MOV A, COUNT100uS
JNZ TO_0
MOV COUNT100uS, #G_OFF+1 ;若无同步信号。保证不触发
TO_0: CJNE A, T_G1, TO_1
SETB G1
TO_1: CJNE A, T_G2, TO_2
SETB G2
TO_2: DJNZ COUNT5mS, TO_3
MOV COUNT5mS, #50 ;50次100uS
SETB CLICK5mS
TO_3: POP ACC
POP PSW
RETI
;-------- 主程序 ----------
START: MOV SP, #NEWSP ;重置堆栈
;---------- 端口初始化 -----------
MOV P1M0, #00000000B ;IO初始化
MOV P1M1, #01100000B ;推挽:P1.5 P1.6
;--------- 定时器设置 ------------
MOV TMOD, #22h ; 都工作于8bit重置初值方式
MOV TH0, #DATA_T0 ;初值
SETB TR0 ;启动
MOV PCON, #10000000B ;设置波特率
MOV TH1, #DATA_T1
SETB TR1
;--------- 串口设置 ------------
MOV SCON, #01000000B ;设置串口工作方式
SETB REN
;--------- 中断设置 -------------
SETB IT1
MOV IE, #10010110B ; 开放C/T0、串口中断
;--------- 变量初始化 ------------
MOV CMD, #NO_CMD
CLR CLICK5mS
MOV COUNT_KEY, #N_KEY ;重置统计次数和初值
MOV COUNT_K_OFF1, #Kn_ORG
MOV COUNT_K_ON1, #Kn_ORG
MOV COUNT_K_OFF2, #Kn_ORG
MOV COUNT_K_ON2, #Kn_ORG
MOV COUNT_K_MODE, #Kn_ORG
MOV COUNT100uS, #G_OFF+1 ;若无同步信号。保证不触发
MOV N_G1, #11111111B
MOV N_G2, #11111111B
MOV T_G1, #G_OFF
MOV T_G2, #G_OFF
;--------- 主循环 --------------
MAINLOOP: JBC CLICK5mS, TASK_5mS ;如果5mS到, 则执行5mS任务
MOV A, CMD
CJNE A, #NO_CMD, TASK_CMDA ;如果指令非空, 则执行指令
JMP MAINLOOP
TASK_CMDA: JMP TASK_CMD
EXIT_5mSA: JMP EXIT_5mS
;-------- TASK5mS --------------------------
TASK_5mS: JB K_OFF1, T5mS_1 ;统计按键,按下则+1
INC COUNT_K_OFF1
T5mS_1: JB K_ON1, T5mS_2
INC COUNT_K_ON1
T5mS_2: JB K_OFF2, T5mS_3
INC COUNT_K_OFF2
T5mS_3: JB K_ON2, T5mS_4
INC COUNT_K_ON2
T5mS_4: JB K_MODE, T5mS_5
INC COUNT_K_MODE
T5mS_5: DJNZ COUNT_KEY, EXIT_5mSA ;没到统计次数,则退出
STA_KEY CMD_OFF1, COUNT_K_OFF1, STA_OFF1 ;CMD<=按键值
STA_KEY CMD_ON1, COUNT_K_ON1, STA_ON1
STA_KEY CMD_OFF2, COUNT_K_OFF2, STA_OFF2
STA_KEY CMD_ON2, COUNT_K_ON2, STA_ON2
STA_KEY CMD_MODE, COUNT_K_MODE, STA_MODE
MOV COUNT_KEY, #N_KEY ;重置统计次数和初值
MOV COUNT_K_OFF1, #Kn_ORG
MOV COUNT_K_ON1, #Kn_ORG
MOV COUNT_K_OFF2, #Kn_ORG
MOV COUNT_K_ON2, #Kn_ORG
MOV COUNT_K_MODE, #Kn_ORG
EXIT_5mS: JMP MAINLOOP
;---------- TASK_CMD --------------------------------
TASK_CMD: JNB CMD_OFF1, TCMD_1
MOV T_G1, #G_OFF ;执行按下 K_OFF1 操作
DEC N_G1 ;保证下次打开=上次关机状态
JMP TCMD_5
TCMD_1: JNB CMD_ON1, TCMD_2
INC N_G1 ;执行按下 K_ON1 操作
MOV DPTR, #TAB
MOV A, N_G1
ANL A, #00000111B ;选择4档
MOVC A, @A+DPTR
MOV T_G1, A
JMP TCMD_5
TCMD_2: JNB CMD_OFF2, TCMD_3
MOV T_G2, #G_OFF ;执行按下 K_OFF2 操作
DEC N_G2
JMP TCMD_5
TCMD_3: JNB CMD_ON2, TCMD_4
INC N_G2 ;执行按下 K_ON2 操作
MOV DPTR, #TAB
MOV A, N_G2
ANL A, #00000111B ;选择8档(循环5档)
MOVC A, @A+DPTR
MOV T_G2, A
JMP TCMD_5
TCMD_4: JNB CMD_MODE, TCMD_5
NOP ;执行按下 K_MODE 操作
TCMD_5: MOV CMD, #NO_CMD
JMP MAINLOOP
TAB:
DB 75 ;第0档值
DB 60 ; 1
DB 45 ; 2
DB 30 ; 3
DB 10 ; 4
DB 30 ; 5
DB 45 ; 6
DB 60 ; 7
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -