📄 p08003-1.asm
字号:
INCLUDE "ADAM42K.LIB"
ESD1 EQU 00H
ESD2 EQU 01H
PUSH_A EQU 10H
TIME0_MARK EQU 11H
TIME1_MARK EQU 12H
VARIABLE1 EQU 13H
VARIABLE2 EQU 14H
DELAY_C EQU 16H
PBDR_MARK EQU 17H
PHDR_MARK EQU 18H
PWM_LOCK EQU 20H
PWM_GRADE1 EQU 21H
PWM_GRADE2 EQU 22H
PWM_GRADE3 EQU 23H
I_STANDARD1 EQU 24H
I_STANDARD2 EQU 25H
ESD3 EQU 40H
FLASH_M EQU 50H
FLASH_C1 EQU 51H
FLASH_C2 EQU 52H
FLASH_C3 EQU 53H
FLASH_CX1 EQU 54H
FLASH_CX2 EQU 55H
FLASH_CX3 EQU 56H
I_MARK EQU 60H
I1_DATA1 EQU 61H
I2_DATA1 EQU 62H
I3_DATA1 EQU 63H
I1_DATA2 EQU 64H
I2_DATA2 EQU 65H
I3_DATA2 EQU 66H
FINISH_M EQU 67H
FINISH_C1 EQU 68H
FINISH_C2 EQU 69H
FINISH_C3 EQU 6AH
ESD4 EQU 80H
ADCR1_M EQU 90H
ADCR2_M EQU 91H
ADCR3_M EQU 92H
ADCR1_S1 EQU 93H
ADCR2_S1 EQU 94H
ADCR3_S1 EQU 95H
ADCR1_S2 EQU 96H
ADCR2_S2 EQU 97H
ADCR3_S2 EQU 98H
ADCR1_S3 EQU 99H
ADCR2_S3 EQU 9AH
ADCR3_S3 EQU 9BH
ADCR1_S4 EQU 9CH
ADCR2_S4 EQU 9DH
ADCR3_S4 EQU 9EH
ADCR1_S5 EQU 9FH
ADCR2_S5 EQU 0A0H
ADCR3_S5 EQU 0A1H
ADCR1_S6 EQU 0A2H
ADCR2_S6 EQU 0A3H
ADCR3_S6 EQU 0A4H
ADCR1_S7 EQU 0A5H
ADCR2_S7 EQU 0A6H
ADCR3_S7 EQU 0A7H
ADCR1_S8 EQU 0A8H
ADCR2_S8 EQU 0A9H
ADCR3_S8 EQU 0AAH
ADCR1_S9 EQU 0ABH
ADCR2_S9 EQU 0ACH
ADCR3_S9 EQU 0ADH
ESD5 EQU 0B0H
PV_ADCR1 EQU 0B1H
PV_ADCR2 EQU 0B2H
PV_ADCR3 EQU 0B3H
PV_ADCR1_S EQU 0B4H
PV_ADCR2_S EQU 0B5H
PV_ADCR3_S EQU 0B6H
PV_ADCRX_S EQU 0B7H
PV_ADCRXX_S EQU 0B8H
PV_LOGIC1 EQU 0B9H
PV_LOGIC2 EQU 0BAH
PV_MARK EQU 0BBH
BV_ADCR1 EQU 0BCH
BV_ADCR2 EQU 0BDH
BV_ADCR3 EQU 0BEH
BV_ADCR1_S EQU 0BFH
BV_ADCR2_S EQU 0C0H
BV_ADCR3_S EQU 0C1H
BV_ADCRX_S EQU 0C2H
BV_LOGIC EQU 0C3H
BV_MARK EQU 0C4H
ESD6 EQU 0FEH
ESD7 EQU 0FFH
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OPTION=11110111
; ORG 0000H
WDTC
BR !RESET
WDTC
BR !RESET
WDTC
BR !RESET
LDM TIME0_MARK,#1111B ;定时器0溢出,给自己定义的寄存器赋值
RETI
LDM TIME1_MARK,#1111B ;定时器1溢出,给自己定义的寄存器赋值
RETI
WDTC
BR !RESET
WDTC
BR !RESET
WDTC
BR !RESET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
RESET:
DI
SPC
WDTC
LRI TOPSR,#0001B ;初始化IO口的使用模式
LRI EIPSR,#0000B
LRI APSR1,#0000B
LRI APSR2,#0000B
LRI R1OD,#0001B ;0-低电平才有驱动能力
LRI R1PC,#1111B ;1-没有上拉电阻
LRI R1DD,#0001B ;0-输入状态
LRI R1DR,#1110B ;1-送数固定状态
LRI R1ST,#1111B ;1-IO不可以唤醒IC
LRI PBOD,#1111B
LRI PBPC,#1111B
LRI PBDD,#1111B
LRI PBDR,#1001B
LRI PBST,#1111B
LRI PGOD,#0000B
LRI PGPC,#1111B
LRI PGDD,#0000B
LRI PGDR,#1111B
LRI PGST,#1111B
LRI PHOD,#0000B
LRI PHPC,#0000B
LRI PHDD,#0000B
LRI PHDR,#1111B
LRI APSR1,#0000B ;设置PG0口为参考电压输入
LRI ADCIS,#1000B
LRI WACR,#1010B ;看门狗和AD寄存器初始化
LRI ADCM,#1001B
LRI T01MR,#0000B ;把T0的方波送到ROUT,之后设置PWM口输出ROUT信号
LRI CGMR,#1100B ;初始化载波发生器
LRI RCR,#0110B
CALL !CL_RAM ;L清除所有RAM
LDM ESD1,#0101B ;特殊处理,可以不用管
LDM ESD2,#0101B
LDM ESD3,#0101B
LDM ESD4,#0101B
LDM ESD5,#0101B
LDM ESD6,#0101B
LDM ESD7,#0101B
LDM PBDR_MARK,#1001B
LDM PWM_GRADE1,#0
LDM PWM_GRADE2,#0
LDM PWM_GRADE3,#0
LDM I_STANDARD1,#0 ;1CH=250MA 5CH=950MA
LDM I_STANDARD2,#0
RESET_VOL:
CALL !PVOLTAGE_F
CALL !SLOW_F
CMNE PV_LOGIC1,#0
BR !RESET_VOL
CMNE PV_LOGIC2,#0
BR !RESET_VOL
CALL !BVOLTAGE_F
LRI IEDS,#0000B ;中断标识初始化
LRI IENR,#1000B
LRI IENR2,#0000B
LRI IRQR,#0000B
LRI IRQR2,#0000B
LRI CGHMD,#0001B
LRI CGHLD,#1001B
LRI CGLMD,#0001B
LRI CGLLD,#1001B
LRI CGMR,#1001B
LRI T1HD,#0111B ;定时器1初始化
LRI T1LD,#1000B
LRI T1MR,#1111B ;开启定时器1
LRI ABR0,#<PWM_TAB
LRI ABR1,#>PWM_TAB
LRI ABR2,#[PWM_TAB
LRI ABR3,#]PWM_TAB
CLRC
LDA PWM_GRADE1
ADDC ABR0,A
LDA PWM_GRADE2
ADDC ABR1,A
LDA PWM_GRADE3
ADDC ABR2,A
ADDC ABR3,#0
LDW @ABR ;把表值读取出来
CALL !LOAD_PWM ;装载time0数据,开启TIME0计数器,把time0送到PB2输出PWM信号
EI
BR !TIME_1_1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;MAIN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TIME_1:
WDTC
LDM TIME0_MARK,#0000B
LDM TIME1_MARK,#0000B
;FUNCTION
LRI ABR0,#<PWM_TAB
LRI ABR1,#>PWM_TAB
LRI ABR2,#[PWM_TAB
LRI ABR3,#]PWM_TAB
CLRC
LDA PWM_GRADE1
ADDC ABR0,A
LDA PWM_GRADE2
ADDC ABR1,A
LDA PWM_GRADE3
ADDC ABR2,A
ADDC ABR3,#0
LDW @ABR ;把表值读取出来
DI
LRI IENR,#1100B
LRI IRQR,#0000B
EI
PWM_INT:
CMNE TIME0_MARK,#1111B
BR !PWM_INT
CALL !LOAD_PWM
DI
LRI IENR,#1000B
LRI IRQR,#0000B
EI
CALL !SLOW_F
CALL !FLASH_F
CALL !PVOLTAGE_F
CALL !BVOLTAGE_F
CALL !CURRENT_F
CALL !FINISH_F
CALL !ESD
;FUNCTION
TIME_1_1:
CMNE TIME1_MARK,#1111B
BR !TIME_1_1
BR !TIME_1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;FIRST LAYER
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
FINISH_F:
CMNE PV_MARK,#0
BR !FINISH_F_A
CLRC
SUBC I1_DATA1,#06H
SUBC I2_DATA1,#01H
TSTC
BR !FINISH_F_1
FINISH_F_A:
LDM FINISH_C1,#0
LDM FINISH_C2,#0
LDM FINISH_C3,#0
LDM FINISH_M,#0
RET
FINISH_F_1:
CLRC
ADDC FINISH_C1,#1
LDM FINISH_C1,A
ADDC FINISH_C2,#0
LDM FINISH_C2,A
ADDC FINISH_C3,#0
LDM FINISH_C3,A
CLRC
SUBC FINISH_C1,#05H
SUBC FINISH_C2,#00H
SUBC FINISH_C3,#0DH
TSTC
BR !FINISH_F_2
FINISH_F_R:
LDM FINISH_M,#1111B
LRI R1DR,#1111B
LRI PBDR,#0000B
LRI TOPSR,#0000B
LRI T0MR,#0000B
LRI T1MR,#0011B
CALL !ESD
WDTC
BR !FINISH_F_R
FINISH_F_2:
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SLOW_F:
LAR PHDR ;读取IO口状态
LDM VARIABLE1,A
LDA #0100B
AND VARIABLE1
LDM VARIABLE1,A
XOR PHDR_MARK ;和原来IO口的值比较
LDM VARIABLE2,A ;存起发生改变的输入口
CANE #0
BR !SLOW_F_1 ;如果不同就进行去抖处理,相同就没有任何事情发生
LDM DELAY_C,#0
RET
SLOW_F_1:
CLRC
ADDC DELAY_C,#1 ;去抖处理寄存器加1
LDM DELAY_C,A
TSTC
BR !SLOW_F_2
RET
SLOW_F_2:
LDM DELAY_C,#0
LDA VARIABLE1 ;去抖结束后把输入按键最新值放入状态寄存器保存
XMA PHDR_MARK
CALL !SET_CURRENT
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CURRENT_F:
CALL !I_AD_F
LDA ADCR1_M
LDM ADCR1_S1,A
LDA ADCR2_M
LDM ADCR2_S1,A
LDA ADCR3_M
LDM ADCR3_S1,A
CALL !I_AD_F
LDA ADCR1_M
LDM ADCR1_S2,A
LDA ADCR2_M
LDM ADCR2_S2,A
LDA ADCR3_M
LDM ADCR3_S2,A
CALL !I_AD_F
LDA ADCR1_M
LDM ADCR1_S3,A
LDA ADCR2_M
LDM ADCR2_S3,A
LDA ADCR3_M
LDM ADCR3_S3,A
CALL !I_AD_F
LDA ADCR1_M
LDM ADCR1_S4,A
LDA ADCR2_M
LDM ADCR2_S4,A
LDA ADCR3_M
LDM ADCR3_S4,A
CALL !I_AD_F
LDA ADCR1_M
LDM ADCR1_S5,A
LDA ADCR2_M
LDM ADCR2_S5,A
LDA ADCR3_M
LDM ADCR3_S5,A
CALL !I_AD_F
LDA ADCR1_M
LDM ADCR1_S6,A
LDA ADCR2_M
LDM ADCR2_S6,A
LDA ADCR3_M
LDM ADCR3_S6,A
;取出6个数中间的2个数据
LDM I_MARK,#0
CALL !I_ANALYSE
CALL !I_ANALYSE
LDM I_MARK,#1
CALL !I_ANALYSE
LDA I1_DATA2
LDM I1_DATA1,A
LDA I2_DATA2
LDM I2_DATA1,A
LDA I3_DATA2
LDM I3_DATA1,A
CALL !I_ANALYSE
;求2个数的平均值
CLRC
LDA I1_DATA2
ADDC I1_DATA1,A
LDM I1_DATA1,A
LDA I2_DATA2
ADDC I2_DATA1,A
LDM I2_DATA1,A
LDA I3_DATA2
ADDC I3_DATA1,A
LDM I3_DATA1,A
LDA I3_DATA1 ;右移
ARRC
LDM I3_DATA1,A
LDA I2_DATA1
ARRC
LDM I2_DATA1,A
LDA I1_DATA1
ARRC
LDM I1_DATA1,A
;按照测试出来的电流去控制PWM
CLRC
LDA I_STANDARD1
SUBC I1_DATA1,A
LDM VARIABLE1,A
LDA I_STANDARD2
SUBC I2_DATA1,A
LDM VARIABLE2,A
TSTC
BR !CURRENT_F_2
CMNE VARIABLE2,#0 ;分级别降低电流
BR !CURRENT_F_A
CMLE VARIABLE1,#8
BR !CURRENT_F_Y
BR !CURRENT_F_W
CURRENT_F_A:
CMNE VARIABLE2,#1
BR !CURRENT_F_B
CMLE VARIABLE1,#8
BR !CURRENT_F_W
BR !CURRENT_F_V
CURRENT_F_B:
CMNE VARIABLE2,#2
BR !CURRENT_F_U
BR !CURRENT_F_V
CURRENT_F_U:
CLRC
SUBC PWM_GRADE1,#4
LDM PWM_GRADE1,A
BR !CURRENT_F_Z
CURRENT_F_V:
CLRC
SUBC PWM_GRADE1,#3
LDM PWM_GRADE1,A
BR !CURRENT_F_Z
CURRENT_F_W:
CLRC
SUBC PWM_GRADE1,#2
LDM PWM_GRADE1,A
BR !CURRENT_F_Z
CURRENT_F_Y:
CLRC
SUBC PWM_GRADE1,#1
LDM PWM_GRADE1,A
CURRENT_F_Z:
SUBC PWM_GRADE2,#0
LDM PWM_GRADE2,A
SUBC PWM_GRADE3,#0
LDM PWM_GRADE3,A
TSTC
BR !CURRENT_F_1
LDM PWM_LOCK,#0001B
RET
CURRENT_F_1:
LDM PWM_GRADE1,#0
LDM PWM_GRADE2,#0
LDM PWM_GRADE3,#0
LDM PWM_LOCK,#0000B
RET
CURRENT_F_2:
TM BV_MARK.#0 ;如果电压超过8.4V就PWM减少
BR !CURRENT_F_Y
CLRC
SUBC PWM_GRADE1,#0CH
SUBC PWM_GRADE2,#1
SUBC PWM_GRADE3,#2
TSTC
BR !CURRENT_F_3
LDM PWM_GRADE1,#0CH
LDM PWM_GRADE2,#1
LDM PWM_GRADE3,#2
LDM PWM_LOCK,#0010B
RET
CURRENT_F_3:
CLRC
ADDC PWM_GRADE1,#1
LDM PWM_GRADE1,A
ADDC PWM_GRADE2,#0
LDM PWM_GRADE2,A
ADDC PWM_GRADE3,#0
LDM PWM_GRADE3,A
LDM PWM_LOCK,#0001B
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PVOLTAGE_F:
CALL !PV_AD_F ;取电源电压
CLRC
LDA ADCR1_M ;累加电源电压
ADDC PV_ADCR1_S,A
LDM PV_ADCR1_S,A
LDA ADCR2_M
ADDC PV_ADCR2_S,A
LDM PV_ADCR2_S,A
LDA ADCR3_M
ADDC PV_ADCR3_S,A
LDM PV_ADCR3_S,A
ADDC PV_ADCRX_S,#0
LDM PV_ADCRX_S,A
ADDC PV_ADCRXX_S,#0
LDM PV_ADCRXX_S,A
TSTC
BR !RESET
CLRC
ADDC PV_LOGIC1,#1
LDM PV_LOGIC1,A
ADDC PV_LOGIC2,#0
LDM PV_LOGIC2,A
CMLE PV_LOGIC2,#0001B ;电压累加满32次就计算平均值
BR !PVOLTAGE_F_RET
LDM PV_LOGIC1,#0
LDM PV_LOGIC2,#0
;;;;;;;;;;;;;;;;电源电压计算
TM PV_ADCR2_S.#0 ;是否需要四舍五入
BR !PVOLTAGE_F_1
BR !PVOLTAGE_F_2
PVOLTAGE_F_1:
CLRC
ADDC PV_ADCR2_S,#1
LDM PV_ADCR2_S,A
ADDC PV_ADCR3_S,#0
LDM PV_ADCR3_S,A
ADDC PV_ADCRX_S,#0
LDM PV_ADCRX_S,A
ADDC PV_ADCRXX_S,#0
LDM PV_ADCRXX_S,A
TSTC
BR !RESET
PVOLTAGE_F_2:
CLRC
LDA PV_ADCRXX_S ;右移
ARRC
LDA PV_ADCRX_S
ARRC
LDM PV_ADCR3,A
LDA PV_ADCR3_S
ARRC
LDM PV_ADCR2,A
LDA PV_ADCR2_S
ARRC
LDM PV_ADCR1,A
LDM PV_ADCR1_S,#0
LDM PV_ADCR2_S,#0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -