📄 roller.asm
字号:
rolldown:push psw
push acc
clr p3.6;置位p3.6,使得继电器1吸合
setb p3.7;置位p3.7,使得继电器2吸合
mov upordown,#0h;向上向下寄存器
pop acc
pop psw
ret
poweroff:push psw
push acc
clr p3.6;清除p3.6,使得继电器1断开
clr p3.7;清除p3.7,使得继电器2断开
pop acc
pop psw
ret
;使得数码管闪烁的子程序
;此处设置了四个存储单元,分别为ledtemp01 ledtemp02 ledtemp11 ledtemp12
flash :push psw
push acc
push dpl
push dph
mov dptr,#tab
mov th0,#00111100b;恢复初值
mov tl0,#10110000b
djnz r3,backfl
mov r3,#10;恢复中断次数寄存器
mov a,ledtemp01
mov r0,ledtemp02
mov ledtemp01,r0
mov ledtemp02,a;交换低位led两个内存单元的数据
mov a,ledtemp11
mov r0,ledtemp12
mov ledtemp11,r0
mov ledtemp12,a; 交换高位led两个内存单元的数据
mov led0,ledtemp01;输出内存单元的数据到led上
mov led1,ledtemp11
backfl:pop dph
pop dpl
pop acc;恢复现场返回主程序
pop psw
reti
dispmo:push psw;动态显示当前的页码
push acc
push dpl
push dph
mov dptr,#tab
mov a,now;将现在的页码存到a
inc a;
mov r0,a;
acall divi;将页码转换成BCD码
mov a,bcd0;
mov ledtemp01,a;
mov a,bcd1;
mov ledtemp11,a;
mov ledtemp02,#0ffh;给另外一个寄存器赋0ffh
mov ledtemp12,#0ffh;给另外一个寄存器赋0ffh
mov led0,ledtemp01;
mov led1,ledtemp11;输出当前的页码值
mov th0,#00111100b;设置初值
mov tl0,#10110000b;
mov r3,#10 ;设置r1为中断次数
setb tr0;开始计数
pop dph
pop dpl
pop acc
pop psw
ret
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
prev: mov a,now ;将now传递给a
cjne a,#0,endpre ;
ajmp endpr
endpre:mov a,now ;将当前页码存入历史内存单元
mov his,a
dec a ;将a减去1
mov finaldes,a ;存入目标寄存器
acall rolldown;向下卷动
setb ex0;开读码中断
acall dispmo
mov state,#0ffh;卷图机处于运动状态
endpr:ret
;################################
next: mov a,now
cjne a,#15,endon;如果当前处于第16幅图则不响应向后卷动
ajmp backnext
endon: mov a,now
mov his,a;将当前页码存入历史内存单元
inc a;将a加1
mov finaldes,a ;存入目标寄存器
setb ex0;开读码中断
acall rollup;调用上卷子程序
acall dispmo;向上卷动
mov state,#0ffh;卷图机处于运动状态
backnext:ret
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
cancel:mov had,#0ffh;
mov r1,#2;给输入个数值赋给2
mov level,#0ffh;给输出
mov a,now
mov dest,a
ret
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
enter: cjne r1,#2,inputen
ajmp backent;当enter键按下,如果没有输入数值则不响应
inputen:mov level,#0ffh
mov a,dest
cjne a,#0,over0;判断输入是否是0
ajmp backent
over0: cjne a,sum,over;不为零时,判断与输入总数是否超过了总图片总数
ajmp endp
over: jnc backent
endp: mov a,dest
dec a;将dest减去1然后存入finaldes寄存器
mov finaldes,a;将最终确定的值保存以备判断
mov a,now
cjne a,finaldes,panduan;判断输入是否与当前的值相同,如果相同则执行以下的程序
mov a,upordown;否则跳转
cjne a,#0f0h,moving;跟0f0h比较,如果不等跳转
mov upordown,#0f0h;如果相等则赋滚动状态寄存器0f0h
ajmp backent;跳出enter子程序
moving:jc upmove;如果小于0f0表示此次滚筒正向下转但没有到达目标点,所以向上转动
acall rolldown;调用下放子程序
mov upordown,#0;将状态寄存器值赋给0
ajmp backent;跳出子程序
upmove:acall rollup;调用向上子程序
mov upordown,#0ffh
ajmp backent
panduan:jc up
acall rolldown;调用下放子程序
mov a,now
mov his,a;将当前的页码放入历史子程序
mov upordown,#0
setb ex0;开外中断0,读码中断
acall dispmo;调用动态显示子程序
ajmp backent;跳转出子程序
up: acall rollup;调用上卷子程序
mov a,now;将当前的页码存入历史内存单元
mov his,a
mov upordown,#0ffh;把卷图机状态单元置0ffh
setb ex0 ;开外中断0,读码中断
acall dispmo ;调用动态显示子程序
backent:mov r1,#2
ret
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void: ret
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
picnum: acall codein ;调用读码子程序
mov a,now
cjne a,finaldes,motion;判断当前页码是否等于目标页码
acall poweroff ;如果相等,则停止卷动
clr ex0 ;关读码中断
mov state,#0h ;将状态寄存单元置0
mov a,now ;
mov dest,a
clr tr0 ;关读码中断
acall dispst ;调用静态显示子程序
mov upordown,#0f0h;将状态寄存器存入0fh表示卷图机停止卷动
ajmp backpic
motion: acall dispmo
backpic:reti
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;键盘扫描子程序
keyscan:mov p1,#0f0h;向P1口输出0fh
wait: mov a,irnot
cjne a,#0h,backscanme
mov a,p1;读取p1口状态
cjne a,#0f0h,check;判断是否状态变化,若变化表示有键按下,否则说明没有按下
ajmp wait;有键按下则进入扫描程序
check: mov p1,#0f7h;扫描第一列
mov a,p1
cjne a,#0f7h,col1;如果读入变化则转入相应列扫描
mov p1,#0fbh;扫描第二列
mov a,p1
cjne a,#0fbh,col2;如果读入变化则转入相应列扫描
mov p1,#0fdh;扫描第三列
mov a,p1
cjne a,#0fdh,medi;跳转超界,所以加转移
mov p1,#0feh;扫描第四列
mov a,p1
ajmp col4;如果读入变化则转入相应列扫描
medi: ajmp col3
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@
col4: cjne a,#0eeh,row42;如果对应的返回码是0eeh,则表示4键盘按下
mov r4,#4
acall delay
acall testoff;调用是否松开按键子程序
ajmp backscan
row42: cjne a,#0deh,row43;如果对应的返回码是0deh,则表示8键盘按下
mov r4,#8
acall delay
acall testoff;调用是否松开按键子程序
ajmp backscan
row43: cjne a,#0beh,row44;如果对应的返回码是0beh,则表示11键盘按下
mov r4,#11
acall delay
acall testoff;调用是否松开按键子程序
ajmp backscan
row44: mov r4,#15;否则表示15键盘按下
acall delay
acall testoff;调用是否松开按键子程序
ajmp backscan
backscanme:ajmp backscan;中介的作用,
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@
col1: cjne a,#0e7h,row12;如果对应的返回码是0e7h,则表示1键盘按下
mov r4,#1
acall delay
acall testoff;调用是否松开按键子程序
ajmp backscan
row12: cjne a,#0d7h,row13;如果对应的返回码是0d7h,则表示5键盘按下
mov r4,#5
acall delay
acall testoff;调用是否松开按键子程序
ajmp backscan
row13: cjne a,#0b7h,row14;如果对应的返回码是0b7h,则表示9键盘按下
mov r4,#9
acall delay
acall testoff;调用是否松开按键子程序
ajmp backscan
row14: mov r4,#12;否则表示12键盘按下
acall delay
acall testoff;调用是否松开按键子程序
ajmp backscan
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@
col2: cjne a,#0ebh,row22;如果对应的返回码是0ebh,则表示2键盘按下
mov r4,#2
acall delay
acall testoff;调用是否松开按键子程序
ajmp backscan
row22: cjne a,#0dbh,row23;如果对应的返回码是0dbh,则表示6键盘按下
mov r4,#6
acall delay
acall testoff;调用是否松开按键子程序
ajmp backscan
row23: cjne a,#0bbh,row24;如果对应的返回码是0bbh,则表示0键盘按下
mov r4,#0
acall delay
acall testoff;调用是否松开按键子程序
ajmp backscan
row24: mov r4,#13;否则表示13键盘按下
acall delay
acall testoff;调用是否松开按键子程序
ajmp backscan
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@
col3: cjne a,#0edh,row32;如果对应的返回码是0edh,则表示3键盘按下
mov r4,#3
acall delay
acall testoff;调用是否松开按键子程序
ajmp backscan
row32: cjne a,#0ddh,row33;如果对应的返回码是0ddh,则表示7键盘按下
mov r4,#7
acall delay
acall testoff;调用是否松开按键子程序
ajmp backscan
row33: cjne a,#0bdh,row34;如果对应的返回码是0bdh,则表示10键盘按下
mov r4,#10
acall delay
acall testoff;调用是否松开按键子程序
ajmp backscan
row34: mov r4,#14;否则表示14键盘按下
acall delay
acall testoff;调用是否松开按键子程序
backscan:ret
;判断键是否松开
testoff:mov p1,#0f0h
mov a,p1
cjne a,#0f0h,testoff;如果不等于原先的输出值,则表示键没有松开
acall delay
mov a,p1
cjne a,#0f0h,testoff
ret
delay: mov r5,#100;防止抖动延时20ms
d0: mov r6,#100
d1: djnz r6,d1
djnz r5,d0
ret
tab: db 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,80H,090H
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -