00001B=01H
主片初始化程序:
ICW1写入到偶端口地址20H;ICW2写入到奇端口地址22H
MOV AL, 19H
OUT 20H, AL;写入ICW1
MOV AL, 70H
OUT 22H, AL;写入ICW2
MOV AL, 02H
OUT 22H, AL
MOV AL, 01H
OUT 22H, AL
6.4 设8253计数器0~2和控制字寄存器的I/O地址依次为F8H~FBH,说明如下程序的作用。
MOV AL, 33H ;00110011B 计数器0,先低位后高位,方式1,BCD码计数
OUT 0FBH, AL ;写控制字
MOV AL, 80H ;置计数初值低位字节80H
OUT 0F8H, AL ;先写低位字节
MOV AL, 50H ;置计数初值高位字节50H
OUT 0F8H, AL ;写高位字节
程序的作用为:使计数器0工作在方式1,用BCD码计数,计数初值为5080。
6.5 设8253的4个端口地址分别为300H、302H、304H和306H,由CLK0输入计数脉冲频率为2MHz。要求通道0输出1.5kHz的方波,通道1、通道2均用通道0的输出作计数脉冲,通道1输出频率为300Hz的序列负脉冲,通道2每秒钟向CPU发50次中断请求。试编写初始化程序,并画出8253相关引脚的连线图。
通道0:输出方波则工作在方式3;计数初值为n0=2MHz/1.5kHz≈1334=536H(1.499kHz)
控制字为:00110110B=36H
通道1:输出序列负脉冲则工作在方式2;计数初值为n1=1.5kHz/300Hz=5=05H
控制字为:01010100B=54H
通道2:每秒钟向CPU发50次中断请求则工作在方式2;计数初值为n2=1500/50=30=1EH
控制字为:10010100B=94H
初始化程序:
通道0: MOV DX , 306H
MOV AL , 36H
OUT DX , AL
MOV DX , 300H
MOV AL , 36H
OUT DX , AL
MOV AL , 05H
OUT DX , AL
7.3编程使8255A的PC5端输出一个负跳变。如果要求PC5端输出一个负脉冲,则程序又如何编写?
设端口地址分别为:B0H B2H B4H B6H。系统复位后8255A的所有端口都被置为输入。
控制字为:10000000B=80H
输出负跳变:
MOVAL, 80H
OUTB6H,AL
MOVAL, 0BH
OUTB6H,AL
……
MOVAL, 0AH
OUTB6H,AL
输出负脉冲:
MOVAL, 80H
OUTB6H,AL
MOVAL, 0BH
OUTB6H,AL
……
MOVAL, 0AH
OUTB6H,AL
……
MOVAL, 0BH
OUTB6H,AL
7.4假设图7.15键盘接口电路中8255A的A、B、C口和控制口地址为218H~21BH,写出完整的行反转法键盘扫描子程序。
KEY1: … ;设置行线接输出端口ROWPORT,列线接输入端口COLPORT,并判断是否有键按下
KEY2: MOV AL, 00H
MOV DX, ROWPORT
OUT DX, AL ;行线全为低
MOV DX, COLPORT
IN AL, DX ;读取列值
CMP AL,0FFH
JZ KEY2 ;无闭合键,循环等待
PUSH AX ;有闭合键,保存列值
PUSH AX
… ;设置行线接输入端口ROWPORT,列线接输出端口COLPORT
MOV DX, COLPORT
POP AX
OUT DX,AL ;输出列值
MOV DX, ROWPORT
IN AL,DX ;读取行值
POP BX