📄 light control.asm
字号:
MOVLW 'H'
CALL PUTCLCD
MOVLW 'O'
CALL PUTCLCD
MOVLW 'O'
CALL PUTCLCD
MOVLW 'S'
CALL PUTCLCD
MOVLW 'E'
CALL PUTCLCD
MOVLW ' '
CALL PUTCLCD
MOVLW 'M'
CALL PUTCLCD
MOVLW 'O'
CALL PUTCLCD
MOVLW 'D'
CALL PUTCLCD
MOVLW 'E'
CALL PUTCLCD
MOVLW ' '
CALL PUTCLCD
MOVLW '3'
CALL PUTCLCD
MOVLW ' '
CALL PUTCLCD
CALL PUTCLCD
MOVLW 30H
ADDWF STATE,W
CALL PUTCLCD
RETURN
;**********************************
;BIN2到BCDT的变换子程序
;入口参数:M_INPUT
;出口参数:OUTPUT1: 个位的ASCII,OUTPUT2:十位的ASCII
;**********************************
BIN2BCDT
CLRF OUTPUT1
MOVF M_INPUT,W
MOVWF OUTPUT2
TTENCH
MOVLW 0AH
SUBWF OUTPUT2,W
BTFSS STATUS,C
GOTO OVER0
MOVWF OUTPUT2
INCF OUTPUT1,F
GOTO TTENCH
OVER0
MOVLW 30H
IORWF OUTPUT2,F
IORWF OUTPUT1,F
RETURN
;*****************************************************
;数学运算子程序部分
;*****************************************************
;*****************************************************
;****************************************
;乘法子程序
;入口参数:MULTIPLY1H,MULTIPLT1L,MULTIPLY2H,MULTPLY2L
;出口参数:RESULTHH,RESULTH,RESULTL分别存放
;乘法运算后的高8位和低8位
;****************************************
M_MULTIPLY
GLOBAL M_MULTIPLY
MOVF MULTIPLY1,W
MOVWF MMIDL
CLRF MMIDH
CLRF MRESULTH
CLRF MRESULTL
BCF STATUS,C
BTFSC MULTIPLY2,0
CALL ADD16
RLF MMIDL,F
BTFSS STATUS,C
GOTO MMADD1
MOVLW 01H
ADDWF MMIDH,F
BCF STATUS,C
MMADD1
BTFSC MULTIPLY2,1
CALL ADD16
RLF MMIDH,F
RLF MMIDL,F
BTFSS STATUS,C
GOTO MMADD2
MOVLW 01H
ADDWF MMIDH,F
BCF STATUS,C
MMADD2
BTFSC MULTIPLY2,2
CALL ADD16
RLF MMIDH,F
RLF MMIDL,F
BTFSS STATUS,C
GOTO MMADD3
MOVLW 01H
ADDWF MMIDH,F
BCF STATUS,C
MMADD3
BTFSC MULTIPLY2,3
CALL ADD16
RLF MMIDH,F
RLF MMIDL,F
BTFSS STATUS,C
GOTO MMADD4
MOVLW 01H
ADDWF MMIDH,F
BCF STATUS,C
MMADD4
BTFSC MULTIPLY2,4
CALL ADD16
RLF MMIDH,F
RLF MMIDL,F
BTFSS STATUS,C
GOTO MMADD5
MOVLW 01H
ADDWF MMIDH,F
BCF STATUS,C
MMADD5
BTFSC MULTIPLY2,5
CALL ADD16
RLF MMIDH,F
RLF MMIDL,F
BTFSS STATUS,C
GOTO MMADD6
MOVLW 01H
ADDWF MMIDH,F
BCF STATUS,C
MMADD6
BTFSC MULTIPLY2,6
CALL ADD16
RLF MMIDH,F
RLF MMIDL,F
BTFSS STATUS,C
GOTO MMADD7
MOVLW 01H
ADDWF MMIDH,F
BCF STATUS,C
MMADD7
BTFSC MULTIPLY2,7
CALL ADD16
RETURN
ADD16
;完成乘法程序中,移位后的数据和移位前的数据
;求和的运算
MOVF MMIDH,W
ADDWF MRESULTH,F
MOVF MMIDL,W
ADDWF MRESULTL,F
BTFSS STATUS,C
GOTO OVERADD16
MOVLW 01H
ADDWF MRESULTH,F
OVERADD16
BCF STATUS,C
RETURN
;****************************************
;**********************************************
;除法程序,完成的是16位除16位的程序
;入口参数,DIVIDEDH,DEVIDEDL,存放被除数
; DIVIDEH,DIVIDEL 存放除数
;出口参数,DRESULTH,DRESULTL,存放商
; DIVIDEDH,DEVIDEDL,存放余数
;程序说明:先测试出除数第一位不是0的位的位置。并用DCOUNT存放,如果是高位的第N位
;则作为整个被除数的第8+N位处理。例如DIVIDEH的D3位,为整个除数的D10位。同时给16位辅助变量
;XORCOUNT辅值。它的特点是只有一位是1,其余的都是0。它的初值为1的位就是除数第一位为一的位。
;两个变量的值根据不同的除数确定以后,开始把除数向移位。直到高字节的D7位为1。移动用循环控制
;控制变量是DCOUNT的复制品DCOUNT1,两个变量值相等,DCOUNT1是为了保护DCOUNT值,以便以后使用
;最后是正式的运算。用被除数减移位后的除数。先减高字节,高字节相等,再减低字节。如果被除数
;高字节大则商1,小则再移位比较。如果高字节不相等,有两种情况:一是被除数高字节小,则直接
;则直接移位再减。如果被除数高字节大,则先减低字节,如果有借位则高字节减一,再减高字节。
;减后的结果存放到中间变量DMIDH,DMIDL中。防止高字节也有借位(说明不能除,商0)。如果高字节无
;借位,则说明对应的位应该商1。则将DMIDH,DMIDL的值存到DIVIDEH,DIVIDEL中,已进行下次运算。
;同时用XORCOUNT与结果异或,就可以将相应应该商1的位置1。最后将循环控制变量DCOUNT1减1,XORCOUNT
;右移。监测是否进行下次循环。先减高字节的方法防止了先减低字节的情况下,如果高字节相等而且被除数
;低字节小时,先减低字节其会向高字节借位使高字节
;在减之前发生变化,计算出错。
;**********************************************
M_DIVIDE
CLRF XORCOUNTH
CLRF XORCOUNTL
CLRF DRESULTH
CLRF DRESULTL
MOVF DIVIDEH,W
MOVWF DMIDH
MOVF DIVIDEL,W
MOVWF DMIDL
BTFSC DMIDH,7
GOTO REMOVE0
BTFSC DMIDH,6
GOTO REMOVE1
BTFSC DMIDH,5
GOTO REMOVE2
BTFSC DMIDH,4
GOTO REMOVE3
BTFSC DMIDH,3
GOTO REMOVE4
BTFSC DMIDH,2
GOTO REMOVE5
BTFSC DMIDH,1
GOTO REMOVE6
BTFSC DMIDH,0
GOTO REMOVE7
BTFSC DMIDL,7
GOTO REMOVE8
BTFSC DMIDL,6
GOTO REMOVE9
BTFSC DMIDL,5
GOTO REMOVE10
BTFSC DMIDL,4
GOTO REMOVE11
BTFSC DMIDL,3
GOTO REMOVE12
BTFSC DMIDL,2
GOTO REMOVE13
BTFSC DMIDL,1
GOTO REMOVE14
BTFSC DMIDL,0
GOTO REMOVE15
REMOVE0
MOVLW 00H
MOVWF DCOUNT
BSF XORCOUNTL,0
GOTO TARTREMOVE
REMOVE1
MOVLW 01H
MOVWF DCOUNT
BSF XORCOUNTL,1
GOTO TARTREMOVE
REMOVE2
MOVLW 02H
MOVWF DCOUNT
BSF XORCOUNTL,2
GOTO TARTREMOVE
REMOVE3
MOVLW 03H
MOVWF DCOUNT
BSF XORCOUNTL,3
GOTO TARTREMOVE
REMOVE4
MOVLW 04H
MOVWF DCOUNT
BSF XORCOUNTL,4
GOTO TARTREMOVE
REMOVE5
MOVLW 05H
MOVWF DCOUNT
BSF XORCOUNTL,5
GOTO TARTREMOVE
REMOVE6
MOVLW 06H
MOVWF DCOUNT
BSF XORCOUNTL,6
GOTO TARTREMOVE
REMOVE7
MOVLW 07H
MOVWF DCOUNT
BSF XORCOUNTL,7
GOTO TARTREMOVE
REMOVE8
MOVLW 08H
MOVWF DCOUNT
BSF XORCOUNTH,0
GOTO TARTREMOVE
REMOVE9
MOVLW 09H
MOVWF DCOUNT
BSF XORCOUNTH,1
GOTO TARTREMOVE
REMOVE10
MOVLW 0AH
MOVWF DCOUNT
BSF XORCOUNTH,2
GOTO TARTREMOVE
REMOVE11
MOVLW 0BH
MOVWF DCOUNT
BSF XORCOUNTH,3
GOTO TARTREMOVE
REMOVE12
MOVLW 0CH
MOVWF DCOUNT
BSF XORCOUNTH,4
GOTO TARTREMOVE
REMOVE13
MOVLW 0DH
MOVWF DCOUNT
BSF XORCOUNTH,5
GOTO TARTREMOVE
REMOVE14
MOVLW 0EH
MOVWF DCOUNT
BSF XORCOUNTH,6
GOTO TARTREMOVE
REMOVE15
MOVLW 0FH
MOVWF DCOUNT
BSF XORCOUNTH,7
GOTO TARTREMOVE
TARTREMOVE
MOVF DCOUNT,W
MOVWF DCOUNT1
TARTREMOVE1
MOVLW 00H
XORWF DCOUNT1,W
BTFSC STATUS,Z
GOTO TARTREMOVER
BCF STATUS,C
RLF DIVIDEL,F ;由于是带进位左移,因而在先移位低字节时可以连续移
RLF DIVIDEH,F
DECF DCOUNT1,F
GOTO TARTREMOVE1
TARTREMOVER
MOVF DCOUNT,W
MOVWF DCOUNT1
TOSTART
MOVLW 0FFH
XORWF DCOUNT1,W
BTFSC STATUS,Z
GOTO DDOOVER
MOVF DIVIDEH,W
SUBWF DIVIDEDH,W
MOVWF DMIDH
BTFSS STATUS,Z
GOTO HNOTE
MOVF DIVIDEL,W
SUBWF DIVIDEDL,W
MOVWF DMIDL
BTFSS STATUS,C
GOTO ASAMEDO1
MOVF DMIDH,W
MOVWF DIVIDEDH
MOVF DMIDL,W
MOVWF DIVIDEDL
MOVF XORCOUNTH,W
XORWF DRESULTH,F
MOVF XORCOUNTL,W
XORWF DRESULTL,F
GOTO ASAMEDO1
HNOTE
MOVF DIVIDEH,W
SUBWF DIVIDEDH,W
MOVWF DMIDH
BTFSS STATUS,C
GOTO ASAMEDO1
MOVF DIVIDEL,W
SUBWF DIVIDEDL,F
BTFSS STATUS,C ;如果没有借位则跳转,开始减高位
CALL DSUB ;如果有借位则将高位先减一,然后继续减
MOVF DIVIDEH,W
SUBWF DIVIDEDH,F
MOVF XORCOUNTH,W
XORWF DRESULTH,F
MOVF XORCOUNTL,W
XORWF DRESULTL,F
ASAMEDO1
BCF STATUS,C
RRF XORCOUNTH,F
RRF XORCOUNTL,F
BCF STATUS,C
RRF DIVIDEH,F
RRF DIVIDEL,F
DECF DCOUNT1,F
GOTO TOSTART
DDOOVER
RETURN
DSUB
MOVLW 01H
SUBWF DIVIDEDH,F
RETURN
;******************************************************
;********************************************
;功计算子程序
;********************************************
WCALCULATE
BTFSS IFCOUNT,0
GOTO TESTI1
MOVF ADVSTOREH,W ;可以通过这个公式计算电压有效值。
;U=55*AD/512*9
MOVWF DIVIDEDH
MOVF ADVSTOREL,W
MOVWF DIVIDEDL
CLRF DIVIDEL
CLRF DIVIDEH
BSF DIVIDEH,1 ;先除以512
CALL M_DIVIDE
CLRF ADVSTOREH
CLRF ADVSTOREL
MOVF DRESULTL,W ;结果会小于256,因而只考虑商的低字节
MOVWF MULTIPLY1
MOVLW 37H
MOVWF MULTIPLY2
CALL M_MULTIPLY ;商乘以55
MOVF MRESULTH,W
MOVWF DIVIDEDH
MOVF MRESULTL,W
MOVWF DIVIDEDL
CLRF DIVIDEH
MOVLW 09H
MOVWF DIVIDEL ;再除以9
CALL M_DIVIDE
BTFSS WHICHV,0 ;由于考虑到单片机的运行效率,电压和电流采样达到20
;次的时间不同步,相差10MS,因而计算好的平均电压用两个
;变量交替存放,用WHICHV区别用哪一个
GOTO WHICH0
MOVF DRESULTL,W
ADDWF STOREV1L,F
BTFSS STATUS,C
GOTO TEST501
MOVLW 01H
ADDWF STOREV1H,F
TEST501
INCF VCOUNT,F
MOVLW 32H
XORWF VCOUNT,W
BTFSS STATUS,Z ;是不是达到50次,是则在一秒内求电压的平均
GOTO KEYBEGIN1
CLRF VCOUNT
BCF WHICHV,0
MOVF STOREV1H,W
MOVWF DIVIDEDH
MOVF STOREV1L,W
MOVWF DIVIDEDL
CLRF DIVIDEH
MOVLW 32H
MOVWF DIVIDEL
CALL M_DIVIDE
CLRF STOREV1L
CLRF STOREV1H
MOVF DRESULTL,W ;一秒的平均值存到SECONDV里
MOVWF SECONDV
GOTO KEYBEGIN1
WHICH0
MOVF DRESULTL,W
ADDWF STOREV2L,F
BTFSS STATUS,C
GOTO TEST502
MOVLW 01H
ADDWF STOREV2H,F
TEST502
INCF VCOUNT,F
MOVLW 32H
XORWF VCOUNT,W
BTFSS STATUS,Z
GOTO KEYBEGIN1
CLRF VCOUNT
BSF WHICHV,0
MOVF STOREV2H,W
MOVWF DIVIDEDH
MOVF STOREV2L,W
MOVWF DIVIDEDL
CLRF DIVIDEH
MOVLW 32H
MOVWF DIVIDEL
CALL M_DIVIDE
CLRF STOREV2L
CLRF STOREV2H
MOVF DRESULTL,W
MOVWF SECONDV
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -