📄 safeverfy.asm
字号:
;*****************************************************
;Company :
;File Name : SafeVerfy.asm
;Author :
;Create Data : 2006-04-24
;Last Modified : 2006-04-24
;Description :
;Version : 1.0
;*****************************************************
//市电AD输入判断 PA.0
VAC_AD_COMPL EQU 0BH ;0.9V
VAC_AD_COMPH EQU 04H ;0.9V
VAC_AD_IN EQU 01H
VAC_AD_PCON EQU 18H
VAC_AD_PORT EQU 08H
//电池AD输入判断 PA.1
VBAT_AD_COMPL EQU 08H ;2.4V 0A
VBAT_AD_COMPH EQU 07H ;2.4V
VBAT_AD_IN EQU 02H
VBAT_AD_PCON EQU 18H
VBAT_AD_PORT EQU 08H
//电池充电控制输出 PB.0
CHG_OUT EQU 01H
CHG_OUT_PCON EQU 19H
CHG_OUT_PORT EQU 09H
// SPI SCK时钟线控制输入 PC.3
PSCK EQU 08H
PSCK_PCON EQU 1AH
PSCK_PORT EQU 0AH
// SPI PSDO数据线控制输入 PE.1
PSDO EQU 02H
PSDO_PCON EQU 1CH
PSDO_PORT EQU 0CH
// SPI PSDI数据线控制输入 PE.2
PSDI EQU 04H
PSDI_PCON EQU 1DH
PSDI_PORT EQU 0CH
//5个通用寄存器
GEN_REG1 EQU 30H
GEN_REG2 EQU 31H
GEN_REG3 EQU 32H
GEN_REG4 EQU 33H
GEN_REG5 EQU 34H
//市电输入AD缓存寄存器
VAC_AD_TEMPL EQU 36H
VAC_AD_TEMPH EQU 37H
//电池输入AD缓存寄存器
VBAT_AD_TEMPL EQU 38H
VBAT_AD_TEMPH EQU 39H
// 状态寄存器
STATUS_REG EQU 3AH
READ_DATA_VALUE_TEMP EQU 3BH //读取数值缓存区
WRITE_REG_TEMP EQU 3CH
READ_DATA_COUNT EQU 40H //读取数值位次数
SPI_BYTE_ONE_H EQU 41H //读取数值高
SPI_BYTE_ONE_L EQU 42H //读取数值低
SPI_BYTE_TWO_H EQU 43H
SPI_BYTE_TWO_L EQU 44H
SPI_BYTE_THREE_H EQU 45H
SPI_BYTE_THREE_L EQU 46H
WRITE_BYTE_ONE_H EQU 47H
WRITE_BYTE_ONE_L EQU 48H
WRITE_BYTE_TWO_H EQU 49H
WRITE_BYTE_TWO_L EQU 4AH
WRITE_BYTE_THREE_H EQU 4BH
WRITE_BYTE_THREE_L EQU 4CH
ORG 0000H
JMP START ;START PROGRAM
RTNI ;AD 中断返回
RTNI
//JMP SCK_SERVER ;T0 中断
RTNI ;T1 中断
RTNI ;EX 中断
;**** START PROGRAM ***
START:
CALL INITMCU ;初始化单片机寄存器,中断等
CALL INITREG ;初始化寄存器
;********** 主程序 *****************
MAIN:
CALL AD_INPUT
CALL CHARGE_SET
CALL DELAY
CALL DELAY
JMP MAIN
/////////////////////////////////////////////////
// 初始化寄存器
INITREG:
LDI GEN_REG1,0H
LDI GEN_REG2,0H
LDI GEN_REG3,0H
LDI VAC_AD_TEMPL,0H
LDI VAC_AD_TEMPH,0H
LDI VBAT_AD_TEMPL,0H
LDI VBAT_AD_TEMPH,0H
LDI STATUS_REG,0H
//LDI T0CON,0010B ;定时器时钟源为外部时钟,
RTNI
/////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
//检测市电 电池电压 AD转换输入
AD_INPUT:
// AD 市电 输入
LDI ADCH,1000B
NOP
LDI ADCON,1001B
NOP
WAIT_LOOP:
NOP
LDA ADCON
BA3 WAIT_LOOP
NOP
NOP
LDA ADRESH ;A/D 转换完成,存储转换结果。
STA VAC_AD_TEMPH
LDA ADRESL
STA VAC_AD_TEMPL
NOP
// AD 电池 输入
LDI ADCH,1001B
NOP
LDI ADCON,1001B
NOP
WAIT_LOOP2:
NOP
LDA ADCON
BA3 WAIT_LOOP2
NOP
NOP
LDA ADRESH ;A/D 转换完成,存储转换结果。
STA VBAT_AD_TEMPH
LDA ADRESL
STA VBAT_AD_TEMPL
NOP
RTNI
////////////////////////////////////////////////////////////
// 充电处理
CHARGE_SET:
// 检测市电电压
SBI VAC_AD_TEMPH,VAC_AD_COMPH
BC SET_VAC_FLAG ;存在市电
BAZ COMP_VACL
JMP CLR_VAC_FLAG ;不存在市电情况处理
COMP_VACL:
SBI VAC_AD_TEMPL,VAC_AD_COMPL
BC SET_VAC_FLAG ;存在市电
JMP CLR_VAC_FLAG ;不存在市电情况处理
SET_VAC_FLAG: ;存在市电
ORIM STATUS_REG,01H ;存在市电则置市电标志位
ORIM PSDO_PORT,02H ;若存在市电则将该管脚置高
JMP VBAT_CHECK ;检测电池电压
CLR_VAC_FLAG: ;不存在市电情况处理
ANDIM STATUS_REG,0EH ;不存在市电则清除市电标志位
ANDIM PSDO_PORT,0DH ;若不存在市电则将该管脚置低
JMP VBAT_CHECK ;检测电池电压
//检测电池电压
VBAT_CHECK:
SBI VBAT_AD_TEMPH, VBAT_AD_COMPH ;VBAT_AD_COMPH
BC SET_VBAT_FLAG ;电池充满
BAZ COMP_VBATL ;比较电池电压低位
JMP CLR_VBAT_FLAG ;电池电量不够
COMP_VBATL: ;比较电池电压低位
SBI VBAT_AD_TEMPL,VBAT_AD_COMPL
BC SET_VBAT_FLAG ;电池充满
JMP CLR_VBAT_FLAG ;电池电量不够
SET_VBAT_FLAG: ;电池充满
ORIM STATUS_REG,02H ;存在市电则置市电标志位
JMP CHARGE_CTRL ;检测电池电压
CLR_VBAT_FLAG: ;电池电量不够
ANDIM STATUS_REG,0DH ;不存在市电则清除市电标志位
JMP CHARGE_CTRL ;检测电池电压
CHARGE_CTRL:
LDI GEN_REG1,01H
EOR STATUS_REG,0H
BAZ $+3
LDI CHG_OUT_PORT,0H ;关闭充电
JMP $+2
LDI CHG_OUT_PORT,0FH ;充电
RTNI
;=============================================================
;延时子程序(5ms)
DELAY:
LDI GEN_REG2,0
LDI GEN_REG3,0
DELAY2:
NOP ;
NOP
NOP
NOP
NOP
ADIM GEN_REG3,1
LDI GEN_REG1,0
ADCM GEN_REG2
BC $+2
JMP DELAY2
RTNI
;=============================================================
INCLUDE INIT_43.ASM
INCLUDE SYS_43.ASM
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -