本文主要是介绍微机原理、汇编语言与接口技术复习,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
基于江苏大学教材整理
文章目录
- 1.微型计算机概述
- 微型计算机系统组成
- 2.汇编语言基础
- 2.1 8086/8088微处理器编程结构
- 2.1.1功能结构
- 2.1.2寄存器结构
- 2.2汇编语言调试与模板
- 2.2汇编语言操作数
- 2.2.1常量
- 2.2.2变量
- 2.2.3寻址方式
- 2.3指令系统
- 2.3.1数据传送类
- 2.3.2运算类
- 2.3.3转移
- 2.3.4子程序
- 3.程序逻辑语句
- 4.8086/8088微处理器的外部特性
- 4.18086/8088的外部特性
- 4.28086的总线操作
- 4.2.1总线读周期
- 4.2.2总线写周期
- 4.3最小模式下的8086子系统
- 6.微型处理机输入输出技术
- 6.2开关量输入/输出
- 7.中断系统
- 8259A中断控制器
- 8259A的工作方式:
- 8259A的初始化命令字
- 8259A的操作命令字
- 8.可编程接口芯片
- 8255A芯片
- 8255A工作方式
- 8255A控制字
- 8254/8253定时/计数接口芯片
- 8254工作方式
- 8254控制字
- 参考资料
1.微型计算机概述
微型计算机系统组成
微型计算机系统由硬件和软件组成,仅有硬件构成的计算机称为"裸机"。裸机是不能够独立运行和处理事务的。因此,硬件系统必须配备相应的软件系统才能够正常工作。
微型计算机由中央处理器、内存储器、输入/输出接口和系统总线和外部设备组成,结构如图1-2所示。其中中央处理器和存储器构成了最小的信息处理单位,被称为主机。
微型计算机系统的软件系统分为系统软件(操作系统、数据库系统、各种语言的处理程序)和应用软件。
ASCII 共编码了128个字符,它们主要包括:数字0~9的 ASCII 码为30H~39H:26个英文大写字母 A ~ Z 的 ASCII 码为41H~5AH:26个英文小万字母的 ASCII 码为61H~ 7AH。
2.汇编语言基础
2.1 8086/8088微处理器编程结构
2.1.1功能结构
p19~p21
从功能上来看, Intel 8086/8088微处理器可分为两部分,即执行单元( Execution Unit , EU )和总线接口单元( Bus Interface Unit , BIU ),如图2-2所示。 EU 不与外部总线相连,它负责指令的译码执行:而 BIU 则负责从存储器或外部设备中读取指令和读/写数据,即完成所有的总线操作,这两个单元在一定程度上处于并行工作状态,提高了微处理器执行指令的速度。这就是最简单的指令流水线技术。
2.1.2寄存器结构
8086:16位,16根数据线,20根地址线
AX/AL:乘除法指令中用作累加器,IO指令中用作数据寄存器,可显式或隐含调用
BX:在存储器寻址用作地址/基址寄存器,显式调用。在XALT(查表指令)用作基址寄存器(AL提供索引),隐含调用
CX:循环计数器
CL:在移位、循环移位中用作移位次数,显式
DX:在I/O指令用作地址寄存器,显式调用。在乘除法用作辅助累加器,隐含调用
BP:堆栈段基址寄存器,默认存放堆栈中某一存储单元的偏移地址。
SP:堆栈指针,始终存放当前堆栈段中栈顶单元的偏移地址
SP,BP通常与SS联用,BP寄存器也可当做一般数据寄存器使用
SI:字符串操作源地址寄存器,隐含(源串位于DS中)。存储器寻址用作地址寄存器,显式。
DI:字符串操作目的变址寄存器,隐含(目的串位于ES中)。存储器寻址用作地址寄存器,显式。
SI,DI只能用作16位寄存器,可当做一般数据寄存器使用
CS:代码段寄存器。
SS:堆栈段
DS:数据段
ES:附加段
IP:指令指针寄存器,存放下一条要执行指令的偏移地址,不能读/显式设定
PSW:(加粗的为状态标志,其余为控制标志)
15~12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
OF | DF | IF | TF | SF | ZF | AF | PF | CF | ||||
overflow | 指针方向 | 中断 | 单步 | sign | zero | 辅助进位 | 最低位字节“1“个数 | carry | ||||
Cn异或Cn-1 | IF=1,允许中断 | TF=1,单步 | 低4位对高四位进位 | 为偶数时PF=1 | cin异或cout |
CLI/STI:执行CLI(关中断),IF=0。执行STI(开中断),IF=1。
存储空间:按字节编址,220=1MB寻址空间,00000H~ FFFFFH,小端存储(低位低字节,高位高字节)。段:0000H~FFFFH(64KB,低4为始终为0),每个逻辑段最大64KB。
物理地址:逻辑地址=段地址:偏移地址。物理地址=段地址*16+偏移地址。各段可能重叠,即对于一个存储单元,物理地址是唯一的,但逻辑地址并不唯一
段:CS:IP为即将执行的指令,SS:SP为栈顶,DS:EA为数据段,ES:EA为附加段。
2.2汇编语言调试与模板
调试流程:编辑(.asm),汇编(.obj),连接(.exe),执行。
伪指令:伪指令没有其对应的机器指令,只是指示汇编程序如何汇编源程序,即伪指令cpu不执行,包括符号、变量和逻辑段的定义等
标识符不能以数字开头
模板:
.model tiny
.stack 100
.data ;数据区
string db 0dh,0ah,'hello,assembly',0dh,0ah,'$'
.code
start: ;标号指明程序起始点,连接程序根据程序起始点设置CS,IP值。没有设置DS,SS值。mov ax,@datamov ds,ax;逻辑代码mov ax,4c00hint 21h ;dos功能调用,返回dos操作系统subp proc near ;子程序......retsubp endp
end start ;伪指令,汇编结束
2.2汇编语言操作数
2.2.1常量
常量包括常数,字符串,数值表达式和符号常量
八进制为后缀Q,十进制后缀为D
字符串常量值是包含在引号中的字符的ASCII码值(eg:‘AB’的值是’4142H’)
符号名 EQU 数值表达式
在汇编前就被计算
2.2.2变量
变量:变量定义伪指令DB 字节,DW 字,DD 双字,DQ 8字节,DT 10字节
重复次数 dup (重复内容)
- 在指令语句中的使用:可以通过变量名引用其指向的首个数据,通过变量名加减位移量存取以首个数据为基地址的前后数据。在指令语句中直接引用变量名,其含义是访问该变量名所指向的存储单元。
- 在伪指令语句中的使用:主要是被另外的变量引用,即在另一个变量定义语句中作为参数部分出现。注意,变量名作为一个单独的参数出现在变量定义伪指令中时,只能出现在 DW (是其偏移地址)或 DD(段地址+偏移地址) 伪指令语句中,不能出现在 DB 、 DQ 等变量定义语句中。
ORG 参数
;参数值将作为下一条指令语句或变量的偏移地址
DATA SEGMENTORG 10HVAR1 DB 1,'A' ;11H, 12HORG $+2VAR2 DW 1234H,$-VAR1;14H,16H
类型 | DB | DW | DD | DQ | DT |
---|---|---|---|---|---|
属性值 | 1 | 2 | 4 | 8 | 10 |
TYPE +变量名/标号
返回其类型,用数值表示
LENGTH 变量名
返回重复操作符DUP前的重复次数,其他情况返回1
SIZE 变量名
返回LENGTH*TYPE的值
类型 PTR 变量名
强制类型转换(若低类型->高类型会把相邻的地址单元作为高地址单元)
数值表达式的值是在汇编阶段由汇编程序通过计算确定的,而不是程序运行过程中计算得到的
MOV AX,BX+2
非法的,要写成MOV AX,BX ADD AX,2
EQU伪指令相当于对表达式取别名,不允许重复赋值
X=7 ;等效于X EQU 7
X=X+5 ;X EQU X+5 (X)
2.2.3寻址方式
操作数的寻找方法叫做寻址方式
指令格式:op dst src
立即寻址:操作数在指令中,可以是8/16位
寄存器寻址:dst,src都可以是寄存器,但二者必须等长。寄存器寻找不能用IP、PSW。CS不能为dst
存储器寻址:
dst和src不能同为存储器寻址
直接寻址:EA=[8/16位位移量],例如:MOV AX,[2000H]
寄存器间接寻址:EA=[BX/BP/SI/DI]。例如:MOV AX,[BX]
寄存器相对寻址:EA=[BX/BP/SI/DI]+8/16位偏移量。例如:MOV AX,06H[SI]
基址变址寻址:EA=[BX/BP]+[SI/DI]。例如:MOV AX,[BP][SI]([BP+SI])
相对基址变址寻址:EA=[BX/BP]+[SI/DI]+8/16位移量
使用BP时,隐含段位SS。其余隐含段为DS。允许段超越。
EA可为数值,可为变量名(符号地址)
2.3指令系统
(CS,IP)不为目的操作数。src,dst数据类型要一致。
2.3.1数据传送类
MOV dst,src
,src,dst不能同时为mem和段寄存器seg,立即数imm不能直接传送到段寄存器seg,MOV不影响flag
MOV [BX][SI],12 ; 错误,两操作数类型不明确。
MOV AL,300 ; 错误,超出其表示范围
MOV [DX],BL ; 错误,DX不能用于寄存器间接寻址
PUSH src
: (SP)<-(SP)-2
,((SP)+1,(SP))<-src
从大地址开始使用,不能为imm,必须16位
POP dst
:dst<-((SP)+1,(SP))
,(SP)<-(SP)+2
,CS不能为dst
XCHG dst ,src
交换指令(不能同为mem,不能用seg、imm,src、dst必须具有相同的类型)
XCHG [BX],[SI]
错误,需要使用一个寄存器中转
XLAT
:(AL)<-[(BX)+(AL)]
操作数隐含,实现一个字节的代码转换,BX指向转换表首地址
LEA reg,src
,reg不为seg,src必须为mem(lea传送有效地址,mov传送操作数)
LDS reg,src
,(reg)<-(src)
,(DS)<-(src+2)
。从src指定的存储单元读取4个连续的存储单元内容,前两个字节送入指定的寄存器,后两个字节送入DS
LES reg,src
,(reg)<-(src)
,(ES)<-(src+2)
。从src指定的存储单元读取4个连续的存储单元内容,前两个字节送入指定的寄存器,后两个字节送入ES
PUSHF/POPF:保存/恢复主程序标志寄存器
2.3.2运算类
CBW
:AL->AX
,CWD
:AX->DX,AX
加减法:OP dst,src
,src和dst不能同为mem/seg,必须具有相同的类型,dst不能为imm,
INC、DEC不影响CF。若操作数为mem,需明确类型,否则为错误指令
DEC BYTE PTR [DI] NEG WORD PTR [SI]
求补:NEG dst
,(opr)<- 0-(opr)
乘法:无符号数为MUL src
,有符号数为IMUL src
,src为reg/mem,不能是立即数和seg。为mem时,用ptr明确类型。MUL、IMUL为单操作数指令,另一乘数隐含为AL/AX,乘积隐含存入AX/(DX和AX)。
MUL,若乘积的高一半为0,则OD=CF=0,否则为1。IMUL,若乘积高位是低位的符号扩展,则OF=CF=0。
无符号除:DIV src
。有符号除:IDIV src
。src可以是reg和mem,不能是imm和seg。若src为mem,需明确类型。被除数的字长为除数的两倍,指令中仅显示指定除数。被除数隐含为AX/(DX和AX),商为AL/AX,余数为AH/DX
NOT不影响flag。其余逻辑运算清零CF/OF,但SF/PF/ZF根据结果设置,AF没有定义,状态不确定。
移位:OP dst,src
,其中src只能为1或CL。dst为mem时应当指明类型。左移为*2,右移为/2。带进位循环移位可实现多精度数移位。
RCL WORD PTR [SI+BP],CL
SAL AX,1
RCL DX,1 ;将DX和AX组合的32位数一起左移1位
2.3.3转移
转移:可分为直接转移(标号)、间接转移(reg、mem);或分为段内转移和段间转移,都不影响flag
JMP 标号
:IP<-IP+label
相对于当前IP偏移,CS不变
JMP short/NEAR PTR 标号
8/16的偏移量,可省略属性操作符,由汇编程序自行判断
JMP opr
opr为16位的reg/mem,操作数内容为EA送入IP;还可为双字的mem,低字送IP,高字送CS,为段间间接转移
JMP FAR PTR 标号
:段间直接转移(远转移),将目标地址的段值和偏移地址分别置入CS和IP
无符号数:JB/JC/JNAE
低于,JNB/JAE/JNC
高于等于,JBE/JNA
低于等于,JNBE/JA
高于
有符号数:JL/JNGE
小于,JNL/JGE
大于等于,JLE/JNG
小于等于,JNLE/JG
大于
JCXZ
CX=0则转移,JE
相等,JNE
不相等,JP
PF=1则转移(低字节1的个数为偶数)
LOOP
:只短转移,即8位偏移量
LOOP opr
:CX=CX-1,若CX!=0,则跳转
LOOPZ opr
:CX=CX-1,ZF=1且CX!=0,则跳转
LOOPNZ opr
:CX=CX-1,ZF=0且CX!=0,则跳转
LOOP
相当于:
DEC CX
JNZ 标号
2.3.4子程序
CALL指令与JMP指令类似。 也支持4种调用转移方式:段内直接调用、段内间接调用、段间直接调用、段间间接调用。与 JMP 指令的不同之处在于,执行 CALL 指令时,须将断点地址(即当前的 IP 或 CS : IP 的内容)压人堆栈保护,以便子程序执行结束时通过出栈操作能够正确返回主程序继续执行;而 JMP 指令只是使程序转移,而不需要返回,因此不保存断点地址。
1)段内直接调用:
CALL near_roc
; SP - ( SP )-2,(( SP )+1:( SP ))←( IP ) ; IP -( IP )+ disp
CALL 指令的操作数是子程序名,指令通过汇编,可以得到其下一条指令与被调用子程序的入口地址之间的相对位移量 disp ,相对位移量为16位有符号数。指令的操作是先将 IP 压入堆栈,然后将 IP 加上相对位移量 disp ,使控制转移到被调用的子程序。
2)段内间接调用:
CALL opr
; SP -( SP )-2,(( SP )+1:( SP ))-( IP ); IP <-( opr )
CALL 将 IP 寄存器的内容压入堆栈,然后将操作数 opr 的内容传送给 IP 。指令中的操作数 opr 为16位的寄存器或存储单元,其内容为近程子程序的入口地址。
3)段间直接调用:
CALL far_proc
; CS 入栈: SP ←( SP )-2,(( SP )+1:( SP ))←( CS ); IP 入栈: SP ←( SP )-2,(( SP )+1:( SP ))←( IP )
转移: CS ← far_ proc 的段地址, IP ← far_ proc 的偏移地址
先压段地址后压偏移地址
4)段间间接调用:
CALL opr
操作数 opr 只能为32位的存储器操作数。 CALL 指令先将当前 CS 和 IP 中的内容依次压入堆栈,然后将 opr 内容的高16位送入 CS 寄存器,低16位送入 IP ,实现向位于其他代码段的远程子程序的转移
RET
若为段间返回, IP 出栈: IP ←(( SP )+1:( SP )), SP ←( SP )+2;CS ←(( SP )+1:( SP )), SP ←( SP )+2
先取偏移后取段
RET imm16
,在IP/CS出栈后还会调整栈顶指针(SP)← (SP)+n
,可以将调用前压入堆栈的参数删除掉
中断与中断返回指令 INT N
/IRET
将flag入栈,CS入栈,IP入栈,最后跳转,将TF、IF清0/IP出栈、CS出栈,恢复flag
中断向量入口地址=中断类型码*4
中断类型码/中断向量号 0~255
每个中断向量4byte,高字CS,低字IP
into:检测OF。若溢出,中断类型码为4
cpu控制指令:hlt(停止) nop(空操作) wait(等到test=0)
##2.5基本I/O功能调用
I/O调用:功能号装入AH,参数装入指定的reg,子功能装入AL,按中断类型号调用中断,返回。
int 21H:
AH | 功能 | 参数 | 返回 |
---|---|---|---|
1 | 输入一个字符,回显 | 无 | AL=字符 |
6 | 读键盘字符,回显 | DL=0FFH | AL=字符,ZF=0。若无字符,AL=0,ZF=1 |
7 | 从键盘输入一个字符,不回显 | 无 | AL=字符 |
A | 从键盘输入一个字符到缓冲区 | DS:DX=缓冲区首地址 | |
2 | 显示字符一个(检验ctrl-break) | DL=该字符ASCII | |
9 | 显示字符串 | DS:DS=串地址,串以$结束 |
0DH:回车(光标回到本行第一个字符)
0AH:换行
从第三个字节开始为输入字符存放区,存放从键盘接收的字符串,以回车符结束。如果实际输入的字符少于定义的字符数,缓冲区将空余的字节填零。如果实际输人的字符多于定义的字符数,将后来输人的字符丢掉。
现在需要输入一行字符,最多不超过50个(不含回车),那么输入缓冲区可以定义如下:
DATA SEGMENT BUF DB 51;缓冲区长度DB ? ;保留,填入实际输入的字符个数(不包括回车符)DB 51 DUP (?) ;定义51B存储空间(包含回车符)DATA ENDS ;也可以如下定义,完全等效:DATA SEGMENT BUF DB 51,?,51 DUP (?) ;或 BUF DB 51 ,52 DUP (?)DATA ENDS
输出串
lea bx,string
mov cx,5;5为串长度
one:mov dl,cs:[bx]mov ah,2int 21Hinc bxloop one
string db "hello"
end startlea dx,string
mov ah,9
int 21h
string db 0DH,0AH,"hello",0DH,0AH,'$'
从键盘输入不大于65535的十进制数,存入BINARY
.MODEL TINY
.STACK 100
.DATA
BUFFER DB 6,?,6 DUP (?)
C10 DW 10
BINARY DW ?
.CODE
START:MOV AX,@DATA MOV DS,AX LEA DX,BUFFER MOV AH,OAH INT 21H ;输入一个数到缓冲区MOV AX ,0MOV CL,BUFFER+1MOV CH,0 ;设置CXLEA BX,BUFFER+2 ;装载字符缓冲区首地址
one:MUL C10MOV DL,[BX]AND DL,0FHADD AL,DLADC AH,0INC BXLOOP ONEMOV BINARY,AXMOV AX,4C00HINT 21H
END START
3.程序逻辑语句
双分支结构一定要跳过另一个分支体。
大小写字母ASCII码差值20H。
用查表法实现代码转换。(AL)<-[(BX)+(AL)]
BX指向转换表首地址,AL中为索引值,实现一个字节的代码转换
用地址表实现多分支转移。数据段:TABLE DW f1,f2,f3
一定是字类型,存放各分支的偏移地址
程序段:jmp TABLE[bx]
循环:
do-while型初始化、工作、修改、控制。
while型循环:初始化、控制、工作、修改。
计数循环:用CX记录循环次数;条件循环:循环次数不确定,根据某个条件是否满足来决定是否继续循环
子程序的参数传递:一般用寄存器传递参数,作为出口参数的寄存器不能保护和恢复,入口参数的寄存器可以保护也可不保护。
其次是用堆栈传递参数,需要在子程序中设置BP寄存器,利用BP参与的寻址方式访问堆栈单元,最好画出堆栈示意图。用存储器传递参数适用性比较差
无符号字数组以-1为结束,求平均值
4.8086/8088微处理器的外部特性
4.18086/8088的外部特性
引脚:40根引脚, MN/ MX ‾ \overline{\text{MX}} MX 为工作模式,接高电平为最小模式。最大模式可接8087/8089等协处理器。控制由总线控制器8288提供。clk占空比为33%,高电平在一个周期的比例是1:3
AD15~AD0:地址/数据复用信号,地址三态输出,数据三态双向。
A19~ A16/S6~ S3:地址状态复用
S6S5:S6=0指示8086与总线连通,S5=表明此时可响应INTR
S4S3:段seg。00ES,01SS,10CS,11DS
20根地址线,16根数据线
RESET:复位,输入,高有效,至少维持4个时钟周期,CS全一,其他reg清0
READY:就绪,输入,高有效。接收来自mem或I/O接口向cpu发送的"准备好"信号
RD ‾ \overline{\text{RD}} RD:三态输出,低有效,读
WR ‾ \overline{\text{WR}} WR:三态输出,低有效,写
BHE ‾ \overline{\text{BHE}} BHE/S7:三态输出,分时复用,为0时,表示高8位数据线D15~D8位有效,S7无意义
BHE ‾ \overline{\text{BHE}} BHE接 CS1 ‾ \overline{\text{CS1}} CS1,AD0接 CS0 ‾ \overline{\text{CS0}} CS0,8086cpu有两个存储体,采用低位交叉编址,AD0决定奇偶性,从奇地址读一个字,需要2个总线周期。
BHE ‾ \overline{\text{BHE}} BHE | AD0 | |
---|---|---|
0 | 0 | 从偶读字,AD15~AD0(MOV AX,[10]) |
0 | 1 | 从奇读字节,AD15~AD8(MOV AL,[11]) |
1 | 0 | 从偶读字节,AD7~AD0(IN AL,60H) |
1 | 1 | 高阻 |
0 | 1 | 从奇地址开始读写一个字(低8位送到AD15~AD8) |
1 | 0 | 高8位送到AD7~AD0 |
INTR输入,高有效,IF=1时响应中断请求。
NMI输入,上升沿有效,不可屏蔽中断请求。
INTA ‾ \overline{\text{INTA}} INTA三态输出,INTR中断响应,对NMI无效,通知中断源提供中断类型号
ALE:输出,地址锁存允许,正脉冲下降沿锁存地址。
DEN ‾ \overline{\text{DEN}} DEN:三态低有效,表明AD15~AD0在传数据。
DT/ R ‾ \overline{\text{R}} R:三态输出,=1时发送数据,=0时接收数据。
M/ IO ‾ \overline{\text{IO}} IO:三态输出,选mem/I/O接口读写。
4.28086的总线操作
三种周期:时钟周期、总线周期(完成一次总线操作所需要的时间,读写一次mem/外设)、指令周期(包含多个总线周期)
8086的一个基本总线周期由4个T状态构成,它们分别是 T1、T2、 T3,和 T4。每个 T 状态的持续时间为一个时钟周期。总线周期总是以 T1开始,至 T4结束。如果一个总线周期结束后没有后续总线操作,则总线处于空闲状态( Ti )。
T1状态:输出地址信息并锁存到外部的地址锁存器。
T2状态:撤销地址信息,发出控制信号,为传送数据作准备。
T3状态:如果被访问对象已准备好,则数据稳定。
TW和T3的引脚信号完全一样
T4状态:读写数据,总线周期结束。
8086总是在T3状态的前沿检测 READY 引脚上的信息,如果为高电平则说明被访问对象已就绪,T3状态结束后直接进入T4状态,总线周期不延长。
4.2.1总线读周期
执行MOV AX,[BX]
T1:M/ IO ‾ \overline{\text{IO}} IO变高,对内存操作。AD19~ A0地址信号, BHE ‾ \overline{\text{BHE}} BHE/S7变低(根据要访问的地址特点决定,这里是让高8位有效),ALE正脉冲(利用下降沿锁存地址),DT/ R ‾ \overline{\text{R}} R变低(通知数据收发器接收数据)
T2:A19~ A16/S6~ S3送出状态信号,AD15~AD0高阻, RD ‾ \overline{\text{RD}} RD有效(读内存), DEN ‾ \overline{\text{DEN}} DEN有效(允许数据收发器传送数据)
T3:AD15~AD0出现数据,在T3状态前沿检测 READY 引脚上的信息
T4: RD ‾ \overline{\text{RD}} RD变高时,CPU读。 DEN ‾ \overline{\text{DEN}} DEN高,收发器与总线断开。
4.2.2总线写周期
写mem与外设的区别在于外设地址只有16位,所以A19~ A16=0000,M/ IO ‾ \overline{\text{IO}} IO为低电平
执行MOV[DI],BL(写8位而不是16位)
T1:DT/ R ‾ \overline{\text{R}} R输出高电平而不是低电平, BHE ‾ \overline{\text{BHE}} BHE/S7为高,高8位无效(与网上找的图有区别,注意具体问题具体分析)
T2: WR ‾ \overline{\text{WR}} WR变低,CPU将写。AD15 ~AD8变高阻,AD7 ~AD0发出要写入mem/外设的数据, DEN ‾ \overline{\text{DEN}} DEN变低。
T3:维持不变,在T3前沿检测Ready是否有效。
T4: : WR ‾ \overline{\text{WR}} WR高,CPU写
8088与8086不同的地方表现在:
- 8088只具有8根地址/数据复用引脚AD0~ AD7,另外还有8根地址专用引脚A15~A8。不管是8088还是8086,传送地址信息的引脚都是20根,都能访问1MB内存空间。8088具有8根数据引脚,而8086具有16根数据引脚,因此8088每次对外只能访问8位数据,而8086既可以访问8位数据又可以访问16位数据。
- 8088的存储器或I/0接口选择信号引脚为IO/ M ‾ \overline{\text{M}} M,而8086的对应引脚为M/ IO ‾ \overline{\text{IO}} IO,它们的作用刚好相反。
- 8088无 BHE ‾ \overline{\text{BHE}} BHE/S7引脚,被 SS0 ‾ \overline{\text{SS0}} SS0代替
总线时序大致与8086相同,不同在于8088具有8根地址/数据复用引脚AD7~AD0和8根地址专用引脚A15-A8,。AD7 -AD0在T1状态输出地址信息,在其他T状态传送数据信息;而A15~A8在整个总线周期输出地址信息。
4.3最小模式下的8086子系统
主要包括:8284A时钟、3个8282(8位锁存器)地址锁存,2个8286(8位双向三态缓冲器)数据收发,直接提供控制。
输出:AD15~ A0,A19~ A16/S6~ S3时,20位地址被3片8282锁存,并锁存 BHE ‾ \overline{\text{BHE}} BHE,ALE与STB相连,ALE=1,D=Ai;ALE=0,输出保存不变。
8286 T与DT/ R ‾ \overline{\text{R}} R相连, OE ‾ \overline{\text{OE}} OE 与 DEN ‾ \overline{\text{DEN}} DEN相连,允许数据通过。
6.微型处理机输入输出技术
##6.1I/O接口概述
外部设备不能直接通过系统总线连接主机,而是在主机和外部设备之间添加I/O接口(Input/Output Interface)电路,外部设备通过I/O接口连接系统总线。
I/O接口的功能:地址译码和设备选择功能,数据缓冲功能(解决主机和外设两者之间的速度匹配问题),传递主机控制命令,存放外设状态信息,数据格式转换功能。
主机与I/O接口间传递的数据、状态、控制信息全部通过系统数据总线传送。能够被cpu直接访问的寄存器称为端口,每个端口都有独立的地址,8086采用I/O端口独立编址,采用专门的I/O指令访问端口,I/O地址空间为216 =64K个8位端口
in AL/AX,imm8/DX
out imm8/DX,AL/AX
大于0FFH的端口只能存在DX
IN,OUT指令的指令时序为一个输入/输出总线周期,在 RD ‾ \overline{\text{RD}} RD/ WR ‾ \overline{\text{WR}} WR上升沿读入/输出数据
读外设(查询)
status:mov dx,102H;指定状态端口地址in al,dxtest al,80H jz status;D7=0,未就绪,继续等待mov dx,100h;指定数据端口地址in al,dx
写外设(查询)
status:mov dx,102Hin al,dxtest al,80Hjnz status;//D7=1,忙,继续查询mov dx,100hmov al,charout dx,al
74LS244:双4位输入三态缓冲器,输出锁存。
74LS245:双向三态缓冲器,DIR=1:Ai->Bi;DIR=0,Ai<-Bi
74LS273:输出锁存器,上升沿锁存( WR ‾ \overline{\text{WR}} WR信号由低变高)。
程序控制方式:
- 直接控制方式:直接控制方式又称为无条件传送方式。某些外设的I/O操作时间已知,并且固定,I/0接口可以随时从主机接收要输出的数据,或者随时向主机输入数据。例如, CPU 输出数据直接控制指示灯、直接读取开关的状态等。只需要设置一个输出锁存器和一个三态缓冲器和地址译码器。
- 程序查询控制:启动外设后,cpu便不断查询外设状态,如果没有,cpu必须等待并继续查询。
- 程序中断方式:当外设准备好后向cpu发出中断请求,cpu响应中断后执行事先编制好的输入/输出程序。
6.2开关量输入/输出
采用无条件程序控制输入/输出
开关量输出:若要在数码管上显示特定的信息,必须从输入端输入特定的信息编码称为字形码,也称为段码。
多位数码管显示:两个端口:段码端口(输出字形码,通过一个输出端口送出的字形码可以被多个数码管接收)和位码端口(选择数码管,端口中的某一位为1,所连的数码管显示收到的段码信息)。显示程序流程:位码都无效,熄灭所有数码管;送字形码;设置位码;延时后重复。
开关量输入:矩阵式键盘接口电路,如图所示:
矩阵中的每一个按键都有一个唯一的2B"行列码"。例如,行线R3和列线C2,交叉处按键的行列码为"F7FBH",高字节为行,低字节为列。
要通过执行程序识别键盘矩阵中被按下的单个按键,则程序执行的步骤为:
-
向行端口输出全"0"并读取列端口。如果列端口信息为全"1"则退出,否则执行第2步(该操作被称为"粗扫描")。
-
延时消抖,通常延时20ms。
-
再次读取列端口,如果读出的信息为全"1",说明无键按下,退出,否则执行下一步。
-
逐根行线输出"0"并读取列端口。直到某次读到的列信息非全"1"(有1位为0),识别出按键,执行第5步,否则退出(该操作被称为"细扫描")。
-
形成按键的2B行列码,当前的行线输出的数值为按键所在行信息,读到的列值为按键所信息。
以上识别键盘矩阵中被按下的单个按键的方法称为行扫描法。
下面的子程序基于行扫描法扫描键盘矩阵,当有键按下时通过AX返回按键的2B行列码,AH为行码,AL为列码,没有按键返回"-1"。R_PORT、C_PORT分别为行列端的地址,由地址译码电路决定具体数值。SCANKEY PROC PUSH CX PUSH DX MOV DX,R_PORT MOV AL,0 OUT DX,AL ;行输出全"0" MOV DX,C_PORT IN AL,DX ;读取列端口 CMP AL,OFFH ;检测列信息是否是全"1",判断有无按键 JE NO_KEY ;延时20MS IN AL,DX CMP AL,OFFH JZ NO_KEY MOV AH,OFEH MOV CX,8 NEXT: MOV AL,AH ROL AH,1 ;形成下一行的行码,为扫描下一行做准备 MOV DX,R_PORT OUT DX,AL ;输出行码 MOV DX,C_PORT IN AL,DX CMP AL,OFFH LOOPZ NEXT ;CX≠O且ZF=1时循环. JZ NO_KEY ROR AH ,1 ;AX 存放形成的行列码 JMP EXIT NO_KEY: MOV AX ,-1 POP DX POP CX RET SCANKEY ENDP
7.中断系统
在计算机系统中,所谓中断,是指 CPU 执行程序时,突然有某个外部或内部事件发生,请求 CPU 处理,CPU 暂停当前正在执行的程序,转去执行处理该事件的服务程序,服务完毕后,CPU 返回原来程序被中断的地方继续执行。这个过程称为中断。
由于中断的发生,被暂停执行的程序中即将执行但还没有被执行的那条指令的地址称为断点,即中断发生时的CS和IP值。处理该中断事件的服务程序称为中断服务程序。中断源向 CPU 提交它的中断类型号,从而得到中断服务程序入口地址。
内部中断:软件中断、除法错误(0)、单步、断点、溢出、指令中断(INT N,调用类型号为N的中断服务程序)。
外部中断:NMI(电源掉电、存储器检验出错)、INTR(高电平有效,在一条指令结束后采样INTR),所有外部设备中断都是INTR。NMI类型号为2,边沿触发。一条指令的结束是相应NMI的必要条件
中断优先级:内部中断(除了单步中断)>NMI中断>INTR中断>单步中断
中断向量地址=中断类型号*4
利用MOV指令设置中断向量。
MOV AX,0
MOV ES,AX;中断向量表段地址为0
MOV BX,N*4;BX中为中断向量地址
MOV AX,OFFSET INTPROC
MOV ES:[BX],AX;低地址存放偏移地址
MOV AX,SEG INTPROC
MOV EX:[BX+2],AX;高地址存放段地址
CPU 响应中断必须满足如下条件:
CPU 接收到中断请求,没有 DMA 请求,当前指令执行结束。如果是 INTR 中断请求, CPU 还必须开中断,即中断标志 IF =1。
获取中断类型号之后,由硬件完成关中断,保护断点,取中断服务程序入口地址(即中断响应过程,程序切换)
中断处理:保护现场、开中断、执行中断服务程序,关中断,恢复现场
关中断情况:系统复位、中断被响应、CLI。
8259A中断控制器
A0:选择8259A两个端口,A0=0表偶端口。8259A A0接8088 A0;8259A A0接8086 A1;
INT:中断请求信号,输出,连接INTR引脚。
CAS2…CAS0:主片输出、从片输入、级联信号
SP ‾ \overline{\text{SP}} SP(suite piece)/ EN ‾ \overline{\text{EN}} EN:8259A处于非缓冲方式,主片 SP ‾ \overline{\text{SP}} SP= 1 ,从片 SP ‾ \overline{\text{SP}} SP= 0;8259A处于缓冲方式,与数据总线相连,控制总线缓冲器使能 EN ‾ \overline{\text{EN}} EN=0,CPU读。
IR0…IR7为中断请求信号
IRR中断请求寄存器,1表示对应位有请求,响应( INTA ‾ \overline{\text{INTA}} INTA有效时)后复位。
IMR中断屏蔽寄存器,0表示对应位允许中断,只有IMRi=0且IF=1,CPU才能响应可屏蔽中断。
ISR中断服务寄存器,1表示IRRi对应位中断正在被服务,即已经被响应且还未结束,可能是正在服务的中断,也可能是被中断嵌套挂起的中断。
PR优先级判别器(综合IMR和ISR)
8259A的工作方式:
-
中断请求触发的方式(是指中断请求引脚 IR7~ IR0的有效信号类型,有两种方式):
边沿触发方式;电平触发方式,在电平触发方式下,当中断得到响应后,中断输入端必须及时撤消高电平,否则在 CPU 进入中断处理,并且开中断的情况下,原输入端的高电平会引起第二次中断的错误。
初始化命令字 ICW1中的 LTIM 位用来设置这两种触发方式。 LTIM =1为电平触发, LTIM =0为边沿触发 -
优先权管理方式
8259A有两种确定优先权的方法:固定优先级和循环优先级
固定优先级:从高到低为IR0~ IR7。根据嵌套的方式不同具体又分为全嵌套方式和特殊全嵌套方式。全嵌套:禁止同级/低级优先级中断。特殊全嵌套:禁止低级中断。从片的所有信号请求都是通过主片同一引脚发出,对主片来说是同级中断。主片全嵌套,从片特殊全嵌套。循环优先级:优先级自动循环:初始从高到低为IR0~ IR7,IRi被服务后,IRi最低。优先级特殊循环:可设置初始最低优先级
-
屏蔽中断源方式:普通屏蔽:IMR的IMRi为1,对应 IRi 屏蔽。特殊屏蔽:IRi 被屏蔽时,同时使ISRi 为0,屏蔽同级中断,开放较低级中断。先写OCW3(68H),再写OCW1,即开放那些除了正在服务的中断之外的中断请求(包括优先级低的请求)
-
中断结束方式:(中断结束:使ISRi为0)
AEOI:自动结束方式。只能用一片8259A且在多个中断不会嵌套的情况下
EOI:非自动结束方式,在中断服务程序结束前向8259A发送EOI命令使对应位清0。有两种命令格式,一般:不指定ISR要清除的位,8259A自动清除优先级最高位,用于全嵌套方式;特殊:指明ISR中要清除的位,用于特殊全嵌套和循环优先级方式。
-
连接系统总线方式:缓冲: SP ‾ \overline{\text{SP}} SP/ EN ‾ \overline{\text{EN}} EN输出低电平则启动总线缓冲器。非缓冲: SP ‾ \overline{\text{SP}} SP/ EN ‾ \overline{\text{EN}} EN指明主片还是从片
8259A一次完整的工作过程如下:
- 中断源在中断请求输入端 IR0~ IR7,提出中断请求。
- 中断请求被锁存在 IRR 寄存器中,并经 IMR 屏蔽,其结果送给优先权判决电路与 ISR 寄存器进行判优。中断请求的优先级高于正在服务的优先级,则控制器接收中断请求,向 CPU 发送 INT 信号。
- CPU 从 INTR 引脚接收到8259A的请求信号,若 CPU 的 IF 为1,允许中断,则发出两个连续的 INTA ‾ \overline{\text{INTA}} INTA信号响应中断。
- 8259A收到第一个 INTA ‾ \overline{\text{INTA}} INTA信号,该中断源对应的 IRR 位清 0 , ISR 对应位置1,从而禁止同级和低级的中断,级联,还需送 CAS0~ CAS2
- 单独使用,第二个 INTA ‾ \overline{\text{INTA}} INTA,从D0~ D7 送出中断类型号。若8259A设置为中断自动结束,则在第二个 INTA 后, ISR 相应位自动清0。
- CPU 读取该类型号,转到相应的中断处理程序。
- 中断处理结束前,若8259A设置为非自动中断结束,由中断处理程序发送一条 EOI (中断结束)命令,使 ISR 相应位清0。本次中断到此为止。
8259A的初始化命令字
-
ICW1:初始化命令字。D0=1:使用ICW4,为0不使用。D1(SNGL)=1:系统有1片8259A,为0表示系统有多片。D2(ADI)0/1都可。
D3(LTIM)=1:电平触发,为0表示边沿触发。D4=1(特征位),D5~ D7为0。
-
ICW2:中断类型号初始化命令字。中断类型号高5位就是ICW1高5位,低三位由中断请求引脚决定。eg:中断类型号为40~ 47H,其中IR2为输入中断请求引脚,因此该中断源的类型号为42H。
-
ICW3:主片/从片初始化命令字。系统中有多片8259A级联时才有意义。主片ICW3某一位为1表示对应的IRi引脚连接从片,主片ICW3低三位表示从片连接的主片引脚编号。
-
ICW4:控制初始化命令字。D0必须为1。D1(AEOI):设置中断结束方式。D2(M/ S ‾ \overline{\text{S}} S):D3位为1该为才有意义,用于缓冲方式下标识主片/从片,该位=1为主片。而 SP ‾ \overline{\text{SP}} SP/ EN ‾ \overline{\text{EN}} EN用于非缓冲方式标识主片和从片,输入。D3(BUF)=1:8259A工作在缓冲方式。D4(SFNM)=1:特殊全嵌套方式,D5~ D7为0。
初始化流程:先写ICW1、ICW2,再看情况写ICW3、ICW4。
ICW1写偶地址端口,ICW2、ICW3、ICW4写奇地址端口。
8259A的操作命令字
-
OCW1:中断屏蔽操作命令字。Di=1对应IRi引脚中断被屏蔽。
in al,81H and al,11111101B out 81H,al ;读-修改-写,让IR1开放中断
-
OCW2:控制中断结束方式和优先级循环方式命令字。D7®:优先级循环控制器。 R =1为循环优先级, R =0为固定优先级。
D6位(SL):L2~ L0 的使能位。 SL=1,L2~ L0 有效;D5位( EOI ):中断结束命令位。 EOI =1,非自动中断结束方式;D4D3为0,特征位;D2~ D0:指定中断级等级 -
OCW3:屏蔽查询状态命令字。D7位恒为0。 D6位(ESMM):特殊屏蔽模式使能位。ESMM=1,SMM位有效;ESMM=0,SMM位无效。D5位(SMM):特殊屏蔽模式位。SMM =1,设置8259A工作在特殊屏蔽方式;D4D3位=01:OCW3 的特征位。 D2位§:查询方式位。P =1表示8259A工作于优先级查询方式,一般不用。 D1位(RR):读内部寄存器使能位。 RR =1,可以读出8259A内部 ISR 或 IRR 的内容(IMR可以由ICW1读出)。D0位(RIS):内部寄存器选择位。 RIS =1,读出 ISR 寄存器的内容。 RIS=0,读出 IRR 存器的内容。
mov al,00001100H;OCW3的P位为1,设置查询方式
out 20H,al
in al,20H;读出的内容即为中断查询字,如果最高位为1,表示有中断请求,最高优先级的编号由低3位表示
OCW1写奇地址端口,OCW2、OCW3写偶地址端口。
中断服务子程序整体流程:保护现场、开中断、中断处理、关中断、发送EOI命令、恢复现场、中断返回。
.model tiny
.stack 100
.data
done dw 0
.codemov ax,@datamov ds,axmov ax,0mov es,ax;中断向量表段基地址为0000Hmov bx,42H*4mov ax,offset intrproc mov es:[bx],axmov ax,seg intrprocmov es:[bx+2],ax
;8259初始化mov al,00010011B;icw1out 80h,almov al,01000000B;icw2,40Hout 82h,almov al,00000001B;icw4,01Hout 82h,almov al,11111011Bout 82h,al;写ocw1,开放IR2请求的中断屏蔽位;中断服务程序初始化mov done,0sti
wait:cmp done,1jne waitmov ax,4c00hint 21hintproc proc farpush axpush dsstimov ax,seg donemov ds,axin al,0a0h;读开关状态out 0c0h,al;输出控制ledcmp al,0ffhjnz exitint al,82h;中断屏蔽or al,00000100Bout 82h,al
exit:climov al,20H;发送EOI命令out 80H,al;OCW2 pop dspop axiret
intproc endp
end start
8.可编程接口芯片
8255A芯片
有40根引脚,3个8位端口,一个控制端口(控制端口只能写,读操作没用),3种工作方式。
D0−D7数据线,A0−A1地址输入引脚,选择8255A内部4个端口(接8086cpu时,A0接A1,A1接A2), CS ‾ \overline{\text{CS}} CS片选,PA0~ PA7,PB0~ PB7,
PC0~ PC7。
A组:A口、C口高4位。B组:B口、C口低4位。A组支持方式0,1,2;B组支持方式0,1;端口C仅支持方式0
8255A工作方式
方式0:基本输入/输出方式,三个端口彼此独立作为输入/输出端口,输入缓冲,输出锁存,适用于无条件传送/查询方式。
方式1/2:查询、中断。输入数据锁存缓冲,输出数据锁存。
方式1:选通输入/输出方式,固定征用端口C某些引脚作为联络信号使用,未被征用的引脚可用作I/O
方式1输入: STB ‾ \overline{\text{STB}} STB选通(外设准备好数据,将数据锁存、输入),之后高电平使INTE=1。
IBF:输入缓冲区满信号,输出。由 STB ‾ \overline{\text{STB}} STB低电平置位,由 RD ‾ \overline{\text{RD}} RD上升沿复位。外设检测到…
INTR:中断请求信号,输出。(发送中断的条件是INTE=1, STB ‾ \overline{\text{STB}} STB输入一个完整的负脉冲变为高电平且IBF=1),由 RD ‾ \overline{\text{RD}} RD上升沿复位。
INTE,A组和B组分别由PC4/PC2的置位/复位控制
方式1输出: OBF ‾ \overline{\text{OBF}} OBF输入缓冲器满信号,通知外设可取走数据。由 WR ‾ \overline{\text{WR}} WR置位,由 ACK ‾ \overline{\text{ACK}} ACK复位。
ACK ‾ \overline{\text{ACK}} ACK:外设响应信号,输入,外设已经取走数据。之后高电平使INTE=1。
INTR:中断请求信号,输出。数据已被外设取走,通知cpu传输下一个数据。(发送中断的条件是INTE=1, ACK ‾ \overline{\text{ACK}} ACK输入一个完整的负脉冲变为高电平且 OBF ‾ \overline{\text{OBF}} OBF也由低变高),由 WR ‾ \overline{\text{WR}} WR下降沿复位。
INTE,A组和B组分别由PC6/PC2的置位/复位控制
方式1输出时 OBF ‾ \overline{\text{OBF}} OBF有效时输出,外设接受后回送 ACK ‾ \overline{\text{ACK}} ACK。
端口 | PCi | 输入 | 输出 |
---|---|---|---|
A端口 | PC7 | OBF ‾ \overline{\text{OBF}} OBF | |
A端口 | PC6 | ACK ‾ \overline{\text{ACK}} ACK | |
A端口 | PC5 | IBFA | |
A端口 | PC4 | STB ‾ \overline{\text{STB}} STB | |
A端口 | PC3 | INTRA | INTRA |
B端口 | PC2 | STB ‾ \overline{\text{STB}} STB | ACK ‾ \overline{\text{ACK}} ACK |
B端口 | PC1 | IBFB | OBF ‾ \overline{\text{OBF}} OBF |
B端口 | PC0 | INTRB | INTRB |
方式2:双向传输方式,实际上就是端口A工作在方式1输入和输出的组合。输入输出共用一个中断,首先读取端口C状态,对 IBFA和 OBF ‾ \overline{\text{OBF}} OBF进行检测,进一步确定是输入中断还是输出中断。
8255A控制字
方式控制字(设置8255A的工作方式和输入/输出方式)
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|
1 | A方式高位 | A方式低位 | A输入输出 | PC7−PC4输入输出 | B方式 | B输入输出 | PC3−PC0输入输出 |
其中,0表示输出,1表示输入。
C口位控制字
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|
0 | 无意义 | 无意义 | 无意义 | 选位 | 选位 | 选位 | 清零/置1 |
D1~ D3的8种编码对应PC0~ PC7引脚,D0位确定该位置0/1,中断允许触发器INTE的设置可以通过端口C位控制字实现
两个控制字均写入控制端口,D7位称为标识位
为了识别键盘上的闭合键,通常可以采用两种方式:行扫描法和行反转法。行扫描法:当扫描到键盘上有键
被按下、须经过多次扫描才可以找到按键所在的行,效率较低;而行反转法可以快速识别按键。
图8-10是16键的键盘接口,16个键排成4行×4列的矩阵,矩阵的4条行线接到输出端口P的PA3~PA0,4条列线连到输入端 8255A
口B的PB3-PB0。将每个键的行和列放在一个字节中,高4位为行值,低4位为列值
利用行反转法识别按键的程序流程如下:
-
设定行为输出,列为输人。 A口输出,B0输入得列线
-
行输出为“0”,读列值。
-
列值若为全“1”,则说明无键按下,执行步骤1;如果列值非全“1”,说明有键按下执行步骤4。
-
延时,消除抖动。
-
再读列值,列值若为全“1”,则说明无做按下,执行步骤2;如果列值非全1,说明确实有键按下,执行步骤6。
-
设定列为输出,行为输入。 A口输入,B0输出得行线
-
从列输出刚才读到的非全“1”的数值,读行值。
-
得到行列扫描码,查表转换成按键键面值。
-
按键释放后,程序结束。
KEYSCAN PROC SCN: MOV DX,303H ;指向控制口 MOV AL,10000010B ;端口A方式0输出,端日8方式0输人 OUT DX,AL ;写入控制字 MOV DL,300H ;端口A地址 MOV AL,0 OUT DX,AL ;向端口A各位输出0 MOV DX,301H WAIT: IN AL,DX ;键盘状态读人端口B AND AL,0FA ;只查低4位(列值) CMP AL,0FH ;是否都为“1” JE WAIT ;无键按下,继续检查键盘 ;有键按下,延时20ms,消抖动,代码略 IN AL, DX ;键盘状态读入端口B AND AL,0FH ;只查低4位(列值) CMP AL,0FH ;是否都为“1” JE WAIT ;列值为全“1”,无键按下,继续检查键盘 MOV KEY,AL ;有键按下,列值保存在KEY单元 MOV DX,303H ;置 8255A控制端口地址,改变 8255A的工作方式 MOV AX,90H ;8255A方式控制字,端口B方式0输出,端口A方式0输入 OUT DX,AX ;输出 8255A 方式控制字 MOV DX,301H ;端口B地址送入DX MOV AL,KEY ;从KEY单元取出列值 OUT DX,AL ;向端口B输出列值,反向扫描 MOV DX,300H ;端口A地址送入 DX IN AL,DX ;从端口A读入行值 AND AL,0FH ;保留低4位 CMP AL,0FH JE SCAN MOV CL,4 SHL AL, CL ;行值左移4位 srC:只能为1或CL. ADD AL, KEY ;组成行列扫描码存放到AL单元,高4位为行值,低4位为列值 CALL KEYVALUE ;通过AL中的行列扫描码查TABLE 表 ;得到的键面值存入AH, 子程序略 MOV DX, 301H ;端口B地址送入DX,判断键释放 MOV AL, 0 OUT DX, AL ;向端口B输出“0”,反向扫描 MOV DX, 300H ;端口A地址送入 DX WAIT2: IN AL, DX ;从端口A读入行值 AND AL, OFH ;保留低4位 CMP AL, OFH JMP WAIT2 ;键还没释放 RET KEYSCAN ENDP
8254/8253定时/计数接口芯片
定时或计数的工作实质是相同的,都是对脉冲信号的计数。clk输入是周期恒定的时钟,则8259一般工作在定时方式;如果输入的是周期可以不定的脉冲,则8254一般为计数器。
8254数据缓冲总线是8位。8254有三个计数器/定时器和一个控制寄存器(只能写,读没用),每个计数器/定时器内都有个初值寄存器、减一计数器和输出锁存器。GATE信号控制计数器的启动和停止
工作过程:设定工作方式、计数初值、[硬件启动] (方式1和方式5需要),写入的计数初值在下一个clk的下降沿进入减一计数器、每输入一个时钟,减一计数器减一计数、计数结束。
8254工作方式
方式0:计数结束中断(计数方式)。当控制字写入寄存器后,输出OUT就变低,当计数值写人计数器后下一个clk下降沿开始计数,计数到0,OUT变高,计数器只计数一遍。
方式1:硬件触发单稳负脉冲发生器,当控制字写入寄存器后,OUT变高并保持,只有等GATE来一个上升沿,下一个clk下降沿开始计数,OUT变低,计数到0,OUT变高。 OUT输出的负脉冲宽度为计数初值× CLK 周期。计数值多次有效,每来一个GATE上升沿,就自动装入计数值从头计数。
方式2:速率发生器(频率发生器/分频器),CPU 输出控制字后,输出 OUT 就变高,写入计数值后的下一个 CLK 下降沿开始计数,计数到1后,输出OUT 变低,经过一个CLK 以后,OUT恢复为高,计数器重新开始计数。OUT信号的周期为N个CLK周期,高电平和低电平的比为N-1:1
3:方波速率发生器。与方式2类似。不同在于,若计数值为偶数,则输出标准方波高、低电平各为N/2个clk周期;若计数值为奇数,则高电平占(N+1)/2、低电平占(N-1)/2个clk周期;
4:软件触发选通信号发生器,计数到0时OUT变低,经过一个clk再变高
5:硬件选通信号发生器
方式1输出N个CLK负脉冲,方式5输出1个CLK负脉冲(与2/4波形相同,N-1高,1低)。
方式2/3连续计数,GATE高电平计数,上升沿重新计数。
方式0/4由软件启动(只计数一次,重写计数初值来启动)。1/5硬件启动(GATE上升沿),0/4在高电平计数。
只有方式0在写控制后OUT变低,其余变高。
8254控制字
方式控制字:D7D6选择计数器(11表示读出控制字标志),D5D4选择读写格式(00:计数器锁存,01:只读写低8位…),D3D2D1选择工作方式,D0选择数制(2进制/BCD)。
二进制计数时,写入的初值最大是0000H,表示65536;在十进制时,写入的初值最大也是0000H,表示10000.
读出控制字:D7D6(11),D0=0。D5=0锁存计数值,D4=0锁存状态,D3D2D1:对应位为1表示锁存计数器2,1,0。
可以同时锁存各计数器数据/状态,如果同时锁存计数值/状态值,第一次读状态,第二次读计数值。
输入时钟信号频率Fclk,周期为Tclk,输出频率Fout,周期为Tout,计数初值为N
则N=Fclk/Fout=Fclk*Tout
先写控制字,再写初值
PWM脉冲波形主要用于调速,设置PWM波形的两个参数:占空比和周期
某工厂计件系统,装一个零件产生一个脉冲接CLK0 ,装100个后扬声器发声,则奇数器0方式0,奇数器1在方式3。
mov al,10H
mov dx,PORT_CTRL
out dx,al
mov al,100
mov dx,PORT_0
out dx,al
mov al,76H
mov dx,PORT_CTRL
out dx,al
mov ax,2000
mov dx,PORT_1
out dx,al
mov al,ah;写高8位
out dx,al
仔细读下图给出的应用系统电路图, 8255用作系统总线和ADC0809之间的接口电路,通过8254计数通道0输出周期为1ms的信号定时启动对ADC0809模拟通道IN4的A/D转换,计数通道1输出的信号用作ADC0809所需的500KHz时钟信号,A/D转换结束后通过8259的IR2向CPU发送中断请求。如果8259已经完成初始化,全嵌套、非自动中断结束方式,中断类型号为80H~87H。请完成以下几个问题:
(1) 写出对8255A初始化的程序段(包括设定8255的方式选择控制字、选择ADC0809的模拟通道IN4,输出8254所需要的有效GATE信号)。
(2) 写出对8254初始化的程序段,输出A/D转换所需要的两个时钟信号。
(3) A/D转换结束后通过8259的IR2向CPU发送中断请求,产生的中断的类型号是多少?该中断源的中断向量放在内存中的什么位置?如果中断服务程序的入口地址为3210H:7880H,画出中断向量表中的相关存储空间内容。
(4) 根据(5)中编写的中断服务程序,完成中断向量表的初始化,并开放8259的IR2。
(5) 编写完整的中断处理程序INTPROC,将模拟通道IN4的一次A/D转换结果读入内存字节变量Temp。
(1)
MOV AL,10110100B
MOV DX,66H
OUT DX,AL;8255A方式控制字
MOV AL,4
OUT 62H,AL;选择ADC0809的模拟通道IN4
MOV AL,00000001B
OUT 64H,AL;输出8254所需要的有效GATE信号
(2)
MOV AL,00110111;方式三,BCD
OUT 46H,AL
MOV AX,5000H
OUT 40H,AL
MOV AL,AH
OUT 40H,AL;计数器0写控制字和初值
MOV AL,01010110;方式三,二进制
OUT 46H,AL
MOV AL,10
OUT 42H,AL;计数器1写控制字和初值(3)
(3)
82H,208H
0208H | 80H | IP |
---|---|---|
0209H | 78H | IP |
020AH | 10H | CS |
020BH | 32H | CS |
(4)
MOV AX,0
MOV ES,AX
MOV BX,208H
MOV AX,OFFSET INTRPOC
MOV ES:[BX],AX
MOV AX,SEG INTRPOC
MOV ES:[BX+2],AX
MOV DX,20H
IN AL,DX
AND AL,11111011B
OUT DX,AL
(5)
INTPROC PROC NEAR
PUSH DX
PUSH AX
PUSH BX
STI
MOV AX,SEG TEMP
MOV DS,AX
MOV DX,60H
IN AL,DX
MOV BX,OFFSET TEMP
MOV [BX],AL
MOV DX,22H
IN AL,DX
OR AL,00000100B
OUT DX,AL;设置8259A中断屏蔽字
CLI
MOV AL,20H
OUT 20H,AL;EOI结束命令
POP BX
POP AX
POP DX
IRET
INTRPOC ENDP
参考资料
https://blog.csdn.net/qq_46640863/article/details/128218876
https://blog.csdn.net/qq_46640863/article/details/127933868
https://blog.csdn.net/qq_46640863/article/details/123863597
这篇关于微机原理、汇编语言与接口技术复习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!