定義用戶寄存器
WEI1EQUH’0C’;BIT0=MODS:選擇模式位0:模式11:模式2
;BIT1=BREK:斷路判別位0:無斷路1:有斷路
;BIT2=
;BIT3=
;BIT4=
;BIT5=慢響
;BIT6=快響
;BIT7=長響
WEI2EQUH’0D’;“百位值運算”的啟始值
?
WEI3EQUH’0E’;“十位值運算”的啟始值
WEI4EQUH’0F’;個位值
WEI5EQUH’10’;百位值
WEI6EQUH’11’;十位值
WEI7EQUH’12’;
WEI8EQUH’13’;
WEI9EQUH’14’;
WEIAEQUH’15’;
WEIBEQUH’16’
WEICEQUH’17’
WEIDEQUH’18’
WEIEEQUH’19’
WEIFEQUH’1A’
WEIGEQUH’1B’
WEIHEQUH’1C’
WEIIEQUH’1D’
CHECKEQUH’7’
DPEQUH’1’
ADEQUH’0’
BUZZEREQUH’3’
REQUH’2’
LEQUH’4’
;************************************************************************
;矢量地址
ORGH’00’;復位矢量
GOTOMAIN
ORGH’04’;中斷矢量
NOP
GOTOINTER
;************************************************************************
;數碼值
TABLE:
ADDWFPCL,F;
RETLWB’01000000’;“0”值
RETLWB’01111001’;“1”值
RETLWB’00100100’;“2”值
RETLWB’00110000’;“3”值
RETLWB’00011001’;“4”值
RETLWB’00010010’;“5”值
RETLWB’00000010’;“6”值
RETLWB’01011000’;“7”值
RETLWB’00000000’;“8”值
RETLWB’00010000’;“9”值
;------------------------------------------------------------------------
;清除寄存器WEI1-WEIG
MAIN:
CLRFWEI1;
CLRFWEI2;
CLRFWEI3;
CLRFWEI4;
CLRFWEI5;
CLRFWEI6;
CLRFWEI7;
CLRFWEI8;
CLRFWEI9;
CLRFWEIA;
CLRFWEIB;
CLRFWEIC;
CLRFWEID;
CLRFWEIE;
CLRFWEIF;
CLRFWEIG;
CLRFWEIH;
CLRFWEII;
BSFSTATUS,RP0;
BCFOPTION_REG,NOT_RBPU
BCFSTATUS,RP0;
MOV FPORTB,1;
BTFSSPORTB,1;
BSFWEI1,0;
;------------------------------------------------------------------------
;設置A/D通道及A/D結構
BSFSTATUS,RP0;
MOV LWB’00000010’;設置一個“A/D口”
MOV WFADCON1;參考電壓:工作電壓5V
MOV LWB’10000000’;
MOV WFTRISB;
MOV LWB’00000001’;
MOV WFTRISA;
MOV LWB’10000111’;
MOV WFOPTION_REG;
MOV LWB’10100000’;
MOV WFINTCON;
;-----------------------------------------------------------------------
;設置端口“輸入/輸出”并設置初始狀態
BCFSTATUS,RP0;
MOV LWB’01000000’;設置A/D通道:AN0
MOV WFADCON0;選用內部1:8時鐘振蕩
MOV LWB’01111111’;
MOV WFPORTB;
MOV LWB’00010110’;
MOV WFPORTA;
MOV LWD’252’;
MOV WFTMR0;設置TMR0初始值
;------------------------------------------------------------------------
;選擇模式
BTFSCWEI1,0;判斷“模式開關”是否閉合
GOTOMODLE2;“模式開關”閉合,則進入“模式2”
GOTOMODLE1;“模式開關”斷開,則進入“模式1”
;------------------------------------------------------------------------
;“模式1”初始化
MODLE1:
MOV FPORTB,1;
BTFSSPORTB,CHECK;判斷是否有斷路
GOTO$+7;
BSFWEI1,1;
BSFWEI1,6;有斷路:蜂鳴器快響并且“無顯示”延時3秒
BCFWEI1,5;
BCFWEI1,7;
CALLDELAY3S;無斷路:“無顯示”延時3秒
GOTOSTART;
CALLDELAY3S;
GOTOSTART;
;------------------------------------------------------------------------
MODLE2:
BSFWEI1,0;設置“模式選擇位”
BSFWEI1,7;打開蜂鳴器“長響”
BCFWEI1,5;
BCFWEI1,6;
BCFSTATUS,C;設置“進位標志位”
MOV LWB’11111111’;
MOV WFWEI7;
RLFWEI7,F;
MOV FWEI7,W;
MOV WFPORTB;設置“檢測數碼管段值”給PORT5
BCFPORTA,R;開通“右數碼管”
BCFPORTA,L;開通“左數碼管”
CALLDELAYP5;
BSFPORTA,R;關閉“右數碼管”
BSFPORTA,L;關閉“左數碼管”
MOV LWB’11111111’;
MOV WFPORTB;清除給PORT5的“檢測數碼管段值”
BTFSCWEI7,6;檢測是否完畢
GOTO$-D’11’;沒有完畢繼續檢測
BCFPORTA,DP;已完畢設置“小數點”及“1”值
BCFPORTA,R;開通“右數碼管”
BCFPORTA,L;開通“左數碼管”
CALLDELAYP5;
BSFPORTA,R;關閉“右數碼管”
BSFPORTA,L;關閉“左數碼管”
BSFPORTA,DP;清除“小數點”及“1”值
BCFWEI1,7;關閉蜂鳴器“長響”
BCFWEI1,6;
BCFWEI1,5;
GOTOSTART;
;------------------------------------------------------------------------
;開始工作
START:
MOV FPORTB,F;
BTFSCPORTB,CHECK;判斷是否有斷路
GOTODUANLU;有斷路
BCFWEI1,1;清0斷路判別位
GOTOPANZHI;無斷路
;------------------------------------------------------------------------
;斷路處理
DUANLU:
BSFWEI1,1;設置斷路判別位
BSFWEI1,6;
BCFWEI1,5;
BCFWEI1,7;
GOTOPANZHI;
;------------------------------------------------------------------------
;判斷電壓值
PANZHI:
BSFADCON0,ADON;A/D處于工作狀態
BSFADCON0,GO_DONE;A/D開始運行
BTFSCADCON0,GO_DONE;判A/D是否完成
GOTO$-1;A/D沒完成
BCFADCON0,ADIF;
BCFADCON0,ADON;A/D已完成關閉A/D
CALLCV;
MOV FADRES,W;
MOV WFWEI8;
MOV WFWEI2;A/D值傳給WEI2
BCFSTATUS,C;清零“進位標志位”
SUBLWD’200’;
BTFSSSTATUS,C
GOTOV_20;跳到“20V以上”程序
MOV FADRES,W
BCFSTATUS,C;清零“進位標志位”
SUBLWD’160’
BTFSSSTATUS,C
GOTOV16;跳到“16V-19.9V之間”程序
MOV FADRES,W
BCFSTATUS,C;清零“進位標志位”
SUBLWD’100’
BTFSSSTATUS,C
GOTOV10;跳到“10V-15.9V之間”程序
MOV FADRES,W
BCFSTATUS,C;清零“進位標志位”
SUBLWD’50’
BTFSSSTATUS,C
GOTOV5;跳到“5V-9.9V之間”程序
GOTOV4.9;跳到4.9V以下程序
;-------------------------------------------------------------------------
V4.9:;4.9V以下數碼管顯示LL
BTFSCWEI1,1;判斷是否有斷路
GOTO$+6;
BSFWEI1,7;無斷路長響
BCFWEI1,6;
BCFWEI1,5;
CALLLL;
GOTOSTART;
BSFWEI1,6;有斷路快響
BCFWEI1,5;
BCFWEI1,7;
CALLLL;
GOTOSTART;
;-------------------------------------------------------------------------
V5:;5V-9.9V之間
BTFSCWEI1,1;判斷是否有斷路
GOTO$+5;
BSFWEI1,5;無斷路慢響
BCFWEI1,6;
BCFWEI1,7;
GOTODISPLAY;
BSFWEI1,6;有斷路快響
BCFWEI1,5;
BCFWEI1,7;
GOTODISPLAY;
;-------------------------------------------------------------------------
V10:;10V-15.9V之間
BTFSCWEI1,1;判斷是否有斷路
GOTO$+5;
BCFWEI1,5;無斷路不響
BCFWEI1,6;
BCFWEI1,7;
GOTODISPLAY;
BSFWEI1,6;有斷路快響
BCFWEI1,5;
BCFWEI1,7;
GOTODISPLAY;
;-------------------------------------------------------------------------
V16:;16V-19.9V
BSFWEI1,6;快響
BCFWEI1,5;
BCFWEI1,7;
GOTODISPLAY;
;-------------------------------------------------------------------------
V_20:
BTFSCWEI1,1;判斷是否有斷路
GOTO$+6;
BSFWEI1,7;無斷路長響
BCFWEI1,6;
BCFWEI1,5;
CALLHH;
GOTOSTART;
BSFWEI1,6;有斷路快響
BCFWEI1,5;
BCFWEI1,7;
CALLHH;
GOTOSTART;
;-------------------------------------------------------------------------
;運算“顯示值”
DISPLAY:
NOP;
HUN:
MOV FWEI2,W;
MOV WFWEI3;WEI2-100D的余值傳給WEI3作為“十位值運算”的啟始值
MOV LWD’100’
BCFSTATUS,C;清零“進位標志位”
SUBWFWEI2,F;WEI2-100D余值傳給WEI2
BTFSSSTATUS,C;判WEI2是否大于100D
GOTOTEN;小于100D跳到“十位值運算”處
INCFWEI5,F;大于100DWEI5+1:百位值
GOTOHUN
TEN:
MOV FWEI3,W;
MOV WFWEI4;
MOV LWD’10’;WEI3-10D的余值傳給WEI4作為“個位值運算”的啟始值
BCFSTATUS,C;清零“進位標志位”
SUBWFWEI3,F;WEI3-10D余值傳給WEI3
BTFSSSTATUS,C;判WEI2是否大于10D
GOTONUMB;小于10D跳到“個位值運算”處
INCFWEI6,F;大于10DWEI6+1:十位值
GOTOTEN
;------------------------------------------------------------------------
;顯示“十位值”“小數點”
NUMB:
MOV FWEI6,W
CALLTABLE;
MOV WFPORTB;設置“十位值”
BCFPORTA,DP;設置小數點
BCFPORTA,L;打開顯示“十位值”
CALLDELAY;
MOV LWB’11111111’;
MOV WFPORTB;清除“十位值”
BSFPORTA,DP;清除小數點
BSFPORTA,L;關閉顯示“十位值”
;------------------------------------------------------------------------
;顯示“個位值”“百位值”
MOV FWEI4,W
CALLTABLE
MOV WFPORTB;設置“個位值”
BCFSTATUS,Z;清除“零標志位”
CLRW;清除W
IORWFWEI5,W;
BTFSSSTATUS,Z;判有無“百位值”
BCFPORTA,DP;顯示“百位值”
BCFPORTA,R;打開顯示“個位值”
CALLDELAY;
MOV LWB’11111111’;
MOV WFPORTB;清除“個位值”
BSFPORTA,DP;清除“百位值”
BSFPORTA,R;關閉顯示“個位值”
CLRFWEI6;
CLRFWEI5;
GOTOSTART;
;************************************************************************
;延時20MS秒程序
DELAY:
MOV LWD’10’;
MOV WFWEIE;
DELAY1:
MOV LWD’10’;
MOV WFWEIF;
DELAY2:
MOV LWD’10’;
MOV WFWEIG;
DELAY3:
DECFSZWEIG,F;
GOTODELAY3;
DECFSZWEIF,F;
GOTODELAY2;
DECFSZWEIE,F;
GOTODELAY1;
RETURN;
;------------------------------------------------------------------------
;延時0.5秒程序
DELAYP5:
CLRFWEI9;
CLRFWEIA;
BTFSSWEIA,2;
GOTO$-1;
CLRFWEI9;
CLRFWEIA;
RETURN;
;------------------------------------------------------------------------
;延時3秒程序
DELAY3S:
CLRFWEI9;
CLRFWEIA;
BTFSSWEIA,4;
GOTO$-1;
CLRFWEI9;
CLRFWEIA;
RETURN;
;------------------------------------------------------------------------
CV:
BTFSSWEI1,0;
RETURN;
MOV LWB’11100000’;
ANDWFWEI1,W;
BTFSSSTATUS,Z;
RETURN;
MOV FADRES,W;
XORWFWEI8,W;
BTFSSSTATUS,Z;
GOTOCLEAR;
BTFSSWEIA,4;
RETURN;
BSFINTCON,RBIE;使能PORTB引腳電平變化中斷
BCFINTCON,GIE;禁止全局中斷
BCFINTCON,T0IE;
MOV FPORTB,F;讀狀態
SLEEP;進入休眠狀態
NOP;
CLRFINTCON;
BSFINTCON,GIE;
BSFINTCON,T0IE;
CLRFWEI9;
CLRFWEIA;
RETURN;
CLEAR:
CLRFWEI9;
CLRFWEIA;
RETURN;
;------------------------------------------------------------------------
LL:
MOV LWB’11000111’;
MOV WFPORTB;
BCFPORTA,L;
BCFPORTA,R;
CALLDELAY;
MOV LWB’11111111’;
MOV WFPORTB;
BSFPORTA,L;
BSFPORTA,R;
RETURN
;------------------------------------------------------------------------
HH:
MOV LWB’10001001’;
MOV WFPORTB;
BCFPORTA,L;
BCFPORTA,R;
CALLDELAY;
MOV LWB’11111111’;
MOV WFPORTB;
BSFPORTA,L;
BSFPORTA,R;
RETURN
;************************************************************************
;TMR0中斷
INTER:
MOV WFWEIH;W,STATUS壓入堆棧
SWAPFSTATUS,W;
MOV WFWEII;
BCFINTCON,T0IF;
MOV LWD’252’;
MOV WFTMR0;設置TMR0初始值
INCFSZWEI9,F;
GOTO$+2;
INCFWEIA,F;
MOV LWB’11100000’;
ANDWFWEI1,W;
BTFSCSTATUS,Z;
GOTOOUT2;
MOV LWB’00001000’;
XORWFPORTA,F;
BTFSSWEI1,6;
GOTO$+D’10’;
INCFSZWEIB,F;
GOTOOUT;
BCFPORTA,BUZZER;
BSFSTATUS,RP0;
MOV FTRISA,W;
XORLWB’00001000’;
MOV WFTRISA;
BCFSTATUS,RP0;
GOTOOUT;
;------------------------------------------------------------------------
BTFSSWEI1,5;
GOTOOUT1;
INCFSZWEIC,F;
GOTOOUT;
INCFWEID,F;
BTFSSWEID,2;
GOTOOUT;
CLRFWEIC;
CLRFWEID;
BCFPORTA,BUZZER;
BSFSTATUS,RP0;
MOV FTRISA,W;
XORLWB’00001000’;
MOV WFTRISA;
BCFSTATUS,RP0;
GOTOOUT;
OUT1:
BSFSTATUS,RP0;
MOV FTRISA,W;
ANDLWB’11110111’;
MOV WFTRISA;
BCFSTATUS,RP0;
GOTOOUT;
OUT2:
BCFPORTA,BUZZER;
OUT:
SWAPFWEII,W;W,STATUS彈出堆棧
MOV WFSTATUS;
SWAPFWEIH,F;
SWAPFWEIH,W;
RETFIE;允許中斷并返回
END
評論
查看更多