汇编语言实现通过8255A和4个开关控制实现8个LED灯全亮、全灭、从左至右、从右至左跑马灯式点亮

折月煮酒 提交于 2019-12-05 05:08:03

汇编代码及解释如下:   

    .MODEL TINY

       .STACK          100

       .DATA    

       .CODE

start:

       ; set segment registers:

      mov bl,0feh      ;先将bl通用寄存器的值置为1111 1110(实验室的实验箱中电路没有设置反相器,故设为7个1,1个0)

     mov dx,273h      ;将273h送入地址寄存器dx,根据课本P169中8255A的端口操作表,由于273h中3对应0011,故A1A0=11,对应数据总线->控制寄存器,即为写入控制字做准备

     mov al,10000010b      ;将1000 0010写入al通用寄存器中

     out dx,al      ;将1000 0010设为8255A的控制字,根据课本P171中8255A的方式选择控制字可知D7...D1D0=1...10,故B口输入C口输出(以上四行为8255A的初始化程序)

go: mov al,0ffh      ;初始化al通用寄存器,初始化其值为1111 1111

    mov dx,272h      ;将272h送入地址寄存器dx,根据课本P169中8255A的端口操作表,由于272h中2对应0010,故A1A0=10,对应C口

    out dx,al      ;将al中的数据写入dx对应端口(即将al中数据写入C口)

    mov dx,271h      ;将271h送入地址寄存器dx,根据课本P169中8255A的端口操作表,由于271h中1对应0010,故A1A0=01,对应B口

    in al,dx      ;将al中的数据读入dx对应端口(即将al中数据读入B口)

    and al,0fh      ;对al寄存器中的8位值进行and(与)运算,只取后4位

    cmp al,0eh      ;cmp比较al中的值和0e,若相等,则zf标志位为1,执行jz指令

    jz st1

    cmp al,0dh

    jz nd1

    cmp al,0bh

    jz rd1

    cmp al,07h

    jz th1

    jmp go

st1: mov bl,0feh

    mov dx,272h

    mov al,00h

    out dx,al

    jmp go

nd1: mov bl,0feh

    mov dx,272h

    mov al,0ffh

    out dx,al

    jmp go

rd1: mov dx,272h

    mov al,bl

    out dx,al

    rol bl,1      ;rol中的l代表left,rol为循环左移指令,移位后经过ffff次loop再次jmp到go段重新执行,下同

    mov cx,0ffffh

lo1:loop lo1

    jmp go

th1: mov dx,272h

    mov al,bl

    out dx,al

    ror bl,1

    mov cx,0ffffh

lo2:loop lo2

    jmp go

end start

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!