⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.asm

📁 嵌入式程序
💻 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 + -