📄 safeverfyback0508.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 01H ;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 中断返回
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
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 ;存在市电则置市电标志位
JMP VBAT_CHECK ;检测电池电压
CLR_VAC_FLAG: ;不存在市电情况处理
ANDIM STATUS_REG,0EH ;不存在市电则清除市电标志位
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
;=============================================================
// 时钟信号输入从低到高脉冲中断
SCK_SERVER:
// 保存堆栈
LDI IRQ,0H ;清标志
LDI IE,0H
LDI T0CON,0000B ;
LDI READ_DATA_COUNT,04H // 设置读取BIT次数
LDI READ_DATA_VALUE_TEMP,0H // 清空读数寄存器
CALL READ_BIT // 读取数据位
SBIM READ_DATA_COUNT,01H // 读取BIT次数 减1
BAZ $+2 // 若为0 则表示结束
JMP $-3 // 否则读下一个BIT
LDA READ_DATA_VALUE_TEMP // 将读取得数据保存到
STA SPI_BYTE_ONE_H
LDI READ_DATA_COUNT,04H // 设置读取BIT次数
LDI READ_DATA_VALUE_TEMP,0H // 清空读数寄存器
CALL READ_BIT // 读取数据位
SBIM READ_DATA_COUNT,01H // 读取BIT次数 减1
BAZ $+2 // 若为0 则表示结束
JMP $-3 // 否则读下一个BIT
LDA READ_DATA_VALUE_TEMP // 将读取得数据保存到
STA SPI_BYTE_ONE_L
LDA SPI_BYTE_ONE_H // 比较接收到的第一个数据高位为0,则继续,否则退出
BAZ $+2
JMP OUT_SERVER // 退出
LDI GEN_REG5,01H // 比较低位,若为1,则进入自检,若为3 则进入密码校验,否则退出
EOR SPI_BYTE_ONE_L,0H
BAZ CHECK_SELF // 自检
LDI GEN_REG5,03H
EOR SPI_BYTE_ONE_L,0H // 密码校验
BAZ VERIFY_SET
JMP OUT_SERVER // 退出
// if get data == 01 JUMP TO CHECKSELF
// if get data == 03 Jump to Verify password
CHECK_SELF:
// 发送状态码回去
LDI WRITE_REG_TEMP,01H
CALL WRITE_BIT
LDI WRITE_REG_TEMP,0H
CALL WRITE_BIT
LDI WRITE_REG_TEMP,0H
CALL WRITE_BIT
LDI WRITE_REG_TEMP,0H
CALL WRITE_BIT
LDI WRITE_REG_TEMP,0H
CALL WRITE_BIT
LDI WRITE_REG_TEMP,0H
CALL WRITE_BIT
LDI GEN_REG5,02H
AND STATUS_REG,0H
STA WRITE_REG_TEMP
CALL WRITE_BIT
LDI GEN_REG5,01H
AND STATUS_REG,0H
STA WRITE_REG_TEMP
CALL WRITE_BIT
JMP OUT_SERVER
VERIFY_SET:
// 接收剩下的两个BYTES 内容
// 第二个数据
LDI READ_DATA_COUNT,04H // 设置读取BIT次数
LDI READ_DATA_VALUE_TEMP,0H // 清空读数寄存器
CALL READ_BIT // 读取数据位
SBIM READ_DATA_COUNT,01H // 读取BIT次数 减1
BAZ $+2 // 若为0 则表示结束
JMP $-3 // 否则读下一个BIT
LDA READ_DATA_VALUE_TEMP // 将读取得数据保存到
STA SPI_BYTE_TWO_H
LDI READ_DATA_COUNT,04H // 设置读取BIT次数
LDI READ_DATA_VALUE_TEMP,0H // 清空读数寄存器
CALL READ_BIT // 读取数据位
SBIM READ_DATA_COUNT,01H // 读取BIT次数 减1
BAZ $+2 // 若为0 则表示结束
JMP $-3 // 否则读下一个BIT
LDA READ_DATA_VALUE_TEMP // 将读取得数据保存到
STA SPI_BYTE_TWO_L
// 第三个数据
LDI READ_DATA_COUNT,04H // 设置读取BIT次数
LDI READ_DATA_VALUE_TEMP,0H // 清空读数寄存器
CALL READ_BIT // 读取数据位
SBIM READ_DATA_COUNT,01H // 读取BIT次数 减1
BAZ $+2 // 若为0 则表示结束
JMP $-3 // 否则读下一个BIT
LDA READ_DATA_VALUE_TEMP // 将读取得数据保存到
STA SPI_BYTE_THREE_H
LDI READ_DATA_COUNT,04H // 设置读取BIT次数
LDI READ_DATA_VALUE_TEMP,0H // 清空读数寄存器
CALL READ_BIT // 读取数据位
SBIM READ_DATA_COUNT,01H // 读取BIT次数 减1
BAZ $+2 // 若为0 则表示结束
JMP $-3 // 否则读下一个BIT
LDA READ_DATA_VALUE_TEMP // 将读取得数据保存到
STA SPI_BYTE_THREE_L
// 发送密文回去
LDA SPI_BYTE_TWO_H
STA WRITE_BYTE_ONE_H
LDA SPI_BYTE_TWO_L
STA WRITE_BYTE_ONE_L
LDA SPI_BYTE_THREE_H
STA WRITE_BYTE_TWO_H
LDA SPI_BYTE_THREE_L
STA WRITE_BYTE_TWO_L
LDI GEN_REG5,08H
AND WRITE_BYTE_ONE_H,0H
STA WRITE_REG_TEMP
CALL WRITE_BIT
LDI GEN_REG5,04H
AND WRITE_BYTE_ONE_H,0H
STA WRITE_REG_TEMP
CALL WRITE_BIT
LDI GEN_REG5,02H
AND WRITE_BYTE_ONE_H,0H
STA WRITE_REG_TEMP
CALL WRITE_BIT
LDI GEN_REG5,01H
AND WRITE_BYTE_ONE_H,0H
STA WRITE_REG_TEMP
CALL WRITE_BIT
LDI GEN_REG5,08H
AND WRITE_BYTE_ONE_L,0H
STA WRITE_REG_TEMP
CALL WRITE_BIT
LDI GEN_REG5,04H
AND WRITE_BYTE_ONE_L,0H
STA WRITE_REG_TEMP
CALL WRITE_BIT
LDI GEN_REG5,02H
AND WRITE_BYTE_ONE_L,0H
STA WRITE_REG_TEMP
CALL WRITE_BIT
LDI GEN_REG5,01H
AND WRITE_BYTE_ONE_L,0H
STA WRITE_REG_TEMP
CALL WRITE_BIT
LDI GEN_REG5,08H
AND WRITE_BYTE_TWO_H,0H
STA WRITE_REG_TEMP
CALL WRITE_BIT
LDI GEN_REG5,04H
AND WRITE_BYTE_TWO_H,0H
STA WRITE_REG_TEMP
CALL WRITE_BIT
LDI GEN_REG5,02H
AND WRITE_BYTE_TWO_H,0H
STA WRITE_REG_TEMP
CALL WRITE_BIT
LDI GEN_REG5,01H
AND WRITE_BYTE_TWO_H,0H
STA WRITE_REG_TEMP
CALL WRITE_BIT
LDI GEN_REG5,08H
AND WRITE_BYTE_TWO_L,0H
STA WRITE_REG_TEMP
CALL WRITE_BIT
LDI GEN_REG5,04H
AND WRITE_BYTE_TWO_L,0H
STA WRITE_REG_TEMP
CALL WRITE_BIT
LDI GEN_REG5,02H
AND WRITE_BYTE_TWO_L,0H
STA WRITE_REG_TEMP
CALL WRITE_BIT
LDI GEN_REG5,01H
AND WRITE_BYTE_TWO_L,0H
STA WRITE_REG_TEMP
CALL WRITE_BIT
JMP OUT_SERVER
OUT_SERVER: // 释放堆栈
LDI T0CON,0010B ;定时器时钟源为外部时钟,
LDI IE,0100B
RTNI
// 等待高
// 读取数据
// 等待低
READ_BIT:
WAIT_HIGH:
LDA PSCK_PORT
BA3 GET_BIT_VALUE // 读取数据
JMP WAIT_HIGH // 等待高
GET_BIT_VALUE:
LDA PSDI_PORT
BA2 $+2 // 设置为1
JMP WAIT_LOW // 跳出
SBI READ_DATA_COUNT,04H
BAZ SAVE_READ_DATA_VALUEH4
SBI READ_DATA_COUNT,03H
BAZ SAVE_READ_DATA_VALUEH3
SBI READ_DATA_COUNT,02H
BAZ SAVE_READ_DATA_VALUEH2
JMP SAVE_READ_DATA_VALUEH1
SAVE_READ_DATA_VALUEH4:
ADIM READ_DATA_VALUE_TEMP,08H
JMP WAIT_LOW
SAVE_READ_DATA_VALUEH3:
ADIM READ_DATA_VALUE_TEMP,04H
JMP WAIT_LOW
SAVE_READ_DATA_VALUEH2:
ADIM READ_DATA_VALUE_TEMP,02H
JMP WAIT_LOW
SAVE_READ_DATA_VALUEH1:
ADIM READ_DATA_VALUE_TEMP,01H
JMP WAIT_LOW
WAIT_LOW:
LDA PSCK_PORT
BA3 WAIT_LOW
RTNI
/////////////////////////
// 写一个BIT
WRITE_BIT:
WAIT2LOW: // 等待低
LDA PSCK_PORT
BA3 WAIT2LOW
WRITE_BIT_VALUE: // 写数据
LDA WRITE_REG_TEMP
BAZ $+3
ORIM PSDO_PORT,02H
JMP $+2
ANDIM PSDO_PORT,0DH
WAIT2HIGH: // 等待高
LDA PSCK_PORT
BA3 $+2
JMP WAIT2HIGH
RTNI
////////////////////////
INCLUDE INIT_43.ASM
INCLUDE SYS_43.ASM
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -