MOV AL,0F7H OUT DX,AL
MOV intcnt,01H ;TIME=1 MOV DX,TCONTR0;指向控制口
MOV AL,51H ;8253控制字,通道1,方式0,只读/写低字节,BCD码计数
OUT DX,AL;送控制字
MOV DX,TCON1;指向控制口 MOV AL,03;计数值低字节 OUT DX,AL;送控制字
MOV DX,0FF23H;指向8255A控制口
MOV AL,80;A口方式0,输出,C口上半部输出,B口方式0,输出,C口下半部输出
OUT DX,AL;送控制字
STI; 开中断
WATING: CALL DISP ;DISP 825359 JMP WATING WRINTVER: MOV AX,0H MOV ES,AX
MOV DI,002CH;目的地址
LEA AX,INTQ3;INTQ3的偏移地址 STOSW;存字
MOV AX,0000h;清零 STOSW
RET;中断返回 INTREEUP3: push ax;入栈 push bx push cx push dx
MOV DX,TCON1;指向控制口
MOV AL,03;计数值低字节 OUT DX,AL MOV AL,INTCNT CALL CONVERS
MOV BX,OFFSET BUF MOV AL,10H
MOV CX,05H;置循环数
INTRE0: MOV [BX],AL;将Al中的值存在[BX]中 INC BX;BX加1 LOOP INTRE0;循环
ADD INTCNT,01H;循环数是五次 CMP INTCNT,06H JNA INTRE2
CALL BUF2 ;DISP:good INTRE1: CALL DISP JMP INTRE1
CONVERS: AND AL,0FH;显示次数 MOV BX,offset buf MOV [BX+5],AL RET
INTRE2: MOV AL,20H
MOV DX,INTPORT1 OUT DX,AL pop dx pop cx pop bx pop ax
IRET;软中断返回
DISP: MOV AL,0FFH ;00H MOV DX,PA;清零 OUT DX,AL
MOV CL,0DFH ;20H MOV BX,OFFSET BUF
DIS1: MOV DX,PC OUT DX,AL MOV AL,[BX] MOV AH,00H PUSH BX
MOV BX,OFFSET DATA1 ADD BX,AX MOV AL,[BX] POP BX MOV DX,PB OUT DX,AL MOV AL,CL MOV DX,PA OUT DX,AL PUSH CX
DIS2: MOV CX,00A0H LOOP $ POP CX
CMP CL,0FEH ;01H JZ LX1 INC BX
ROR CL,1 ;SHR CL,1 JMP DIS1 LX1: MOV AL,0FFH MOV DX,PB OUT DX,AL RET
BUF1: MOV BUF,08H MOV BUF+1,02H MOV BUF+2,05H MOV BUF+3,03H MOV BUF+4,05H MOV BUF+5,09H RET
BUF2: MOV BUF,09H MOV BUF+1,00H MOV BUF+2,00H MOV BUF+3,0dH MOV BUF+4,10H
MOV BUF+5,10H RET CODE ENDS END START
思考题:如果改用计数器 0 方式 0 计数,计满 5 个数产生中断,中断 3 次后结 束。硬件和软件应如何修改?
答:1、将8253控制字由MOV AL,51H改为 MOV AL,11H 2、计数值低字节将 MOV AL,03改为MOV AL,05 3、将CMP INTCNT,06H改为CMP INTCNT,04H;
2、8253定时器实验
要求:用8253定时器1通道定时,每隔1秒使PA口的指示灯的状态右移一位。主程序反复游走显示8253-A。
8253定时器实验线路见图6-7:
图6-7 8253计数器实验电路图
实验程序:
CODE SEGMENT ; ASSUME CS:CODE
INTPORT1 EQU 0FF80H;8259A的偶地址入口 INTPORT2 EQU 0FF81H;8259A的奇地址入口 INTQ3 EQU INTREEUP3
TCONTR0 EQU 0043H;8253端口地址 TCON1 EQU 0041H;8253端口地址
IOCONPT EQU 0FF2BH;8255A 的端口地址 IOBPT EQU 0FF29H;8255A 的端口地址 IOAPT EQU 0FF28H;8255A 的端口地址 PA EQU 0FF20H ;字位口 PB EQU 0FF21H ;字形口 PC EQU 0FF22H ;键入口
ORG 12D0H;源地址 START: JMP START0
BUF DB ?,?,?,?,?,?;6字节缓冲区
intcnt db ? ;1字节缓冲区 WEIKONG DB ? ;1字节缓冲区 data1
db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,88h,83h,0c6h db 0a1h,86h,8eh,0ffh,0ch,89h,0deh,0c7h,8ch,0f3h,0bfh,8FH START0: CLD;置方向位 CALL BUF1
CALL WRINTVER ;WRITE INTRRUPT MOV AL,13H;写ICW1,边沿触发,单片,需要ICW4 MOV DX,INTPORT1 OUT DX,AL
MOV AL,08H;ICW2,中断类型号高5位 MOV DX,INTPORT2
OUT DX,AL
MOV AL,09H;写ICW4,BUF位在缓冲方式下工作,8086/8088系统 OUT DX,AL MOV AL,0F7H OUT DX,AL
MOV intcnt,50 ;软件计数50(1秒=20ms*50) MOV DX,TCONTR0
MOV AL,74H;通道1,先读/写低字节,再读/写高字节,方式2,二进制数 OUT DX,AL
MOV DX,TCON1 ;计数器1定时20ms MOV AX,40000 OUT DX,AL
MOV AL,AH;读入计数值的高字节 OUT DX,AL MOV DX,0FF2BH MOV AL,82H;A口方式0,输出,C口上半部输出,B口方式0,输入,C口下半部输出
OUT DX,AL
MOV WEIKONG, 0FEH ;初始PA0对应位亮 MOV AL, WEIKONG MOV DX, 0FF29H OUT DX,AL STI ;开中断
WATING: CALL DISP ;DISP 8253-A JMP WATING WRINTVER: MOV AX,0H MOV ES,AX
MOV DI,002CH;目的地址
LEA AX,INTQ3;INTQ3的偏移地址 STOSW
MOV AX,0000h
STOSW RET
INTREEUP3: DEC INTCNT;INTCNT减1 JNZ INTRE2
MOV INTCNT, 50 ROL WEIKONG, 1 MOV DX, IOAPT MOV AL, WEIKONG OUT DX,AL INTRE2: MOV AL,20H
MOV DX,INTPORT1 OUT DX,AL
IRET;软中断返回
DISP: MOV AL,0FFH ;00H MOV DX,PA OUT DX,AL
MOV CL,0DFH ;20H MOV BX,OFFSET BUF DIS1: MOV DX,PC OUT DX,AL MOV AL,[BX] MOV AH,00H
PUSH BX
MOV BX,OFFSET DATA1 ADD BX,AX MOV AL,[BX] POP BX MOV DX,PB OUT DX,AL MOV AL,CL MOV DX,PA OUT DX,AL PUSH CX
DIS2: MOV CX,0000H LOOP $ POP CX
CMP CL,0FEH ;01H JZ LX1;相等转LX1 INC BX
ROR CL,1 ;循环 右移一位,指示灯又移变亮 JMP DIS1
LX1: MOV AL,0FFH;指示灯全灭 MOV DX,PB OUT DX,AL RET
BUF1: MOV BUF,08H MOV BUF+1,02H MOV BUF+2,05H MOV BUF+3,03H MOV BUF+4,17H MOV BUF+5,0AH RET CODE ENDS
END START
思考题:如果改用 8253 定时器 0 通道定时,每隔 2 秒使 PB 口的指示灯的状态 左移一位,主程序反复游走显示 8253-B,硬件和软件应如何修改? 答:1、将MOV AL,74H改为MOV AL,34H;
2、将ROR CL,1 改为ROL CL,1
3、将MOV BUF+5,0AH改为MOV BUF+5,0CH 实验总结: