⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 roller.asm

📁 本源程序是实现军用卷图机通过输入页码来是卷图机卷至指定得页码的功能
💻 ASM
📖 第 1 页 / 共 2 页
字号:
       
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 + -