两种控制字:
方式控制字:
8位,D7D6用于选择计数器
D5D4用于选择读写方式
D3D2D1用于选择工作方式
D0用于选择数制
读出控制字:
D7D6为11,表示为读出控制字
D5,COUNT 非为0表示锁存计数值
D4,STATUS 非为0表示锁存计数器状态信息
如果读出命令仅锁存相应计数器的状态信息,则对相应计数器端口进行一次读操作,即可读出状态信息
如果读出命令仅锁存相应计数器的计数值,则对相应计数器端口进行两次读操作,依次读出计数值的低8位和高8位
如果读出命令仅锁存相应计数器的计数值,则对相应计数器端口执行三次读操作,第一次读出状态信息,第二次读出当前计数器的低8位,第三次读出当前计数器的高8位。
读出命令能同时锁存几个计数器的计数值。
8254初始化编程:
(1)向控制字寄存器写入方式控制字
(2)向使用的计数器写入计数初值
设8254端口地址为40H~43H,要求2号计数器工作在方式1,计数初值为十进制数4000,试写出初始化程序段。
40H:0号计数器,41H:1号计数器,42H:2号计数器,43H:控制字寄存器
2号计数器:D7D6=10
方式1:D3D2D1=001
解法一:
使用BCD计数:D0=1
十进制数4000,BCD表示为4000H,高8位为40H,低8位为00H。所以可以只写高8位,D5D4=10
所以方式控制字为10100011即0A3H(注意前面带0)
;写入端口43H
MOV AL,0A3H
OUT 43H,AL; AL/AX用来IO端口的读写
;写计数器的高8位,低8位自动补0
MOV AL,40H
OUT 42H,AL;
解法二:
使用BCD计数,D0=1,可以先写低8位,后写高8位,D5D4=11,
方式控制字为10110011即B3H
MOV AL,B3H
OUT 43H,AL
MOV AL,0
OUT 42H,AL
MOV AL,40H
OUT 42H,AL
注意:程序中BCD码的表示
MOV AX,1234H 1234H表示BCD码(注意加H)
MOV AX,1234 1234表示二进制数
当计数初值大于9999时,只能使用二进制,否则使用BCD码和二进制都可以。
解法三:
使用二进制数,D0=0,D5D4=11,低8位和高8位不能不写
方式控制字:10110010B即A2H
MOV AL,0A2H
OUT 43H,AL
MOV AX,4000 ;4000为二进制数
OUT 42H,AL
MOV AL,AH
OUT 42H,AL
读取当前计数值:
方法1:D7D6=计数器编号,D5D4=00,D3D2D1D0=XXXX,锁存相应计数器的当前计数值,然后对相应的计数器端口进行两次读操作,依次读出计数值的低8位和高8位。
方式2:通过读出命令
例:设8254端口地址为40H~43H,试写出程序段,读取2号计数器当前计数值
读出命令:10,00, 0000=80H
;读出命令
MOV AL,80H
OUT 43H,AL
;读取低8位
IN AL,42H
MOV CL,AL
;读取高8位
IN AL,42H
MOV CH,AL