请教单片机汇编语言解析
时间:10-02
整理:3721RD
点击:
MAIN_1
;********数据变换处理(BIN;maxFFFF -> BCD;max065535)
;代入参数 源数据 : L_byte,H_byte
; 目标数据: MYDT_A,B,C
;BCD设定值初始化
MOVFF BIN_D00,L_byte ;设定值_0(温度,BIN;2字节)
MOVFF BIN_D01,H_byte
CALL B2_BCD
MOVFF MYDT_C,BCD_D00 ;设定值_0(BCD;2字节)
MOVLW 0X0F ;高位屏蔽
ANDWF BCD_D00,F
MOVLW 0XE0 ;小数点
IORWF BCD_D00,F
MOVFF MYDT_B,BCD_D01
SWAPF BCD_D01,F
MOVLW 0XF0 ;低位屏蔽
ANDWF BCD_D01,F
SWAPF MYDT_C,F
MOVLW 0X0F ;高位屏蔽
ANDWF MYDT_C,W
IORWF BCD_D01,F
MOVFF BIN_D10,L_byte ;设定值_1(照度,BIN;2字节)
MOVFF BIN_D11,H_byte
CALL B2_BCD
MOVFF MYDT_C,BCD_D10 ;设定值_1(BCD;2字节)
MOVFF MYDT_B,BCD_D11
;记录频率
MOVFF BIN_D20,L_byte ;设定值_2(温度,BIN;2字节)
MOVFF BIN_D21,H_byte
CALL B2_BCD
MOVFF MYDT_C,BCD_D20 ;设定值_2(BCD;2字节)
MOVFF MYDT_B,BCD_D21
MOVFF BIN_D30,L_byte ;设定值_3(照度,BIN;2字节)
MOVFF BIN_D31,H_byte
CALL B2_BCD
MOVFF MYDT_C,BCD_D30 ;设定值_3(BCD;2字节)
MOVFF MYDT_B,BCD_D31
MOVFF BIN_D40,L_byte ;设定值_4(PH,BIN;2字节)
MOVFF BIN_D41,H_byte
CALL B2_BCD
MOVFF MYDT_C,BCD_D40 ;设定值_4(BCD;2字节)
MOVFF MYDT_B,BCD_D41
MOVFF BIN_D50,L_byte ;设定值_5(浊度,BIN;2字节)
MOVFF BIN_D51,H_byte
CALL B2_BCD
MOVFF MYDT_C,BCD_D50 ;设定值_5(BCD;2字节)
MOVFF MYDT_B,BCD_D51
;吹泡频率
MOVFF BIN_D60,L_byte ;设定值_60(分,BIN;1字节)
CLRF H_byte
CALL B2_BCD
MOVFF MYDT_C,BCD_D60 ;设定值_60(BCD;1字节)
MOVFF BIN_D61,L_byte ;设定值_61(时,BIN;1字节)
CLRF H_byte
CALL B2_BCD
MOVFF MYDT_C,BCD_D61 ;设定值_61(BCD;1字节)
MOVFF BIN_D62,L_byte ;设定值_62(秒,BIN;1字节)
CLRF H_byte
CALL B2_BCD
MOVFF MYDT_C,BCD_D62 ;设定值_62(BCD;1字节)
MOVFF BIN_D63,L_byte ;设定值_63(分,BIN;1字节)
CLRF H_byte
CALL B2_BCD
MOVFF MYDT_C,BCD_D63 ;设定值_63(BCD;1字节)
;延时约1秒(10*255*255)
MOVLW 0X10
MOVWF MYCNT2
MAIN_LP1
CLRF MYCNT1
MAIN_LP2
CLRF DELAY_CNT
CALL DELAY_NUS
DECFSZ MYCNT1,F
GOTO MAIN_LP2
DECFSZ MYCNT2,F
GOTO MAIN_LP1
CLRF KEYFLG ;键标志清零
CLRF KEYMOD
CLRF RUNMOD
CLRF DSPFLG
CLRF BIN_D73 ;40微秒单位
CLRF S电子发烧友T ;1秒计数器(10毫秒单位)
CLRF DSPSEG ;当前显示数据段
CLRF DSPBIT ;当前显示数据位
CLRF RFDAT0
CLRF RFDAT1
MOVLW .2
MOVWF SMPCNT
CALL INIT_DISPLAY
CALL CLEAR_SCREEN
CALL FIRST_SCREEN
CLRF DSPSEG ;段:0
CLRF DSPBIT ;位:0:
CALL CURSOR_SET ;画面光标位置计算set
MOVLW B'11000000'
MOVWF INTCON ;GIEH=1,GIEL=1,TMR0IE=1,INTE=0;RBIE=0,TMR0IF=0,INTF=0,RBIF=0
MOVLW B'00000100'
MOVWF T2CON ;无分频;TIMER2 ON
BSF ADCON0,ADON
BSF ADCON0,GO/DONE ;AD START
BSF RUNMOD,0 ;TEST***********1/启动按钮有效
LOOP
; GOTO LOOP_4
NOP
CALL KEY_PRO ;内部键查询处理
CALL RF_PRO ;无线键查询处理
; GOTO LOOP ;***************test
BTFSC KEYFLG,7 ;IF=1;有键数据待处理
CALL KEY_DT_SET ;内部键或RF遥控器接受数据处理
NOP
MOVF DSPCNT,F
BNZ LOOP_0
CALL DSP_PRO ;数据显示处理(每100ms更新一组数据)
NOP
MOVLW .5
MOVWF DSPCNT
LOOP_0
NOP
MOVF SMPCNT,F
BNZ LOOP_1
BTFSC ADCON0,GO/DONE ;0 AD DONE
GOTO LOOP_1
NOP
CALL AD_SAMPLE
MOVLW .2
MOVWF SMPCNT
BSF ADCON0,GO/DONE ;AD RESTART
LOOP_1
BTFSS RUNMOD,0 ;b0:0/停止;1/启动按钮有效
GOTO LOOP
BTFSC RUNMOD,7 ;b7:1/首次低电平等待
GOTO LOOP_2
BTFSC PORTE,7 ;低电平测试
GOTO LOOP
BSF RUNMOD,7 ;b7:1/首次低电平有效
GOTO LOOP
LOOP_2
BTFSC RUNMOD,6 ;b6:1/首次高电平等待
GOTO LOOP_3
BTFSS PORTE,7 ;高电平测试
GOTO LOOP
BSF RUNMOD,6 ;b6:1/已同步
GOTO LOOP
LOOP_3
NOP
MOVF PI_CNT,F ;计算间歇计数器(20ms单位)
GOTO LOOP_4
BTFSC PI_CH,0 ;当前PI计算通道
GOTO LOOP_30
;通道1计算(温度控制)
MOVFF UNIT_1,UNIT_0 ;前次符号位
MOVFF E_NOW1,E_NOW ;前次误差值
MOVFF D_DTY1,D_DTY0 ;前次控制值
MOVFF BIN_D00,DC_VT0
MOVFF BIN_D01,MYDT_B
BCF STATUS,C
RRNCF MYDT_B,F ;带进位循环右移
RRNCF DC_VT0,F ;带进位循环右移
RRNCF MYDT_B,F ;带进位循环右移
RRNCF DC_VT0,F ;带进位循环右移
MOVFF BIN_D80,SMP_VT0
MOVFF BIN_D81,MYDT_B
BCF STATUS,C
RRNCF MYDT_B,F ;带进位循环右移
RRNCF SMP_VT0,F ;带进位循环右移
RRNCF MYDT_B,F ;带进位循环右移
RRNCF SMP_VT0,F ;带进位循环右移
;** 输入参数:DC_VT0,SMP_VT0,UNIT_0,E_NOW
;** 返回参数:D_DTY0,E_NOW占空比高8位
CALL SIGN_PI_CAL ;单字节数字PI参数计算
MOVFF E_NOW,E_NOW1 ;当前误差值
MOVFF UNIT_0,UNIT_1 ;当前符号位
MOVFF D_DTY0,D_DTY1 ;当前控制值
BSF PI_CH,0 ;当前PI计算通道
GOTO LOOP_3E
LOOP_30
;通道2计算(照度控制)
MOVFF UNIT_2,UNIT_0 ;前次符号位
MOVFF E_NOW2,E_NOW ;前次误差值
MOVFF D_DTY2,D_DTY0 ;前次控制值
MOVFF BIN_D10,DC_VT0
MOVFF BIN_D11,MYDT_B
BCF STATUS,C
RRNCF MYDT_B,F ;带进位循环右移
RRNCF DC_VT0,F ;带进位循环右移
RRNCF MYDT_B,F ;带进位循环右移
RRNCF DC_VT0,F ;带进位循环右移
MOVFF BIN_D90,SMP_VT0
MOVFF BIN_D91,MYDT_B
BCF STATUS,C
RRNCF MYDT_B,F ;带进位循环右移
RRNCF SMP_VT0,F ;带进位循环右移
RRNCF MYDT_B,F ;带进位循环右移
RRNCF SMP_VT0,F ;带进位循环右移
CALL SIGN_PI_CAL ;单字节数字PI参数计算
MOVFF D_DTY0,D_DTY2 ;当前控制值
MOVFF E_NOW,E_NOW2 ;当前误差值
MOVFF UNIT_0,UNIT_2 ;当前符号位
BCF PI_CH,0 ;当前PI计算通道
LOOP_3E
MOVLW .5
MOVWF PI_CNT ;计算间歇计数器(20ms单位)
LOOP_4 ;温度控制处理
NOP
MOVF STEP_C1,F ;初始角计数器(10ms/250单位)
BNZ LOOP_5
;温度控制脉冲输出(100us)
BSF PORTB,4
MOVLW .40
MOVWF MYCNT1
LOOP_4LP
MOVLW .200
MOVWF DELAY_CNT
CALL DELAY_NUS
DECFSZ MYCNT1,F
GOTO LOOP_4LP
BCF PORTB,4
; MOVLW .100
; MOVWF STEP_C1 ;初始角计数器(10ms/250单位)
; BTFSC RUNMOD,2 ;温度控制半波已触发?
; GOTO LOOP_41
; BSF RUNMOD,2 ;温度控制半波已触发
; GOTO LOOP_5
LOOP_41 ;温度控制处理
BCF RUNMOD,1 ;下次同步等待允许
LOOP_5 ;照度控制处理
MOVLW .0
CPFSEQ STEP_C2 ;初始角计数器(10ms/250单位)
GOTO LOOP
;照度控制脉冲输出(100us)
BSF PORTB,5
MOVLW .200
MOVWF DELAY_CNT
CALL DELAY_NUS
BCF PORTB,5
INCF STEP_C2,F ;初始角计数器(10ms/250单位)
BSF RUNMOD,3 ;照度控制已触发
GOTO LOOP
END
;********数据变换处理(BIN;maxFFFF -> BCD;max065535)
;代入参数 源数据 : L_byte,H_byte
; 目标数据: MYDT_A,B,C
;BCD设定值初始化
MOVFF BIN_D00,L_byte ;设定值_0(温度,BIN;2字节)
MOVFF BIN_D01,H_byte
CALL B2_BCD
MOVFF MYDT_C,BCD_D00 ;设定值_0(BCD;2字节)
MOVLW 0X0F ;高位屏蔽
ANDWF BCD_D00,F
MOVLW 0XE0 ;小数点
IORWF BCD_D00,F
MOVFF MYDT_B,BCD_D01
SWAPF BCD_D01,F
MOVLW 0XF0 ;低位屏蔽
ANDWF BCD_D01,F
SWAPF MYDT_C,F
MOVLW 0X0F ;高位屏蔽
ANDWF MYDT_C,W
IORWF BCD_D01,F
MOVFF BIN_D10,L_byte ;设定值_1(照度,BIN;2字节)
MOVFF BIN_D11,H_byte
CALL B2_BCD
MOVFF MYDT_C,BCD_D10 ;设定值_1(BCD;2字节)
MOVFF MYDT_B,BCD_D11
;记录频率
MOVFF BIN_D20,L_byte ;设定值_2(温度,BIN;2字节)
MOVFF BIN_D21,H_byte
CALL B2_BCD
MOVFF MYDT_C,BCD_D20 ;设定值_2(BCD;2字节)
MOVFF MYDT_B,BCD_D21
MOVFF BIN_D30,L_byte ;设定值_3(照度,BIN;2字节)
MOVFF BIN_D31,H_byte
CALL B2_BCD
MOVFF MYDT_C,BCD_D30 ;设定值_3(BCD;2字节)
MOVFF MYDT_B,BCD_D31
MOVFF BIN_D40,L_byte ;设定值_4(PH,BIN;2字节)
MOVFF BIN_D41,H_byte
CALL B2_BCD
MOVFF MYDT_C,BCD_D40 ;设定值_4(BCD;2字节)
MOVFF MYDT_B,BCD_D41
MOVFF BIN_D50,L_byte ;设定值_5(浊度,BIN;2字节)
MOVFF BIN_D51,H_byte
CALL B2_BCD
MOVFF MYDT_C,BCD_D50 ;设定值_5(BCD;2字节)
MOVFF MYDT_B,BCD_D51
;吹泡频率
MOVFF BIN_D60,L_byte ;设定值_60(分,BIN;1字节)
CLRF H_byte
CALL B2_BCD
MOVFF MYDT_C,BCD_D60 ;设定值_60(BCD;1字节)
MOVFF BIN_D61,L_byte ;设定值_61(时,BIN;1字节)
CLRF H_byte
CALL B2_BCD
MOVFF MYDT_C,BCD_D61 ;设定值_61(BCD;1字节)
MOVFF BIN_D62,L_byte ;设定值_62(秒,BIN;1字节)
CLRF H_byte
CALL B2_BCD
MOVFF MYDT_C,BCD_D62 ;设定值_62(BCD;1字节)
MOVFF BIN_D63,L_byte ;设定值_63(分,BIN;1字节)
CLRF H_byte
CALL B2_BCD
MOVFF MYDT_C,BCD_D63 ;设定值_63(BCD;1字节)
;延时约1秒(10*255*255)
MOVLW 0X10
MOVWF MYCNT2
MAIN_LP1
CLRF MYCNT1
MAIN_LP2
CLRF DELAY_CNT
CALL DELAY_NUS
DECFSZ MYCNT1,F
GOTO MAIN_LP2
DECFSZ MYCNT2,F
GOTO MAIN_LP1
CLRF KEYFLG ;键标志清零
CLRF KEYMOD
CLRF RUNMOD
CLRF DSPFLG
CLRF BIN_D73 ;40微秒单位
CLRF S电子发烧友T ;1秒计数器(10毫秒单位)
CLRF DSPSEG ;当前显示数据段
CLRF DSPBIT ;当前显示数据位
CLRF RFDAT0
CLRF RFDAT1
MOVLW .2
MOVWF SMPCNT
CALL INIT_DISPLAY
CALL CLEAR_SCREEN
CALL FIRST_SCREEN
CLRF DSPSEG ;段:0
CLRF DSPBIT ;位:0:
CALL CURSOR_SET ;画面光标位置计算set
MOVLW B'11000000'
MOVWF INTCON ;GIEH=1,GIEL=1,TMR0IE=1,INTE=0;RBIE=0,TMR0IF=0,INTF=0,RBIF=0
MOVLW B'00000100'
MOVWF T2CON ;无分频;TIMER2 ON
BSF ADCON0,ADON
BSF ADCON0,GO/DONE ;AD START
BSF RUNMOD,0 ;TEST***********1/启动按钮有效
LOOP
; GOTO LOOP_4
NOP
CALL KEY_PRO ;内部键查询处理
CALL RF_PRO ;无线键查询处理
; GOTO LOOP ;***************test
BTFSC KEYFLG,7 ;IF=1;有键数据待处理
CALL KEY_DT_SET ;内部键或RF遥控器接受数据处理
NOP
MOVF DSPCNT,F
BNZ LOOP_0
CALL DSP_PRO ;数据显示处理(每100ms更新一组数据)
NOP
MOVLW .5
MOVWF DSPCNT
LOOP_0
NOP
MOVF SMPCNT,F
BNZ LOOP_1
BTFSC ADCON0,GO/DONE ;0 AD DONE
GOTO LOOP_1
NOP
CALL AD_SAMPLE
MOVLW .2
MOVWF SMPCNT
BSF ADCON0,GO/DONE ;AD RESTART
LOOP_1
BTFSS RUNMOD,0 ;b0:0/停止;1/启动按钮有效
GOTO LOOP
BTFSC RUNMOD,7 ;b7:1/首次低电平等待
GOTO LOOP_2
BTFSC PORTE,7 ;低电平测试
GOTO LOOP
BSF RUNMOD,7 ;b7:1/首次低电平有效
GOTO LOOP
LOOP_2
BTFSC RUNMOD,6 ;b6:1/首次高电平等待
GOTO LOOP_3
BTFSS PORTE,7 ;高电平测试
GOTO LOOP
BSF RUNMOD,6 ;b6:1/已同步
GOTO LOOP
LOOP_3
NOP
MOVF PI_CNT,F ;计算间歇计数器(20ms单位)
GOTO LOOP_4
BTFSC PI_CH,0 ;当前PI计算通道
GOTO LOOP_30
;通道1计算(温度控制)
MOVFF UNIT_1,UNIT_0 ;前次符号位
MOVFF E_NOW1,E_NOW ;前次误差值
MOVFF D_DTY1,D_DTY0 ;前次控制值
MOVFF BIN_D00,DC_VT0
MOVFF BIN_D01,MYDT_B
BCF STATUS,C
RRNCF MYDT_B,F ;带进位循环右移
RRNCF DC_VT0,F ;带进位循环右移
RRNCF MYDT_B,F ;带进位循环右移
RRNCF DC_VT0,F ;带进位循环右移
MOVFF BIN_D80,SMP_VT0
MOVFF BIN_D81,MYDT_B
BCF STATUS,C
RRNCF MYDT_B,F ;带进位循环右移
RRNCF SMP_VT0,F ;带进位循环右移
RRNCF MYDT_B,F ;带进位循环右移
RRNCF SMP_VT0,F ;带进位循环右移
;** 输入参数:DC_VT0,SMP_VT0,UNIT_0,E_NOW
;** 返回参数:D_DTY0,E_NOW占空比高8位
CALL SIGN_PI_CAL ;单字节数字PI参数计算
MOVFF E_NOW,E_NOW1 ;当前误差值
MOVFF UNIT_0,UNIT_1 ;当前符号位
MOVFF D_DTY0,D_DTY1 ;当前控制值
BSF PI_CH,0 ;当前PI计算通道
GOTO LOOP_3E
LOOP_30
;通道2计算(照度控制)
MOVFF UNIT_2,UNIT_0 ;前次符号位
MOVFF E_NOW2,E_NOW ;前次误差值
MOVFF D_DTY2,D_DTY0 ;前次控制值
MOVFF BIN_D10,DC_VT0
MOVFF BIN_D11,MYDT_B
BCF STATUS,C
RRNCF MYDT_B,F ;带进位循环右移
RRNCF DC_VT0,F ;带进位循环右移
RRNCF MYDT_B,F ;带进位循环右移
RRNCF DC_VT0,F ;带进位循环右移
MOVFF BIN_D90,SMP_VT0
MOVFF BIN_D91,MYDT_B
BCF STATUS,C
RRNCF MYDT_B,F ;带进位循环右移
RRNCF SMP_VT0,F ;带进位循环右移
RRNCF MYDT_B,F ;带进位循环右移
RRNCF SMP_VT0,F ;带进位循环右移
CALL SIGN_PI_CAL ;单字节数字PI参数计算
MOVFF D_DTY0,D_DTY2 ;当前控制值
MOVFF E_NOW,E_NOW2 ;当前误差值
MOVFF UNIT_0,UNIT_2 ;当前符号位
BCF PI_CH,0 ;当前PI计算通道
LOOP_3E
MOVLW .5
MOVWF PI_CNT ;计算间歇计数器(20ms单位)
LOOP_4 ;温度控制处理
NOP
MOVF STEP_C1,F ;初始角计数器(10ms/250单位)
BNZ LOOP_5
;温度控制脉冲输出(100us)
BSF PORTB,4
MOVLW .40
MOVWF MYCNT1
LOOP_4LP
MOVLW .200
MOVWF DELAY_CNT
CALL DELAY_NUS
DECFSZ MYCNT1,F
GOTO LOOP_4LP
BCF PORTB,4
; MOVLW .100
; MOVWF STEP_C1 ;初始角计数器(10ms/250单位)
; BTFSC RUNMOD,2 ;温度控制半波已触发?
; GOTO LOOP_41
; BSF RUNMOD,2 ;温度控制半波已触发
; GOTO LOOP_5
LOOP_41 ;温度控制处理
BCF RUNMOD,1 ;下次同步等待允许
LOOP_5 ;照度控制处理
MOVLW .0
CPFSEQ STEP_C2 ;初始角计数器(10ms/250单位)
GOTO LOOP
;照度控制脉冲输出(100us)
BSF PORTB,5
MOVLW .200
MOVWF DELAY_CNT
CALL DELAY_NUS
BCF PORTB,5
INCF STEP_C2,F ;初始角计数器(10ms/250单位)
BSF RUNMOD,3 ;照度控制已触发
GOTO LOOP
END
不错的文件,值得收藏