CHIP SN8P2501B
.CONST ;片内寄存器定义
PM_KEY EQU FP00M ;I/O模式寄存器 1=输出,0=输入
PM_LED30S EQU FP54M
PM_LED60S EQU FP10M
PM_OUT EQU FP13M ;
; I/O口数据寄存器
P_KEY EQU FP00
P_OUT EQU FP13 ;
P_LED30S EQU FP54
P_LED60S EQU FP10
.DATA ;RAM寄存器定义
TIME_2MS_COUNT DS 1
TIME_100MS_COUNT DS 1
TIME_1S_COUNT DS 1
CLOCK_1 DS 1
CLOCK DS 1
CLOCK_2 DS 1
CLOCK_3 DS 1
CLOCK_BUS DS 1
SUBS_KEY DS 1
TIME_1S DS 1
FLAG1 DS 1
F_2ms EQU FLAG1.0
F_100MS EQU FLAG1.1
F_1S EQU FLAG1.2
F_CHAO EQU FLAG1.3
GAOO DS 1
E1 EQU GAOO.0
E2 EQU GAOO.1
E3 EQU GAOO.2
E4 EQU GAOO.3
.CODE
ORG 00H
JMP RESET
ORG 08H
JMP INT
ORG 10H
RESET:
BCLR FGIE ;DISABLE INTERRUPT GAIN(关总断)
MOV A,#00000011B
MOV Stkp,A ;Initial stack pointer (堆栈寄存器复位)
CLR INTEN ;CLEAR WATCHDOG TIMER AND INITIAL SYSTEM MODE(中断寄存器请0
CLR INTRQ ; (溢出标志清0
CLR OSCM ; (震荡模式寄存器清00
CLR PFLAG FLAG = X,X,X,X,X,C,DC,Z
CALL RAM_REST
JMP IOREST
;*********************************************RAM通用区域利用数据指针@YZ数据清零********************************************
RAM_REST:
CLR Y
MOV A, #0X2F
MOV Z, A
ClrRAM10:
CLR @YZ
DECMS Z ;z = z - 1
JMP ClrRAM10
CLR @YZ
RET
;**********************************************************************************************************************
; 定时器TO定时初始化
MOV A,#01100000B ;DISABLE TC0,FCPU/4,FCPU/011
B0MOV T0M,A
MOV A,#06H
B0MOV T0C,A
CLR INTRQ ;(定时2ms)
B0BSET FT0ENB ;(开定时器)
B0BSET FT0IEN
NOP
NOP
; MOV A,#05H ;定时5秒数
; MOV CLOCK_BUS,A
;********************外中断初始化***********************
MOV A,#00010000B ;下降沿触发
B0MOV PEDGE,A
B0BCLR FP00IRQ
B0BSET FP00IEN
;************************************************************************
B0BSET FGIE
MAIN:
CLR TIME_2MS_COUNT
CLR TIME_100MS_COUNT
CLR SUBS_KEY
B0BCLR F_CHAO
B0BCLR PM_KEY ;端口初始化
B0BSET PM_OUT
B0BSET FP20M
B0BSET FP21M
B0BSET FP22M
B0BSET PM_LED30S
B0BSET PM_LED60S
B0BSET P_LED30S
B0BSET P_LED60S
MAIN_1:
MOV A,#05AH
B0MOV WDTR,A
CALL KK_KEY
NOP
NOP
NOP
NOP
CALL SUBS_01
JMP MAIN_1
;****************************************************************************************
WHENR:
B0BSET FP12
B0BTS1 F_1S
JMP MAIN_1
B0BCLR FP12
B0BCLR F_1S
WHEAR:
MOV A,#05AH
B0MOV WDTR,A
; CALL KK_KEY
CALL SUBS_01
B0BTS1 F_1S
JMP WHEAR
B0BCLR F_1S
; CALL KK_KEY
JMP MAIN_1
NOP
NOP
NOP
JMP RESET
NOP
NOP
NOP
JMP RESET
RET
;*********************按键处理程序**********************************************
KK_KEY:
B0BTS0 P_KEY
JMP KK_EXIT
CALL TINE_YANSHI
B0BTS0 P_KEY
JMP KK_EXIT
CALL TINE_YANSHI
B0BTS0 P_KEY
JMP KK_EXIT
CLR SUBS_KEY
CLR TIME_1S
B0BCLR P_OUT ;关灯
CLR TIME_2MS_COUNT
CLR TIME_100MS_COUNT
CLR CLOCK_BUS
B0BCLR F_CHAO
CLR GAOO
B0BCLR FP20
B0BSET P_LED30S
B0BSET P_LED60S
KK_EXIT:
RET
;*******************按键SUBS数据处理程序*************************************************
SUBS_01:
MOV A,#01H
CMPRS A,SUBS_KEY
JMP SUBS_02
B0BTS0 E1
JMP SUBS_02
B0BSET P_OUT
MOV A,#01CH ;定时5秒数
MOV CLOCK_BUS,A
B0BSET E1
B0BSET F_CHAO
B0BCLR P_LED30S
; CLR SUBS_KEY
JMP SUBS_EXRT
SUBS_02:
MOV A,#02H
CMPRS A,SUBS_KEY
JMP SUBS_EXRT
B0BTS0 E2
JMP SUBS_EXRT
B0BSET P_OUT
MOV A,#03AH ;定时30秒数
MOV CLOCK_BUS,A
B0BSET E2
B0BSET F_CHAO
B0BSET FP21
B0BSET P_LED30S
B0BCLR P_LED60S
CLR SUBS_KEY
SUBS_EXRT:
RET
;****************************************************************************************************************
TINE_YANSHI: ;1MS延时
MOV A,#0FFH
MOV CLOCK,A
MOV A,#0FEH
MOV CLOCK_1,A
TINM:
MOV A,#05AH
B0MOV WDTR,A
DECMS CLOCK
JMP TINM
MOV A,#0FEH
MOV CLOCK,A
DECMS CLOCK_1
JMP TINM
NOP
NOP
RET
;******************************中断服务程序******************************************************
INT:
PUSH
BTS0 FP00IRQ
JMP INT00
BTS0 FT0IRQ
JMP TC0INT
JMP TC1INT_EXIT
TC0INT:
BCLR FT0IRQ ;溢出标志位清O
MOV A,#0AH ;2ms计时初值
B0MOV T0C,A ;装T0的初值
INCMS TIME_2MS_COUNT
MOV A,#014H ; 49除以2=18H
SUB A,TIME_2MS_COUNT ;(如果A中的数小于2MS C=0)
BTS0 FC
JMP TC1INT_EXIT
CLR TIME_2MS_COUNT
INCMS TIME_100MS_COUNT
MOV A,#064H
SUB A,TIME_100MS_COUNT
BTS0 FC
JMP TC1INT_EXIT
CLR TIME_100MS_COUNT
BSET F_1S
;****************1秒定时器***********************
NOP
B0BTS1 F_CHAO
JMP TC1INT_EXIT
INCMS TIME_1S
MOV A,CLOCK_BUS
SUB A,TIME_1S
BTS0 FC
JMP TC1INT_EXIT
;*********************到时关机***************************
CLR TIME_1S
B0BCLR P_OUT ;关灯
CLR TIME_2MS_COUNT
CLR TIME_100MS_COUNT
CLR CLOCK_BUS
CLR SUBS_KEY
B0BCLR F_CHAO
CLR GAOO
B0BCLR FP20
B0BSET P_LED30S
B0BSET P_LED60S
JMP TC1INT_EXIT
;********************************************************
INT00:
B0BCLR FP00IRQ
B0BCLR FP00IEN
B0BTS0 P_KEY
JMP INT_EXT
CALL TEMP_01
B0BTS0 P_KEY
JMP INT_EXT
INCMS SUBS_KEY
INT_EXT:
B0BSET FP00IEN
JMP TC1INT_EXIT
TC1INT_EXIT:
POP
RET
;****************按键消除抖动*************
TEMP_01:
MOV A,#0FEH
MOV CLOCK_2,A
CLOCK__:
DECMS CLOCK_2
JMP CLOCK__
RET |