定义用户寄存器
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 ;
MOV F PORTB,1 ;
BTFSS PORTB,1 ;
BSF WEI1,0 ;
;------------------------------------------------------------------------
;设置A/D通道及A/D结构
BSF STATUS,RP0 ;
MOV LW B’00000010’ ;设置一个“A/D口”
MOV WF ADCON1 ;参考电压:工作电压5V
MOV LW B’10000000’ ;
MOV WF TRISB ;
MOV LW B’00000001’ ;
MOV WF TRISA ;
MOV LW B’10000111’ ;
MOV WF OPTION_REG ;
MOV LW B’10100000’ ;
MOV WF INTCON ;
;-----------------------------------------------------------------------
;设置端口“输入/输出”并设置初始状态
BCF STATUS,RP0 ;
MOV LW B’01000000’ ;设置A/D通道:AN0
MOV WF ADCON0 ;选用内部1:8时钟振荡
MOV LW B’01111111’ ;
MOV WF PORTB ;
MOV LW B’00010110’ ;
MOV WF PORTA ;
MOV LW D’252’ ;
MOV WF TMR0 ;设置TMR0初始值
;------------------------------------------------------------------------
;选择模式
BTFSC WEI1,0 ;判断“模式开关”是否闭合
GOTO MODLE2 ;“模式开关”闭合,则进入“模式2”
GOTO MODLE1 ;“模式开关”断开,则进入“模式1”
;------------------------------------------------------------------------
;“模式1”初始化
MODLE1:
MOV F 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 ;设置“进位标志位”
MOV LW B’11111111’ ;
MOV WF WEI7 ;
RLF WEI7,F ;
MOV F WEI7,W ;
MOV WF PORTB ;设置“检测数码管段值”给PORT5
BCF PORTA,R ;开通“右数码管”
BCF PORTA,L ;开通“左数码管”
CALL DELAYP5 ;
BSF PORTA,R ;关闭“右数码管”
BSF PORTA,L ;关闭“左数码管”
MOV LW B’11111111’ ;
MOV WF 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:
MOV F 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 ;
MOV F ADRES,W ;
MOV WF WEI8 ;
MOV WF WEI2 ;A/D值传给WEI2
BCF STATUS,C ;清零“进位标志位”
SUBLW D’200’ ;
BTFSS STATUS,C
GOTO V_20 ;跳到“20V以上”程序
MOV F ADRES,W
BCF STATUS,C ;清零“进位标志位”
SUBLW D’160’
BTFSS STATUS,C
GOTO V16 ;跳到“16V-19.9V之间”程序
MOV F ADRES,W
BCF STATUS,C ;清零“进位标志位”
SUBLW D’100’
BTFSS STATUS,C
GOTO V10 ;跳到“10V-15.9V之间”程序
MOV F 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:
MOV F WEI2,W ;
MOV WF WEI3 ;WEI2-100D的余值传给WEI3作为“十位值运算”的启始值
MOV LW 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:
MOV F WEI3,W ;
MOV WF WEI4 ;
MOV LW 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:
MOV F WEI6,W
CALL TABLE ;
MOV WF PORTB ;设置“十位值”
BCF PORTA,DP ;设置小数点
BCF PORTA,L ;打开显示“十位值”
CALL DELAY ;
MOV LW B’11111111’ ;
MOV WF PORTB ;清除“十位值”
BSF PORTA,DP ;清除小数点
BSF PORTA,L ;关闭显示“十位值”
;------------------------------------------------------------------------
;显示“个位值” “百位值”
MOV F WEI4,W
CALL TABLE
MOV WF PORTB ;设置“个位值”
BCF STATUS,Z ;清除“零标志位”
CLRW ;清除W
IORWF WEI5,W ;
BTFSS STATUS,Z ;判有无“百位值”
BCF PORTA,DP ;显示“百位值”
BCF PORTA,R ;打开显示“个位值”
CALL DELAY ;
MOV LW B’11111111’ ;
MOV WF PORTB ;清除“个位值”
BSF PORTA,DP ;清除“百位值”
BSF PORTA,R ;关闭显示“个位值”
CLRF WEI6 ;
CLRF WEI5 ;
GOTO START ;
;************************************************************************
;延时20MS秒程序
DELAY:
MOV LW D’10’ ;
MOV WF WEIE ;
DELAY1:
MOV LW D’10’ ;
MOV WF WEIF ;
DELAY2:
MOV LW D’10’ ;
MOV WF 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 ;
MOV LW B’11100000’ ;
ANDWF WEI1,W ;
BTFSS STATUS,Z ;
RETURN ;
MOV F ADRES,W ;
XORWF WEI8,W ;
BTFSS STATUS,Z ;
GOTO CLEAR ;
BTFSS WEIA,4 ;
RETURN ;
BSF INTCON,RBIE ;使能PORTB引脚电平变化中断
BCF INTCON,GIE ;禁止全局中断
BCF INTCON,T0IE ;
MOV F PORTB,F ;读状态
SLEEP ;进入休眠状态
NOP ;
CLRF INTCON ;
BSF INTCON,GIE ;
BSF INTCON,T0IE ;
CLRF WEI9 ;
CLRF WEIA ;
RETURN ;
CLEAR:
CLRF WEI9 ;
CLRF WEIA ;
RETURN ;
;------------------------------------------------------------------------
LL:
MOV LW B’11000111’ ;
MOV WF PORTB ;
BCF PORTA,L ;
BCF PORTA,R ;
CALL DELAY ;
MOV LW B’11111111’ ;
MOV WF PORTB ;
BSF PORTA,L ;
BSF PORTA,R ;
RETURN
;------------------------------------------------------------------------
HH:
MOV LW B’10001001’ ;
MOV WF PORTB ;
BCF PORTA,L ;
BCF PORTA,R ;
CALL DELAY ;
MOV LW B’11111111’ ;
MOV WF PORTB ;
BSF PORTA,L ;
BSF PORTA,R ;
RETURN
;************************************************************************
;TMR0中断
INTER:
MOV WF WEIH ;W,STATUS压入堆栈
SWAPF STATUS,W ;
MOV WF WEII ;
BCF INTCON,T0IF ;
MOV LW D’252’ ;
MOV WF TMR0 ;设置TMR0初始值
INCFSZ WEI9,F ;
GOTO $+2 ;
INCF WEIA,F ;
MOV LW B’11100000’ ;
ANDWF WEI1,W ;
BTFSC STATUS,Z ;
GOTO OUT2 ;
MOV LW B’00001000’ ;
XORWF PORTA,F ;
BTFSS WEI1,6 ;
GOTO $+D’10’ ;
INCFSZ WEIB,F ;
GOTO OUT ;
BCF PORTA,BUZZER ;
BSF STATUS,RP0 ;
MOV F TRISA,W ;
XORLW B’00001000’ ;
MOV WF 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 ;
MOV F TRISA,W ;
XORLW B’00001000’ ;
MOV WF TRISA ;
BCF STATUS,RP0 ;
GOTO OUT ;
OUT1:
BSF STATUS,RP0 ;
MOV F TRISA,W ;
ANDLW B’11110111’ ;
MOV WF TRISA ;
BCF STATUS,RP0 ;
GOTO OUT ;
OUT2:
BCF PORTA,BUZZER ;
OUT:
SWAPF WEII,W ;W,STATUS弹出堆栈
MOV WF STATUS ;
SWAPF WEIH,F ;
SWAPF WEIH,W ;
RETFIE ;允许中断并返回
END
上一篇:pic16c54警报声程序
下一篇:HT1621LCD驱动 PIC单片机
推荐阅读最新更新时间:2024-03-16 15:48