本文共 2178 字,大约阅读时间需要 7 分钟。
为了备考,把8086相关的所有芯片都跑了一遍,都放在一个proteus dsn文件里了,需要的同学可以去
;标识定义IO1 EQU 0100hIO2 EQU 0200hIO3 EQU 0300hIO4 EQU 0400hIO5 EQU 0500hIO6 EQU 0600hIO7 EQU 0700hIO8 EQU 0800hIO9 EQU 0900hADDR0 EQU 60hassume cs:codeassume ss:stackstack segment stackdb 32 dup(0)stack endscode segmentstart: call M8259 jmp $; 中断 8259, IO8M8259 proc pushf push ax push bx cli mov ax, 0 mov es, ax mov si,ADDR0*4 ;设置中断向量 mov ax,offset int0 mov es:[si],ax mov ax,cs mov es:[si+2],ax mov al,00010011b; ICW1, 单片, 跳变触发 mov dx,IO8 out dx,al mov al,ADDR0; ICW2 中断类型码为 060 ~ 068h; mov dx,IO8 + 2 out dx,al ;mov al,1bh; ICW4 00011011b mov al, 01h; ICW4 非缓冲, 非自动EOI, 非特殊套嵌 out dx,al mov al, 0h; OCW1 完全不屏蔽 out dx, al mov dx, IO8 mov al, 20h; OCW2 IR0 普通EOI结束 out dx, al ; 中断仿真bug, 地址线放数据进行模拟 mov dx, IO8 mov al, ADDR0 out dx, al sti jmp $ pop bx pop ax popf retM8259 endp; 串行 8251, IO7M8251 proc pushf push ax push dx push cx mov dx, IO7 + 2; 写串行 方式选择控制字 mov al, 7dh ;mov al, 01001101b out dx, al mov dx, IO7 + 2; 写 操作命令控制字 mov al, 11h out dx, al mov dx, IO7; 写数据 mov cx, 0fffho1: mov al, [di] out dx, al inc di loop o1 pop cx pop dx pop ax popf retM8251 endp; 并行 8255, IO6M8255 proc pushf push dx push ax mov dx, IO6 + 6; 控制寄存器, mov al, 10000000b; 端口A, B, C 全部输出 out dx, al mov dx, IO6; 端口A mov al, 3 out dx, al pop ax pop dx popf retM8255 endp; 时钟 8253, IO5M8253 proc pushf push dx push ax mov dx, IO5 + 6; 控制寄存器 mov al, 00010110b; 通道0 计数器低字节 方式0 ;mov al, 00110100b; 通道0 计数器低字节 方式0 out dx, al mov dx, IO5; 通道0 mov al, 0ffh out dx, al pop ax pop dx popf retM8253 endp; 数码管实验 IO2LED proc push dx push ax mov dx, IO2 mov al, 0LEDL: inc al out dx, al jmp LEDL pop ax pop dx popf retLED endpint0 proc cli call M8255 sti iretint0 endp; DAC0832 实验 IO3DAC proc push dx push ax push cx mov dx, IO3 mov al, 0h mov cx, 0ffhDACL1: inc al out dx, al call delay loop DACL1 mov cx, 0ffhDACL2: dec al out dx, al call delay loop DACL2 pop cx pop ax pop dx popf retDAC endp; ADC0808 实验IO4, proteus 不具备ADC0809仿真能力,用0808替换ADC0808 proc push ax push dx mov dx, IO4 mov al, 12h out dx, al call delay in al, dx pop dx pop ax popf retADC0808 endp; 延迟程序delay: pushf push cx mov cx, 0ffhn: loop n pop cx popf retcode endsend start