给你思路,下面是我用合泰搞的产品部分程序(因商业原因,没给出完整程序).里面有睡眠功能,要在主程序里判断要不要进入sleep等
#include "ht48R063.inc"
#define wenkong pa.4
#define baojing pa.5 ;报警输出脚
#define shuiyin pa.3 ;水银检测脚
#define open pa.2 ;开门行程检测
#define openac pac.2
sysdata .section 'data'
acc_bak db ?
keydwn_t db ?
status_bak db ?
t_125us db ?
buz_len db ?
sec2_halt db ?
t_second db ?
baojing_time db ?
tem1 db ?
f_baojing equ tem1.0 ;报警标志位
position_close equ tem1.1 ;close行程开关标志位
position_open equ tem1.2 ;open行程开关标志位
halt_b equ tem1.3 ;进入睡眠状态的标志位
f_shuiyin_press equ tem1.4
shuiyin_time db ?
time_1sec db ?
door_open_time db ?
n_baojing db ?
;*****************程序开始*****************
;******************************************
code .section 'code'
org 000h
jmp reset
org 004h ;外部中断0
jmp ext0_interrupt
org 008h ;定时器0中断
jmp t0_isr
org 0ch ;定时器1中断
reti
org 10h ;A/D中断,没用到,返回
reti
;*****************************************
reset:
snz STATUS.4 ;PD位(位4)=0,则是系统上电或执行CLR WDT, 执行HALT则置1.
jmp INITIAL ;是上电,则执行初始化操作
mov a,00000111b
mov wdts,a
mov A,00000000B ;晶振采用内部的RC(4MHZ)---HIRC,定时器timer0
mov CTRL0,A
mov a,10000101b ;允许WDT中断---WDT时钟来源于内部的RC振荡器,下降沿触发中断
mov CTRL1,A
mov a,00011100b
mov PAC,A
mov a,00011100b
mov PAPU,A
mov a,00011000b
mov PAWK,a
mov a,00000000b
mov PBPU,A
mov a,00000000b
mov pbc,a
jmp OKWORK ;执行halt指令后,还要判断是WDT是在sleep模式溢出(STATUS.5=1)还是正常模式溢出(STATUS.5不定)
INITIAL:
mov a,00000111b
mov wdts,a
mov A,00000000B ;晶振采用内部的RC(4MHZ)---HIRC,定时器timer0
mov CTRL0,A
mov a,10000101b ;允许WDT中断---WDT时钟来源于内部的RC振荡器,下降沿触发中断
mov CTRL1,A
mov a,00011100b
mov PAC,A
mov a,00011100b
mov PAPU,A
mov a,00011000b
mov PAWK,a
mov a,00011100b
mov PA,A
mov a,00000000b
mov PBPU,A
mov a,00000000b
mov pbc,a
mov a,00000000b
mov pb,a
OKWORK:
snz status.5 ;PD位(位5)=0,则是系统上电或执行CLR WDT, 执行HALT则置1.
jmp inital_ram ;为0,则执行初始化
jmp sleep_man
inital_ram:
mov a,40h ;清ram变量
mov mp0,a
clrram_loop:
clr iar0
siz mp0
jmp clrram_loop ;clr ram
mov a,256-125 ;125uS中断一次(4MZH,分频率为4)
mov tmr0,a
mov a,92h
mov tmr0c,a
mov a,00000111b ;定时0中断,外中断,全局中断
mov intc0,a
mov a,1
mov sec2_halt,a
;****************主程序区*************
;*************************************
main:
mov a,t_125us
sub a,40
snz c ;到了5mS吗
jmp main ;没到,则跳到main
main1:
clr t_125us ;到了,则清t_125us变量
snz halt_b ;halt_b 等于1则进入睡眠状态
jmp $+2 ;为0则正常执行指令
jmp sleep_man ;睡眠管理
clr wdt ;喂狗
call key_scan_man ;按键扫描管理
call open_inspection_man ;开门行程开关检测管理
call time_man ;时间管理
call baojing_man ;报警输出管理
call sleep_test
jmp main
;***************************************
;**************睡眠管理*****************
sleep_man:
clr baojing_time
clr baojing
clr halt_b
mov a,00011000b
mov PAC,A
mov a,00011000b
mov PAPU,A
mov a,00011000b
mov PAWK,a
mov a,00011000b
mov PA,A
halt ;进入睡眠状态.
sleep_man1:
nop
nop
mov a,00011100b
mov PAC,A
mov a,00011100b
mov PAPU,A
mov a,00011000b
mov PAWK,a
mov a,00011100b
mov PA,A
mov a,10
mov sec2_halt,a ;唤醒后,键灯点亮10S
jmp main1 ;返回到主程序 |