输入输出
8086采用I/O端口独立编址
in AL/AX,imm8/DX
out imm8/DX,AL/AX
大于0FFH的端口只能存在DX
读外设(查询)
status:in al,dx test al,80H;//测标志位 jz status mov dx,100h in al,dx
写外设(查询)
status:mov dx,102H in al,dx test al,80H jnz status;//D7=1,忙,继续查 mov dx,100h mov al,char out dx,al
74LS273:锁存。输出锁存寄存器。
74LS244:缓冲。输入缓冲,输出锁存。
输入时序
输出时序
中断与8259
传送指令装入中断向量。
mov ax,0 mov es,ax mov bx,N*4;//N为中断类型号 mov ax,offset intproc mov es:[bx],ax mov ax,seg intporc mov es:[bx+2],ax sti
in al,81H and al,11111101B;IR1开放中断 out 81H,al
OCW2:优先级循环方式和发中断结束命令
EOI=1发中断结束,清除相应位
CW3:查询字
mov al,0AH;读IRR的OCW3 out 20H,al in al,20H;读IRR到AL
中断服务子程序整体流程:保护现场、开中断、中断处理、关中断、恢复现场、中断返回。
intproc proc far push ax push ds sti mov ax,seg done mov ds,ax in al,0a0h;读开关状态 out 0c0h,al;输出控制led cmp al,0ffh jnz exit int al,82h;中断屏蔽 or al,00000100B out 82h,al exit: cli mov al,20H;EOI out 80H,al pop ds pop ax iret intproc endp
8255
输入时序图
输出时序图
方式控制字
例:
mov dx,303H mov al,81H out dx,al mov al,0FH out dx,al;(PC7=1) prn: mov dx,302H in al,dx test al,04h jz prn;//查询输入 mov dx,300H;A口 mov al,ah;//ah=打印数据 out dx,al mov dx,303H mov al,0eH;STB#=0 out dx,al nop nop mov al,0FH;STB#=1 out dx,al
8254/8253奇数骑
mov al,10H mov dx,PORT_CTRL out dx,al mov al,100 mov dx,PORT_0 out dx,al mov al,76H mov dx,PORT_CTRL out dx,al mov ax,2000 mov dx,PORT_1 out dx,al mov al,ah;写高8位 out dx,al
数字信号与模拟信号
双缓冲控制:
mov dx,portx out dx,xdata mov dx,porty out dx,ydata mov ax,portcon out dx,al call delay
读8路电压转换
lea di,buf mov cx,8 mov dx,300 convert: out dx,al;启动转换 push dx mov dx,310H state: in al,dx;读EOC test al,20H;D5(EOC)为1? jz state pop dx in al,dx;读取结果 mov [di],al add dx,2;下一模拟通道 add di,2 loop convert
0832锯齿波
mov dx,330H mov al,00H aga: out dx,al call delay inc al jmp aga delay proc push cx mov cx,10 loop $ pop cx ret delay endp