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

汇编代码及解释如下:   

 1     .MODEL    TINY
 2     .STACK        100
 3     .DATA    
 4     .CODE
 5 start:
 6     ; set segment registers:
 7         mov bl,0feh      ;先将bl通用寄存器的值置为1111 1110(实验室的实验箱中电路没有设置反相器,故设为7个1,1个0)
 8      mov dx,273h      ;将273h送入地址寄存器dx,根据课本P169中8255A的端口操作表,由于273h中3对应0011,故A1A0=11,对应数据总线->控制寄存器,即为写入控制字做准备
 9      mov al,10000010b      ;将1000 0010写入al通用寄存器中
10      out dx,al      ;将1000 0010设为8255A的控制字,根据课本P171中8255A的方式选择控制字可知D7...D1D0=1...10,故B口输入C口输出(以上四行为8255A的初始化程序)
11 go: mov al,0ffh      ;初始化al通用寄存器,初始化其值为1111 1111
12     mov dx,272h      ;将272h送入地址寄存器dx,根据课本P169中8255A的端口操作表,由于272h中2对应0010,故A1A0=10,对应C口
13     out dx,al      ;将al中的数据写入dx对应端口(即将al中数据写入C口)
14     mov dx,271h      ;将271h送入地址寄存器dx,根据课本P169中8255A的端口操作表,由于271h中1对应0010,故A1A0=01,对应B口
15     in al,dx      ;将al中的数据读入dx对应端口(即将al中数据读入B口)
16     and al,0fh      ;对al寄存器中的8位值进行and(与)运算,只取后4位
17     cmp al,0eh      ;cmp比较al中的值和0e,若相等,则zf标志位为1,执行jz指令
18     jz st1
19     cmp al,0dh
20     jz nd1
21     cmp al,0bh
22     jz rd1
23     cmp al,07h
24     jz th1
25     jmp go
26 st1: mov bl,0feh
27     mov dx,272h
28     mov al,00h
29     out dx,al
30     jmp go
31 nd1: mov bl,0feh
32     mov dx,272h
33     mov al,0ffh
34     out dx,al
35     jmp go
36 rd1: mov dx,272h
37     mov al,bl
38     out dx,al
39     rol bl,1      ;rol中的l代表left,rol为循环左移指令,移位后经过ffff次loop再次jmp到go段重新执行,下同
40     mov cx,0ffffh
41 lo1:loop lo1
42     jmp go
43 th1: mov dx,272h
44     mov al,bl
45     out dx,al
46     ror bl,1
47     mov cx,0ffffh
48 lo2:loop lo2
49     jmp go
50 end start
posted @ 2019-11-21 21:33  一杆赤槊  阅读(3993)  评论(0编辑  收藏  举报