📄 roller.asm
字号:
;图片增 图片减
;@ @ @
;上拉 下放 公共端
;P3.6
;P3.7控制电机的通电与否,常闭端为断电状态,常开端为通电状态
;读图纸叶码P3.0,P3.1,P3.4,P3.5为码值的低位到高位
;P0口为LED1输出,P2口为LED2输出
;键盘输入为P1口
;int1为
;占用r0,r4,r5,r6,r1
sum EQU 30h;图纸总页码
now EQU 31h;现在所在页码寄存器
his EQU 32h;历史记录寄存器
input EQU 33h;键盘及红外遥控输入的输入页码寄存器
ledtemp01 EQU 34h
ledtemp11 EQU 35h
ledtemp02 EQU 36h
ledtemp12 EQU 37h
bcd0 EQU 38h
bcd1 EQU 39h
in0 EQU 3ah
in1 EQU 3bh
state EQU 3ch
level EQU 3dh
had EQU 3eh
dest EQU 3fh
finaldes EQU 40h
inputpro EQU 41h
upordown EQU 42h;up 0ffh down 0h, still 0f0h
last EQU 43h;暂存上一次的页码
irsou EQU 44h
irnum EQU 45h
irnot EQU 46h;用来标志是否红外中断过,0为未中断过,0ffh为中断过
led0 EQU P0
led1 EQU P2
org 0000h
ajmp start
org 0003h
ljmp picnum;读图纸页码中断
org 000bh
ljmp flash;LED闪烁中断
org 0013h
ljmp ir;红外读码中断
org 0100h
start: clr p3.6
clr p3.7;使得继电器12断开
mov inputpro,#0ffh;输入的是sum还是页码值寄存器
mov level,#0ffh ;设置level寄存器为输入状态寄存器,ENTER后表示输入完全为0ffh
mov state,#0ffh ;设置状态寄存器,当在滚动中,寄存器为0ffh,;静止中为0h
mov had,#0ffh ;输出否寄存器,当返回已经输出则为0ffh,未输出则为0h
mov sum,#16
mov irnot,#0
mov r3,#10;设置R1为中断次数寄存器
mov dptr,#tab
setb et0;开定时器0中断
mov tmod,#00000001b
mov th0,#00111100b;设置初值
mov tl0,#10110000b
setb tr0;开始计数
setb ea;允许中断中断
mov ledtemp01,#80h
mov ledtemp11,#80h
mov ledtemp02,#0ffh
mov ledtemp12,#0ffh;给各个单元赋值
mov led0,ledtemp01
mov led1,ledtemp11
;初试化卷图机
initi: jb p3.2,upward;判断是否定位准确,即是否使得定位光电对管导通
sjmp work ;进入正常工作状态
upward: acall rollup ;使得电机带动图画向上卷动
sjmp initi ;继续循环判断是否定位准确
work: acall poweroff;停止卷图机工作
mov upordown,#0f0h
mov state,#0
clr tr0 ;停止计数,使得卷图机的LED不再闪动显示88
setb it0;使得外中断下降沿有效
acall codein;读取页码
mov a,now
mov his,a;将当前的码值存入历史寄存器
mov r0,now
inc r0
acall divi;调用除法子程序来做十进制调整
mov led1,bcd1
mov led0,bcd0;输出显示当前的页码
;#########################进入正常工作状态
mov r1,#2;设置r1为输入数字键个数计数器
scan: acall keyscan;循环扫描键盘,r4为返回键值
acall action
mov a,level
cjne a,#0ffh,conti;如果不是0ffh的话,说明没有输入结束,继续等待输入
;否则输出当前的页码值
mov level,#0;使得level寄存器为0,表示输出过
mov a,had
cjne a,#0h,display;判断是否输出过,如果没有则跳转到判断输出类型程序段,否则继续扫描键盘
ajmp conti
display:mov had,#0
mov a,state;
cjne a,#0ffh,state1;若不为
state0: acall dispmo
ajmp conti
state1: acall dispst
conti: ajmp scan
dispst: push psw
push acc
push dpl
push dph
mov dptr,#tab
mov a,now;静态显示当前的页码
inc a
mov r0,a
acall divi;调用除法子程序,转换数值为BCD码表示
mov a,bcd0
mov led0,a;把低位BCD码给低位数码管
mov a,bcd1
mov led1,a;把高位的BCD码给高位数码管
pop dph
pop dpl
pop acc
pop psw
ret
;按键判断动作子程序
action: mov irnot,#0
mov a,r4
cjne a,#10,judge
acall next;如果等于10,调用next子程序
ajmp backact
judge: jc innum
cjne a,#11,testback;如果输入键值是不是11试探是否为12
acall prev;调用pre子程序
ajmp backact
testback:cjne a,#12,testenter;如果输入键值是不是12试探是否为13
acall back;调用back子程序
ajmp backact
testenter:cjne a,#13,testcan;如果输入键值是不是13试探是否为14
acall enter ;调用enter子程序
ajmp backact
testcan: cjne a,#14,testhome;如果输入键值是不是14则应为15
acall cancel;调用cancel子程序
ajmp backact
testhome: cjne a,#15h,testend
acall home;调用setsum子程序
ajmp backact
testend: cjne a,#16h,NULL
acall picend
ajmp backact
NULL: acall void
ajmp backact
;如果输入的是数码则执行下半程序
innum: mov a,r1
cjne a,#0,eninput;如果r1不为零则允许输入,否则不能输入数码
ajmp backact
eninput:dec r1;r1减去一
mov a,r1
cjne a,#0,first;如果r1为1,则表示输入的是第一个码
mov a,dest
mov b,#10
mul ab
add a,r4
mov dest,a;计算输入的数值,存入目标寄存器
mov led1,in0
acall trans
mov in1,r4;保存键入的第二个值
mov led0,r4;输入键码输出到led0上
ajmp backact
first: clr tr0
mov led1,#0ffh;数码管高位清除
mov dest,r4
acall trans
mov in0,r4;将输入的码放入in0单元存储
mov led0,r4;数码管低位输出输入的码
mov level,#0
mov had,#0ffh
backact:ret
;转为BCD码程序
trans: push psw
push acc
push dpl
push dph
mov dptr,#tab
mov a,r4
movc a,@a+dptr;查表法求得对应的BCD码值
mov r4,a
pop dph
pop dpl
pop acc
pop psw
ret
;r0为被除数
divi: push psw
push acc;保护现场
push dpl
push dph
mov dptr,#tab
mov a,r0
mov b,#10
div ab;除法来求商取余
movc a,@a+dptr;
mov bcd1,a;查表得商对应的BCD码制
mov a,b;B的值传递给A
movc a,@a+dptr;
mov bcd0,a;查表得余数对应的BCD码制
pop dph
pop dpl
pop acc;
pop psw;恢复现场
ret
;读取当前图纸页码子程序
codein: push psw
push acc;保护现场
clr a;清A寄存器
mov c,p3.5;由于硬件的连接不是连续的,所以p3.5,p3.4,p3.1,p3.2
rlc a
mov c,p3.4
rlc a
mov c,p3.1
rlc a
mov c,p3.0
rlc a;
mov now,a;通过循环右移得到当前得到当前的图纸页码
pop acc
pop psw
ret
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
back: mov a,his
cjne a,now,backhis;把当前的页码和历史页码比较
mov a,upordown;当相同时,判断当前是否处于运动状态
cjne a,#0f0h,run;当处于运动状态时跳转到另段程序
ajmp endback ;当处于静止状态时结束当前的返回操作
;当卷图机处于运动状态而又未卷动到目标页码时
run: mov a,now ;将now的值赋给a
mov finaldes,a;将a值传递给目标寄存器
jc upload;判断如果历史页码小于当前页码,跳转到upload
acall rolldown;否则向下转动
ajmp endback;跳出back子程序
upload: acall rollup;调用上卷子程序
mov upordown,#0ffh;将卷图机状态寄存器0ffh
ajmp endback;跳出back子程序
backhis:mov a,his;
mov finaldes,a;把历史记录放入目的页寄存器
mov a,now;把当前的页码放入历史寄存器
mov his,a
cjne a,finaldes,go;比较当前的页码和目标页码
go: jc goup;当当前的页码小于目标页码时跳转到GOUP
acall rolldown;启动向下卷动
setb ex0
mov upordown,#0;把向上向下寄存器放入0
acall dispmo;显示闪动
ajmp endback
goup: acall rollup;调用上卷子程序
setb ex0;开读码外中断
mov upordown,#0ffh ;设置卷图机状态寄存器为上卷状态
acall dispmo;调用动态显示子程序
endback:ret
;))))))))))))))))))))))))))))))))))))))))))))))))
rollup: push psw
push acc
clr p3.7;清除p3.6,使得继电器1断开
setb p3.6;置位p3.7,使得继电器2吸合
mov upordown,#0ffh;向上向下寄存器
pop acc
pop psw
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -