0%

ch7可编程并行接口8255A_计数器8253

8255

8255

和CPU一边相连的信号a

RESET-复位信号;

D7~D0 -数据线;

CS# -片选信号;

RD# -读出信号;

WR# -写入信号;

A1、A0-端口选择信号

和外设一边相连的信号

PA7~PA0—A组数据信号;

PB7~PB0—B组数据信号;

PC7~PC0—C组数据信号。

有三种基本工作方式:

p方式0——基本的输入输出方式;

p方式1——选通的输入输出方式;

p方式2——双向传输方式;

eg. 应用1:多片8255的连接

某微机系统有两片8255芯片:J1和J2;

J1、J2的A1/A0分别和系统地址总线的A2/A1连接;

其它控制信号分别连在一起,然后与系统相关信号连接;

系统靠片选信号CS#来区分对J1和J2的访问;

solu:

A8A7 A6 A5 A4 A3 A2 A1 A0 (Y4 Y5)

0 1 1 1 0 0 0 0 0 00E0H

0 1 1 1 0 0 1 1 0 00E6H

0 1 1 1 0 1 0 0 0 00E8H

0 1 1 1 0 1 1 1 0 00EEH

J1:端口A,方式0,输出

​ 端口B,方式0,输入

​ 端口C高4位,输出

​ 端口C低4位,输入

控制字:10000011 83H

1
2
3
MOV	AL,83H
MOV DX,00E6H
OUT DX,AL

J2:端口A,方式0,输入

​ 端口B,方式1,输出

​ 端口C高4位,输出

端口C低4位,配合端口B工作,可任意为1或0,此处0

控制字:10010100 94H

1
2
3
MOV	AL,94H
MOV DX,00EEH
OUT DX,AL

eg. 8255工作于方式0

端口地址

A端口:00D0H; B端口: 00D2H;

C端口:00D4H; 控制端口:00D6H;

A端口:方式0,输出 (传送字符的通道)

B端口:未用

C端口高4位:方式0,输出(PC6作为STB#信号输出端)

C端口低4位:方式0,输入 (PC2作为BUSY信号输入端)

控制字:

​ 10000001 81H

A端口:00D0H; B端口:00D2H;
C端口:00D4H; 控制端口:00D6H

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
	MOV     AL, 81H
OUT 00D6H,AL
MOV AL,0DH
OUT 00D6H,AL
WAIT: IN AL,00D4H
AND AL,04H
JNZ WAIT
MOV AL,CL
OUT 00D0H,AL
MOV AL,0CH
OUT 00D6H,AL
INC AL
OUT 00D6H,AL
;控制字:10000001

;用置1/0 方式使PC6为1,使STB#高电平,00001101B
;读端口C的值

;如不为0,说明忙信号为1,打印机忙,等待

;不忙,把CL中字符送端口A

;用置1/0 方式使PC6为0,使STB#低电平,00001100B

;再使STB#高电平

eg. 8255工作于方式1

设8255端口地址:

A端口00C0H; B端口 00C2H;

C端口00C4H; 控制端口 00C6H

A端口作为数据通道,工作在方式1,输出方式。PC7自动作为OBF#信号输出端,PC6自动作为ACK#信号输入端。CPU控制PC0产生选通脉冲。OBF#此处无用,悬空。

PC3自动作为INTR信号输出端。中断类型号0BH

中断入口地址在2CH~2FH

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
MAIN:MOV   AL,0A0H     
OUT 0C6H,AL ;设置控制字 10100000
MOV AL,01H ;PC0=1,让选通无效
OUT 0C6H,AL
XOR AX,AX ;设置中断处理子程序入口地址:
MOV DS,AX ;1000H:2000H 在2CH~2EH
MOV AX,2000H ;中断类型号为多少?
MOV WORD PRT[002C], AX
MOV AX,1000H
MOV WORD PRT[002E],AX
MOV AL,0DH ;PC6=1,允许8255中断
OUT 0C6,AL
STI
;中断处理
TINTR:
MOV AL,[DI] ;[DI]为打印内容, 字符送A端口
OUT 0C0H,AL ;
MOV AL,00 ;PC0=0,产生选通信号
OUT 0C6H,AL ;PC0=1 ,撤销选通信号
INC AL
OUT 0C6H,AL

IRET

8253

8254&8253不同点:

  • 只有8254内部有状态寄存器;
  • 8253有2种方式读出计数值,8254增加了读出控制字命令,有3种方式可读出计数值和状态值

8253内部有三个计数器,他们的结构完全相同。

每个计数器的输入和输出都决定于设置在控制寄存器中的控制字,互相之间工作完全独立。

每个计数器通过三个引脚和外部联系:

  • 一个为时钟输入端CLK,一个为门控信号输入端GATE,另一个为输出端OUT。

每个计数器内部有

  • 一个8位的控制寄存器,
  • 16位的计数初值寄存器CR
  • 计数执行部件CE
  • 输出锁存器OL

8253

控制字

8253_controlword

8253初始化program

8253CNT0~ CNT2端口地址:0200H~0202H

控制寄存器端口地址:0203H

eg. 端口地址:0200H~0203H

CNT0工作于方式3,二进制计数,计数初值65536

CNT0控制字:00 11 011 0 36H

1
2
3
4
5
6
7
8
;CNT0初始化编程
MOV AL,36H
MOV DX,0203H
OUT DX,AL
MOV DX, 0200H
MOV AL,00H
OUT DX,AL
OUT DX,AL

eg. 端口地址:0200H~0203H

CNT1工作于方式2,BCD计数,计数初值1023H

CNT1控制字:01 11 010 1 75H

1
2
3
4
5
6
7
8
9
;CNT1初始化编程
MOV AL,75H
MOV DX,0203H
OUT DX,AL
MOV DX, 0201H
MOV AX,1023H
OUT DX,AL
MOV AL,AH
OUT DX,AL

eg. 端口地址:0200H~0203H

CNT2工作于方式3,二进制计数,计数初值255

CNT2控制字:10 01 011 0 96H

1
2
3
4
5
6
7
;CNT2初始化编程
MOV AL,96H
MOV DX,0203H
OUT DX,AL
MOV DX, 0202H
MOV AL,0FFH
OUT DX,AL

8253的锁存读出命令program

方法:

(1)写锁存命令,使计数值锁存到输出寄存器OL;

(2)读锁定的计数值

eg. 若8253端口地址200H~203H,已知CNT1已经工作,现需要读出CNT1的当前计数值

;锁存命令, CNT0、
CNT1和 CNT2分别为00H、40H和80H

1
2
3
4
5
6
7
8
MOV AL,40H    	;锁存命令, CNT0、 CNT1和 CNT2分别为00H、40H和80H
MOV DX,0203H
OUT DX,AL
MOV DX,0201H
IN AL,DX
MOV CL,AL
IN AL,DX
MOV CH,AL

8253 工作mode

软件触发计数启动

  • 模式0-计数结束中断
  • 模式4-软件触发延时选通

硬件触发计数启动

  • 模式1-可编程单拍
  • 模式5-硬件触发延时选通

周期信号发生器

  • 模式2-频率发生器
  • 模式3-方波发生器

8253_workmode

8253实例

eg. OUT0输出接8259A的IRQ0,用作PC实时时钟的定时中断请求信号。

工作于方式3,

CNT0的控制字

0011 011 0 36H

计数器初值为0000H,

对应最大方波周期: T=65536*838ns» 55ms。

输出信号频率: f=1/T=18.206Hz

1
2
3
4
5
MOV	AL, 36H
OUT 43H, AL
MOV AL, 0
OUT 40H, AL
OUT 40H, AL

用来为动态存储器的刷新提供定时信号。

工作于方式2。

CNT1的控制字

0101 010 0 54H

计数器初值为18H。

对应最大方波周期: T=18*838ns» 15us。

每次刷新512单元,128次刷新全部64KB。所需时间:

​ 15us*128 »1.92ms<2ms

1
2
3
4
MOV	AL, 54H
OUT 43H, AL
MOV AL, 18
OUT 41H, AL

GATE2接至并行接口8255A的PB0位,用它控制通道2的计数过程。

输出OUT2经过一个与门,这个与门受PB1位控制。扬声器可由PB0或PB1分别控制发声。8255A的端口地址为60H~63H。

若要求扬声器发出600Hz的声音,可将计数器2设定为方式3,作为方波发生器

1
2
3
4
5
6
7
8
9
10
MOV	AL, 10110110B     ;方式3,写入16位计数值
OUT 43H, AL
MOV AX, 1989 ;1.19318MHz/600=1989
OUT 42H, AL ;写入低8位
MOV AL,AH
OUT 42H, AL ;写入高8位
IN AL, 61H ;读8255A的B端口原输入值
MOV AH, AL
OR AL, 03H ;使PB1和PB0位均为1
OUT 61H,AL ;输出以使扬声器能够发声

eg. 8253_eg2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
		NAME EX_1
DATA SEGMENT
MESS DB ‘8253 CNT0 IN MODE 3’,0DH,0AH
DB ‘8253 CNT1 IN MODE 2’,0DH,0AH,‘$’
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
CLI
MOV DX,0203H ;CNT0初始化,产生方波,周期10ms
MOV AL,36H ; CNT0方式控制字 00110110
OUT DX,AL
MOV DX,0200H
MOV AL,0C4H
OUT DX,AL ;写入低字节计数值 09C4H
MOV AL,09H
OUT DX,AL ;写入高字节计数值
MOV DX,0203H ;CNT1初始化,产生周期性负脉冲信号,MOV AL,74H ;周期1s ,CNT1方式控制字 01110100
OUT DX,AL
MOV DX,0201H
MOV AL,064H
OUT DX,AL ;写入低字节计数值 64H
MOV AL,00H
OUT DX,AL ;写入高字节计数值
STI
MOV DX,OFFSET MESS
MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START