输出脉冲周期为1/100 秒,最大计时时间为655.36 秒。8255PC0 作为START/STOP 输入,8255PC1 作为圈输入。内存字单元COU 和SUBC 存总成绩和圈成绩。 COU DW 0
BUF DW 20 DUP(0) SUBC DW 20 DUP(0)
MOV BX,OFFSET BUF ;当前成绩指针 MOV SI,OFFSET SUBC ;圈成绩指针 MOV AL,10000001B
OUT 63H,AL ;8255 方式设置 MOV 00110110B
OUT 43H,AL ;8253 计数器0 方式设置 L1: IN AL,62H ;查询是否比赛开始 TEST AL,01H JZ L1 40
MOV AL,COUL ;比赛开始,启动计数器0 计数 OUT 40H,AL MOV AL,COUH OUT 40H,AL
L2: IN AL,62H ;查询是否比赛结束 TEST AL,01H JZ STOP
TEST AL,02H ;查询是否一圈结束 JZ L2
MOV AL,00000000B
OUT 43H,AL ;一圈结束,锁存计数器0 当前计数器值 IN AL,40H ;读当前计数器值低位 MOV AH,AL
IN AL,40H ;读当前计数器值高位 XCHG AH,AL
NEG AX ;获得当前成绩 MOV [BX],AX ;存当前成绩
SUB AX,[BX-1] ;获得当前圈成绩 MOV [SI],AX ;存当前圈成绩 INC BX INC SI
CALL DELAY ;躲过重复圈查询 JMP L2
STOP: MOV AL,00000000B
OUT 43H,AL ;比赛结束,锁存计数器值 IN AL,40H ;读当前计数器值低位 MOV AH,AL
IN AL,40H ;读当前计数器值高位 XCHG AH,AL
NEG AX ;获得总成绩 MOV COU,AX ;存总成绩 END
9.15 试编写一程序,使IBM PC 机系统板上的发声电路发出200Hz 至900Hz 频率连续变化 的报警声。
【答】MOV AL,0B6H ;10110110B,TIMER2,MODE3 OUT 43H,AL
MOV DX,0020H ;fCLK=1.19MHZ MOV AX,34DEH
DIV DI ;AX←计数初值N=FCLK÷音频 OUT 42H,AL MOV AL,AH OUT 42H,AL
IN AL,61H ;读8255PB 41
MOV AH,AL
OR AL,3 ;PB0=1,PB1=1 声音输出有效 OUT 61H,AL
WAIT1: MOV CX,7FFFH DELAY: LOOP DELAY DEC BX ;延时系数 JNZ WAIT1 MOV AL,AH
OUT 61H,AL ;恢复8255PB
9.16 已知: PC/XT 微机系统中用作定时及计数的8253 芯片的端口地址为40H~43H, CLK2 输入频率为1.19MHz,通道2 每计500 个脉冲向CPU 发出中断类型号为54H 的中断请求,CPU 响应这一中断后继续写入计数值,重新开始计数。试编写程序完成以上任务。 【答】INIT: MOV AX,0 ;设置计数中断的中断向量 MOV DS,AX
MOV [54H*4],OFFSET INT54 MOV [54H*4+2],SEG INT54 STI
MOV AL, 10111000B
OUT 43H,AL ;8253 计数器2 方式设置 MOV AX, 2380
OUT 42H,AL ;写计数值低位 MOV AL,AH
OUT 42H,AL ;写计数值高位 INT54: STI
MOV AX,2380 ;再启动计数器2 OUT 42H,AL MOV AL,AH OUT 42H,AL IRET__