8255第二种控制交通灯

stack segment
db 64 dup(?)
stack ends
data segment
ioport    equ 0ff00h - 0280h
io8255a equ ioport + 288h
io8255b equ ioport + 289h
io8255c equ ioport + 28ah
io8255d equ ioport + 28bh


portc1 db 24h, 44h, 04h, 44h, 04h, 44h, 04h,
db 81h, 82h, 80h, 82h, 80h, 82h, 80h
db 0ffh


data ends


code segment 
assume cs:code, ds:data


start: mov ax, data
mov ds, ax ;设置数据段

mov ax,stack ;设置堆栈段为
mov ss,ax ;第二种循环显示方法
mov sp,64 ;保存循环次数



mov dx, io8255d
mov al, 90h ;设置控制命令,10010000b
out dx, al ;将控制命令字写入io8255d中
lea di, portc1 ;把protcl的数据基址放入di

mov bx,3 ;设置第二种显示方法的循环初值
push bx ;在栈中保存


re_on: mov al, [di] ;取当前di指向地址中的内容
inc di ;di指针后移




cmp al, 0ffh ;判断al中取到的值是否是0ffh
jz x ;如果是,跳转到x






mov dx, io8255c
on: out dx, al ;向io8255c中写入显示模式
call delay ;延时显示
jmp re_on ;跳转到re_on继续
exit: mov ah, 4ch
int 21h ;结束


delay proc near ;定义延时函数
mov cx, 5300h
de1: mov bx, 0fff0h
de0: dec bx
jnz de0
loop de1 ;做5300h*0fff0h次的循环
ret
delay endp


x: pop bx ;取出在栈中保存的循环次数
   dec bx ;循环次数减一
   push bx ;保存循环次数
   cmp bx,0 ;判断是否已经循环3次
   jz exit ;已经循环3次则退出
   lea di,portc1 ;否则再次从portcl起始拿数值
   jmp RE_ON ;跳转re_on继续


code ends
end start

你可能感兴趣的:(8255)