基于PIC单片机直流电压表的汇编程序分享

定义用户寄存器
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;
;------------------------------------------------------------------------
;“模式2”初始化检测数码管各段,蜂鸣器“长响”
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

CA33型高压非固体电解质钽电容器
【月度盘点】拓维信息2月精彩回顾
马斯克称2年内从缺硅变缺电 甚至阻碍AI的发展
索尼PS5将内置游戏AI助手,帮助玩家拥有更好的游戏体验
华为MateX正式发布 号称全球最快的可折叠5G手机
基于PIC单片机直流电压表的汇编程序分享
男子突发心梗路人用AED成功抢救
中国开发者真实现状:30岁以下开发者人数占比超7成,近半数开发者工作在一线城市
选择PLC机型时还需要考虑以下因素!
韩国代表正在申请将韩国5G技术作为全球标准
华为:电信云打造5G智慧大脑
抢占数字经济发展制高点 人工智能驱动川企智慧变革
未来的芯片演进还在继续,逻辑缩放技术仍是现代计算的基础
谷歌ARCore:安卓上的AR平台,诺基亚8已获得支持
欧姆龙投资10亿日元增设OMS二期工厂!
SiC功率器件和模块!
光伏市场未来五年组件价格将再降37%-50%
安森美推出FlexRay通信协定的总线收发器IC—NCV7381
IoT存储的落地将推动城市轨道交通的发展
共筑数字生态,移远通信闪耀2022天翼数字科技生态大会