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

📄 roller.asm

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