;定义用户寄存器
WEI1 EQU H’0C’ ;BIT0=MODS:选择模式位 0:模式1 1:模式2
;BIT1=BREK:断路判别位 0:无断路 1:有断路
;BIT2=
;BIT3=
;BIT4=
;BIT5=慢响
;BIT6=快响
;BIT7=长响
WEI2 EQU H’0D’ ;“百位值运算”的启始值
WEI3 EQU H’0E’ ;“十位值运算”的启始值
WEI4 EQU H’0F’ ;个位值
WEI5 EQU H’10’ ;百位值
WEI6 EQU H’11’ ;十位值
WEI7 EQU H’12’ ;
WEI8 EQU H’13’ ;
WEI9 EQU H’14’ ;
WEIA EQU H’15’ ;
WEIB EQU H’16’
WEIC EQU H’17’
WEID EQU H’18’
WEIE EQU H’19’
WEIF EQU H’1A’
WEIG EQU H’1B’
WEIH EQU H’1C’
WEII EQU H’1D’
CHECK EQU H’7’
DP EQU H’1’
AD EQU H’0’
BUZZER EQU H’3’
R EQU H’2’
L EQU H’4’
;************************************************************************
;矢量地址
ORG H’00’ ;复位矢量
GOTO MAIN
ORG H’04’ ;中断矢量
NOP
GOTO INTER
;************************************************************************
;数码值
TABLE:
ADDWF PCL,F ;
RETLW B’01000000’ ;“0”值
RETLW B’01111001’ ;“1”值
RETLW B’00100100’ ;“2”值
RETLW B’00110000’ ;“3”值
RETLW B’00011001’ ;“4”值
RETLW B’00010010’ ;“5”值
RETLW B’00000010’ ;“6”值
RETLW B’01011000’ ;“7”值
RETLW B’00000000’ ;“8”值
RETLW B’00010000’ ;“9”值
;------------------------------------------------------------------------
;清除寄存器WEI1-WEIG
MAIN:
CLRF WEI1 ;
CLRF WEI2 ;
CLRF WEI3 ;
CLRF WEI4 ;
CLRF WEI5 ;
CLRF WEI6 ;
CLRF WEI7 ;
CLRF WEI8 ;
CLRF WEI9 ;
CLRF WEIA ;
CLRF WEIB ;
CLRF WEIC ;
CLRF WEID ;
CLRF WEIE ;
CLRF WEIF ;
CLRF WEIG ;
CLRF WEIH ;
CLRF WEII ;
BSF STATUS,RP0 ;
BCF OPTION_REG,NOT_RBPU
BCF STATUS,RP0 ;
MOVF PORTB,1 ;
BTFSS PORTB,1 ;
BSF WEI1,0 ;
;------------------------------------------------------------------------
;设置A/D通道及A/D结构
BSF STATUS,RP0 ;
MOVLW B’00000010’ ;设置一个“A/D口”
MOVWF ADCON1 ;参考电压:工作电压5V
MOVLW B’10000000’ ;
MOVWF TRISB ;
MOVLW B’00000001’ ;
MOVWF TRISA ;
MOVLW B’10000111’ ;
MOVWF OPTION_REG ;
MOVLW B’10100000’ ;
MOVWF INTCON ;
;-----------------------------------------------------------------------
;设置端口“输入/输出”并设置初始状态
BCF STATUS,RP0 ;
MOVLW B’01000000’ ;设置A/D通道:AN0
MOVWF ADCON0 ;选用内部1:8时钟振荡
MOVLW B’01111111’ ;
MOVWF PORTB ;
MOVLW B’00010110’ ;
MOVWF PORTA ;
MOVLW D’252’ ;
MOVWF TMR0 ;设置TMR0初始值
;------------------------------------------------------------------------
;选择模式
BTFSC WEI1,0 ;判断“模式开关”是否闭合
GOTO MODLE2 ;“模式开关”闭合,则进入“模式2”
GOTO MODLE1 ;“模式开关”断开,则进入“模式1”
;------------------------------------------------------------------------
;“模式1”初始化
MODLE1:
MOVF PORTB,1 ;
BTFSS PORTB,CHECK ;判断是否有断路
GOTO $+7 ;
BSF WEI1,1 ;
BSF WEI1,6 ;有断路:蜂鸣器快响并且“无显示”延时3秒
BCF WEI1,5 ;
BCF WEI1,7 ;
CALL DELAY3S ;无断路:“无显示”延时3秒
GOTO START ;
CALL DELAY3S ;
GOTO START ;
;------------------------------------------------------------------------
;“模式2”初始化 检测数码管各段,蜂鸣器“长响 ”
MODLE2:
BSF WEI1,0 ;设置“模式选择位”
BSF WEI1,7 ;打开蜂鸣器“长响 ”
BCF WEI1,5 ;
BCF WEI1,6 ;
BCF STATUS,C ;设置“进位标志位”
MOVLW B’11111111’ ;
MOVWF WEI7 ;
RLF WEI7,F ;
MOVF WEI7,W ;
MOVWF PORTB ;设置“检测数码管段值”给PORT5
BCF PORTA,R ;开通“右数码管”
BCF PORTA,L ;开通“左数码管”
CALL DELAYP5 ;
BSF PORTA,R ;关闭“右数码管”
BSF PORTA,L ;关闭“左数码管”
MOVLW B’11111111’ ;
MOVWF PORTB ;清除给PORT5的“检测数码管段值”
BTFSC WEI7,6 ;检测是否完毕
GOTO $-D’11’ ;没有完毕 继续检测
BCF PORTA,DP ;已完毕 设置“小数点”及“1”值
BCF PORTA,R ;开通“右数码管”
BCF PORTA,L ;开通“左数码管”
CALL DELAYP5 ;
BSF PORTA,R ;关闭“右数码管”
BSF PORTA,L ;关闭“左数码管”
BSF PORTA,DP ;清除“小数点”及“1”值
BCF WEI1,7 ;关闭蜂鸣器“长响 ”
BCF WEI1,6 ;
BCF WEI1,5 ;
GOTO START ;
;------------------------------------------------------------------------
;开始工作
START:
MOVF PORTB,F ;
BTFSC PORTB,CHECK ;判断是否有断路
GOTO DUANLU ;有断路
BCF WEI1,1 ;清0断路判别位
GOTO PANZHI ;无断路
;------------------------------------------------------------------------
;断路处理
DUANLU:
BSF WEI1,1 ;设置断路判别位
BSF WEI1,6 ;
BCF WEI1,5 ;
BCF WEI1,7 ;
GOTO PANZHI ;
;------------------------------------------------------------------------
;判断电压值
PANZHI:
BSF ADCON0,ADON ;A/D处于工作状态
BSF ADCON0,GO_DONE ;A/D开始运行
BTFSC ADCON0,GO_DONE ;判A/D是否完成
GOTO $-1 ;A/D没完成
BCF ADCON0,ADIF ;
BCF ADCON0,ADON ;A/D已完成 关闭A/D
CALL CV ;
MOVF ADRES,W ;
MOVWF WEI8 ;
MOVWF WEI2 ;A/D值传给WEI2
BCF STATUS,C ;清零“进位标志位”
SUBLW D’200’ ;
BTFSS STATUS,C
GOTO V_20 ;跳到“20V以上”程序
MOVF ADRES,W
BCF STATUS,C ;清零“进位标志位”
SUBLW D’160’
BTFSS STATUS,C
GOTO V16 ;跳到“16V-19.9V之间”程序
MOVF ADRES,W
BCF STATUS,C ;清零“进位标志位”
SUBLW D’100’
BTFSS STATUS,C
GOTO V10 ;跳到“10V-15.9V之间”程序
MOVF ADRES,W
BCF STATUS,C ;清零“进位标志位”
SUBLW D’50’
BTFSS STATUS,C
GOTO V5 ;跳到“5V-9.9V之间”程序
GOTO V4.9 ;跳到4.9V以下程序
;-------------------------------------------------------------------------
V4.9: ;4.9V以下 数码管显示LL
BTFSC WEI1,1 ;判断是否有断路
GOTO $+6 ;
BSF WEI1,7 ;无断路 长响
BCF WEI1,6 ;
BCF WEI1,5 ;
CALL LL ;
GOTO START ;
BSF WEI1,6 ;有断路 快响
BCF WEI1,5 ;
BCF WEI1,7 ;
CALL LL ;
GOTO START ;
;-------------------------------------------------------------------------
V5: ;5V-9.9V之间
BTFSC WEI1,1 ;判断是否有断路
GOTO $+5 ;
BSF WEI1,5 ;无断路 慢响
BCF WEI1,6 ;
BCF WEI1,7 ;
GOTO DISPLAY ;
BSF WEI1,6 ;有断路 快响
BCF WEI1,5 ;
BCF WEI1,7 ;
GOTO DISPLAY ;
;-------------------------------------------------------------------------
V10: ;10V-15.9V之间
BTFSC WEI1,1 ;判断是否有断路
GOTO $+5 ;
BCF WEI1,5 ;无断路 不响
BCF WEI1,6 ;
BCF WEI1,7 ;
GOTO DISPLAY ;
BSF WEI1,6 ;有断路 快响
BCF WEI1,5 ;
BCF WEI1,7 ;
GOTO DISPLAY ;
;-------------------------------------------------------------------------
V16: ;16V-19.9V
BSF WEI1,6 ;快响
BCF WEI1,5 ;
BCF WEI1,7 ;
GOTO DISPLAY ;
;-------------------------------------------------------------------------
V_20:
BTFSC WEI1,1 ;判断是否有断路
GOTO $+6 ;
BSF WEI1,7 ;无断路 长响
BCF WEI1,6 ;
BCF WEI1,5 ;
CALL HH ;
GOTO START ;
BSF WEI1,6 ;有断路 快响
BCF WEI1,5 ;
BCF WEI1,7 ;
CALL HH ;
GOTO START ;
;-------------------------------------------------------------------------
;运算“显示值”
DISPLAY:
NOP ;
HUN:
MOVF WEI2,W ;
MOVWF WEI3 ;WEI2-100D的余值传给WEI3作为“十位值运算”的启始值
MOVLW D’100’
BCF STATUS,C ;清零“进位标志位”
SUBWF WEI2,F ;WEI2-100D余值传给WEI2
BTFSS STATUS,C ;判WEI2是否大于100D
GOTO TEN ;小于100D 跳到“十位值运算”处
INCF WEI5,F ;大于100D WEI5+1:百位值
GOTO HUN
TEN:
MOVF WEI3,W ;
MOVWF WEI4 ;
MOVLW D’10’ ;WEI3-10D的余值传给WEI4作为“个位值运算”的启始值
BCF STATUS,C ;清零“进位标志位”
SUBWF WEI3,F ;WEI3-10D余值传给WEI3
BTFSS STATUS,C ;判WEI2是否大于10D
GOTO NUMB ;小于10D 跳到“个位值运算”处
INCF WEI6,F ;大于10D WEI6+1:十位值
GOTO TEN
;------------------------------------------------------------------------
;显示“十位值”“小数点”
NUMB:
MOVF WEI6,W
CALL TABLE ;
MOVWF PORTB ;设置“十位值”
BCF PORTA,DP ;设置小数点
BCF PORTA,L ;打开显示“十位值”
CALL DELAY ;
MOVLW B’11111111’ ;
MOVWF PORTB ;清除“十位值”
BSF PORTA,DP ;清除小数点
BSF PORTA,L ;关闭显示“十位值”
;------------------------------------------------------------------------
;显示“个位值” “百位值”
MOVF WEI4,W
CALL TABLE
MOVWF PORTB ;设置“个位值”
BCF STATUS,Z ;清除“零标志位”
CLRW ;清除W
IORWF WEI5,W ;
BTFSS STATUS,Z ;判有无“百位值”
BCF PORTA,DP ;显示“百位值”
BCF PORTA,R ;打开显示“个位值”
CALL DELAY ;
MOVLW B’11111111’ ;
MOVWF PORTB ;清除“个位值”
BSF PORTA,DP ;清除“百位值”
BSF PORTA,R ;关闭显示“个位值”
CLRF WEI6 ;
CLRF WEI5 ;
GOTO START ;
;************************************************************************
;延时20MS秒程序
DELAY:
MOVLW D’10’ ;
MOVWF WEIE ;
DELAY1:
MOVLW D’10’ ;
MOVWF WEIF ;
DELAY2:
MOVLW D’10’ ;
MOVWF WEIG ;
DELAY3:
DECFSZ WEIG,F ;
GOTO DELAY3 ;
DECFSZ WEIF,F ;
GOTO DELAY2 ;
DECFSZ WEIE,F ;
GOTO DELAY1 ;
RETURN ;
;------------------------------------------------------------------------
;延时0.5秒程序
DELAYP5:
CLRF WEI9 ;
CLRF WEIA ;
BTFSS WEIA,2 ;
GOTO $-1 ;
CLRF WEI9 ;
CLRF WEIA ;
RETURN ;
;------------------------------------------------------------------------
;延时3秒程序
DELAY3S:
CLRF WEI9 ;
CLRF WEIA ;
BTFSS WEIA,4 ;
GOTO $-1 ;
CLRF WEI9 ;
CLRF WEIA ;
RETURN ;
;------------------------------------------------------------------------
CV:
BTFSS WEI1,0 ;
, RETURN ;
MOVLW B’11100000’ ;
ANDWF WEI1,W ;
BTFSS STATUS,Z ;
RETURN ;
MOVF ADRES,W ;
XORWF WEI8,W ;
BTFSS STATUS,Z ;
GOTO CLEAR ;
BTFSS WEIA,4 ;
RETURN ;
BSF INTCON,RBIE ;使能PORTB引脚电平变化中断
BCF INTCON,GIE ;禁止全局中断
BCF INTCON,T0IE ;
MOVF PORTB,F ;读状态
SLEEP ;进入休眠状态
NOP ;
CLRF INTCON ;
BSF INTCON,GIE ;
BSF INTCON,T0IE ;
CLRF WEI9 ;
CLRF WEIA ;
RETURN ;
CLEAR:
CLRF WEI9 ;
CLRF WEIA ;
RETURN ;
;------------------------------------------------------------------------
LL:
MOVLW B’11000111’ ;
MOVWF PORTB ;
BCF PORTA,L ;
BCF PORTA,R ;
CALL DELAY ;
MOVLW B’11111111’ ;
MOVWF PORTB ;
BSF PORTA,L ;
BSF PORTA,R ;
RETURN
;------------------------------------------------------------------------
HH:
MOVLW B’10001001’ ;
MOVWF PORTB ;
BCF PORTA,L ;
BCF PORTA,R ;
CALL DELAY ;
MOVLW B’11111111’ ;
MOVWF PORTB ;
BSF PORTA,L ;
BSF PORTA,R ;
RETURN
;************************************************************************
;TMR0中断
INTER:
MOVWF WEIH ;W,STATUS压入堆栈
SWAPF STATUS,W ;
MOVWF WEII ;
BCF INTCON,T0IF ;
MOVLW D’252’ ;
MOVWF TMR0 ;设置TMR0初始值
INCFSZ WEI9,F ;
GOTO $+2 ;
INCF WEIA,F ;
MOVLW B’11100000’ ;
ANDWF WEI1,W ;
BTFSC STATUS,Z ;
GOTO OUT2 ;
MOVLW B’00001000’ ;
XORWF PORTA,F ;
BTFSS WEI1,6 ;
GOTO $+D’10’ ;
INCFSZ WEIB,F ;
GOTO OUT ;
BCF PORTA,BUZZER ;
BSF STATUS,RP0 ;
MOVF TRISA,W ;
XORLW B’00001000’ ;
MOVWF TRISA ;
BCF STATUS,RP0 ;
GOTO OUT ;
;------------------------------------------------------------------------
BTFSS WEI1,5 ;
GOTO OUT1 ;
INCFSZ WEIC,F ;
GOTO OUT ;
INCF WEID,F ;
BTFSS WEID,2 ;
GOTO OUT ;
CLRF WEIC ;
CLRF WEID ;
BCF PORTA,BUZZER ;
BSF STATUS,RP0 ;
MOVF TRISA,W ;
XORLW B’00001000’ ;
MOVWF TRISA ;
BCF STATUS,RP0 ;
GOTO OUT ;
OUT1:
BSF STATUS,RP0 ;
MOVF TRISA,W ;
ANDLW B’11110111’ ;
MOVWF TRISA ;
BCF STATUS,RP0 ;
GOTO OUT ;
OUT2:
BCF PORTA,BUZZER ;
OUT:
SWAPF WEII,W ;W,STATUS弹出堆栈
MOVWF STATUS ;
SWAPF WEIH,F ;
SWAPF WEIH,W ;
RETFIE ;允许中断并返回
END