资源描述
合肥工业大学
计算机与信息学院
课程设计
课 程:微机原理与接口技术设计
专业班级:信息安全13-1班
学 号:2013211885
姓 名:张留柱
一、设计题目及要求:
获取开关编号,并按规律显示
设计要求:
1. 拨动开关K1~K8,最右边的数码管显示对应的开关编号1~8。
2. 按“1”键,当前显示的开关编号从右至左按1秒间隔逐位循环显示(每次只显示一
个数码管)。
3. 按“2”键,当前显示的开关编号从右至左按2秒间隔逐位循环显示(每次只显示一
个数码管)。
4. 按“E”键,停止循环显示,并清除所有数码管的显示内容。
二、设计思想:
8255 并行口实验(二):PA 口控制 PB 口;选择方式0
8255A芯片简介 8255A可编程外围接口芯片是Intel公司生产的通用并行接口芯片,它具有A、B、C三个并行接口,用+5V电源供电,能在以下三种方式下工作:
方式0:基本输入/输出方式
方式1:选通输入/输出方式
方式2:双向选通工作方式
代码段:
MOV DX,PCTL
MOV AL,90H
OUT DX,A
设置8255控制字 10010000
方式0 A口输入
方式0( 基本输入/ 输出方式) 的功能
– 8255A 相当于三个独立的8 位数据口:A 、B 、C。
或看作
。
或看作4 个独立的数据端口:A 、B 、C 高、C 低。
– 各端口既可设置为 输入 口,也可设置为 输出 口。
• 但不能同时实现输入及输出。
• 16 种不同的输入输出组合。
– 设置为 输出 口时有 锁存能力,设置为输入口时无锁
存能力。
定时/计数器:8253 方波;
8253芯片介绍
8253是一种可编程定/计数器,有三个十六位计数器,其计数频率范围为0~2MHZ,用+5V单电源供电。
8253的六种工作方式:
⑴方式0:计数结束中断 ⑷方式3:方波频率发生器
⑵方式1:可编程频率发生 ⑸方式4:软件触发的选通信号
⑶方式2:频率发生器 ⑹方式5:硬件触发的选通信号
8253的0号通道工作在方式3,产生方波
代码段;8253初始化程序 ----------------------------------------------------------
FOR8253:
CLI
MOV DX,Port53_0 ;接y2 A4A3A2 = 010(11)
MOV AL,36H ;计数器0 先低后高 方式三 二进制
OUT DX,AL
MOV DX,Port53_1
mov ax,DELAYTIME ;初始值*2的7+1次方 = 4.91MHz * 1S
OUT DX,AL
MOV AL,AH
OUT DX,AL
STI
Ret
根据机器的时钟频率 连线接的是T7分频 所以算出初始值DELAYTIME
8259 单级中断控制器实验;]
硬件方面
– 只需要单一的+5V电源。
– 具有 8级 中断优先控制,通过级联可以扩展至 64级
优先级控制。
– 在中断响应周期,可以自动提供相应的中断类型号。
• 软件方面
– 每一级中断都可以通过编程设置为允许或屏蔽。
– 可通过编程选择8259A的工作方式和设定中断类型
号
可通过编程选择8259A的工作方式和设定中断类型
号
ICW1 : 00010011 即为13H设置边沿触发单片8259无需级联
ICW2: 00001000 设置IRQ0中断号
ICW4 : 00000001 09h 缓冲 01h非缓冲
OCW1 : 11111110 开放IPQ0中断
中断子程序为本设计的核心程序,主程序只是一直在循环读键盘。中断程序的显示是默认设置的1S一次移位 并且为LED显示设置了一个延时的小程序这是为了避免 中断显示时 与读键盘的LED管的地址相同而有冲突
代码段;8259初始化子程序--------------------------------------------------------------
FOR8259:
MOV AL,13H ;13h 边沿触发 1Bh电平触发 icw1
MOV DX,Port0 ;接y0
OUT DX,AL
MOV AL,08H ;IRQ0的中断号 icw2
MOV DX,Port1
OUT DX,AL
MOV AL,01H ;icw4 09h 缓冲 01h非缓冲
OUT DX,AL
MOV AL,0FEH ;IRQ0 ocw1屏蔽字
OUT DX,AL
RET
中断程序
;中断子程序,左移显示位--------------------------------------------------------
CHANGEBIT:
CLI
PUSH AX
PUSH BX
PUSH DX
PUSHF
MOV DX,ZWK ;显示位
MOV AL,DISPLAYBIT
OUT DX,AL
MOV AL,SWITCH
MOV DX,ZXK ;显示数
OUT DX,AL
MOV BL,DISPLAYBIT;
ROL BL,01H;
CMP BL,20H
JBE SETBIT
MOV BL,01H
SETBIT: MOV DISPLAYBIT,BL;
CALL Delay
mov al,20h
mov dx,port0
out dx,al
POPF
POP DX
POP BX
POP AX
STI
iret
Delay: ;延时子程序
push cx
mov cx,0FFEEH
loop $
pop cx
Ret
键盘扫描显示实验。
利用实验系统提供的键盘扫描电路和显示电路,做一个扫描键盘和数码显示实验,把按键输入的键码在六位数码管上显示出来。
读键子程序--------------------------------------------------------------------
GetKey: ;键扫子程序
mov al,0ffh ;关显示口(影响键盘读入)
mov dx,ZXK ;键盘扫描和数码管显示存在共用端口的情况
out dx,al ;(按键直接显示在数码管上)
mov bl,0
mov ah,0feh
mov cx,8
key1: mov al,ah
mov dx,ZWK
out dx,al
shl al,1
mov ah,al
nop
nop
nop
nop
nop
nop
mov dx,IN_KEY
in al,dx
not al
nop
nop
and al,0fh
jnz key2
inc bl
loop key1
nkey: mov al,20h
ret
key2: test al,1
je key3
mov al,0
jmp key6
key3: test al,2
je key4
mov al,8
jmp key6
key4: test al,4
je key5
mov al,10h
jmp key6
key5: test al,8
je nkey
mov al,18h
key6: add al,bl
cmp al,10h
jnc fkey
mov bx,offset KeyTable
xlat
fkey: ret
设计总思想
主程序一直在循环着度键盘的操作而中断则一直以1S的间隔来循环LED显示
并且对输入的键盘值进行判断,而实现实验要求
代码段
;循环读取键盘输入并控制程序跳转------------------------------------
READINPUT:
CALL GetKey
and al,0fh ;显示键码
CMP AL,0EH
JZ EXIT
CMP AL,01H
JNZ EQU02
MOV WORD PTR DELAYTIME,4e20H
JMP SET8253
EQU02: CMP AL,02H
JNZ READINPUT
MOV WORD PTR DELAYTIME,9c40H
SET8253:CALL FOR8253
JMP READINPUT
;按“E”键,清屏,程序返回到开始位置,等待开关输入----------------------------
EXIT: CLI
MOV DX,ZWK ;显示位
MOV AL,00H
OUT DX,AL
JMP READSWT
附带为了防止按了多个开关。而对开关设置了优先级判断、仅最高的开关有效 ......
SWITCHINPUT:
MOV DX,PA
IN AL,DX
WRITINPUT:
CMP AL,00H
JZ SWITCHINPUT
MOV BL,00H
SWITCHFILTER:
INC BL
.....
三、 功能流程图:
四、 结果讨论:
实验的结果基本达到了实验的要求,因为在中断里设置了一个显示的延时程序(为了读取键值,不然读取不了输入的按键),所以导致时间间隔比要求的1S 2S略微的长了一点,其它的要求都可满足。
这样的实践活动,刚拿到试验箱时,人都是无从下手,但是只要慢慢的静下来,一步步的查资料咨询,就不会有什么难事的
附录:实验代码:(完整的源程序)
-----------8255A并行口实验(2) PA输入,PB输出-------------
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE
;常量---------------------------------------------------------------------------
Port0 EQU 0FFE0H ;;A4A3A2 = 000(00)
Port1 EQU 0FFE1H
Port53_0 EQU 0FFEBH ;A4A3A2 = 010(11)
Port53_1 EQU 0FFE8H
PA EQU 0FFD8H
PB EQU 0FFD9H
PC EQU 0FFDAH
PCTL EQU 0FFDBH
IN_KEY EQU 0FFDEh ;键盘读入口
ZXK EQU 0FFDCH ;控制数码管显示值
ZWK EQU 0FFDDH ;控制数码管是否显示
;程序段-------------------------------------------------------------------------
ORG 1000H
START:
cli
MOV AX,OFFSET CHANGEBIT ;设置中断向量
MOV BX,0020H
MOV [BX],AX
MOV BX,0022H
MOV AX,0000H
MOV [BX],AX
MOV DX,PCTL
MOV AL,90H
OUT DX,AL
;初始化以及等待开关输入---------------------------------------------------------
READSWT:CALL SWITCHINPUT
CALL FOR8259
CALL FOR8253
STI
;循环读取键盘输入并控制程序跳转------------------------------------
READINPUT:
CALL GetKey
and al,0fh ;显示键码
CMP AL,0EH
JZ EXIT
CMP AL,01H
JNZ EQU02
MOV WORD PTR DELAYTIME,4e20H
JMP SET8253
EQU02: CMP AL,02H
JNZ READINPUT
MOV WORD PTR DELAYTIME,9c40H
SET8253:CALL FOR8253
JMP READINPUT
;按“E”键,清屏,程序返回到开始位置,等待开关输入----------------------------
EXIT: CLI
MOV DX,ZWK ;显示位
MOV AL,00H
OUT DX,AL
JMP READSWT
;读键子程序--------------------------------------------------------------------
GetKey: ;键扫子程序
mov al,0ffh ;关显示口(影响键盘读入)
mov dx,ZXK ;键盘扫描和数码管显示存在共用端口的情况
out dx,al ;(按键直接显示在数码管上)
mov bl,0
mov ah,0feh
mov cx,8
key1: mov al,ah
mov dx,ZWK
out dx,al
shl al,1
mov ah,al
nop
nop
nop
nop
nop
nop
mov dx,IN_KEY
in al,dx
not al
nop
nop
and al,0fh
jnz key2
inc bl
loop key1
nkey: mov al,20h
ret
key2: test al,1
je key3
mov al,0
jmp key6
key3: test al,2
je key4
mov al,8
jmp key6
key4: test al,4
je key5
mov al,10h
jmp key6
key5: test al,8
je nkey
mov al,18h
key6: add al,bl
cmp al,10h
jnc fkey
mov bx,offset KeyTable
xlat
fkey: ret
;开关输入子程序,无输入--等待;有输入--读取最高位------------------------------
SWITCHINPUT:
MOV DX,PA
IN AL,DX
WRITINPUT:
CMP AL,00H
JZ SWITCHINPUT
MOV BL,00H
SWITCHFILTER:
INC BL
SHR AL,1
JNZ SWITCHFILTER
MOV AL,BL
MOV BX,OFFSET LEDMAP;
MOV AH,00h;
MOV SI,AX;
MOV BL,[BX+SI];
MOV SWITCH,BL
MOV DISPLAYBIT,01H ;显示位初始化
MOV WORD PTR DELAYTIME,4e20H ;显示速度初始化
RET
;中断子程序,左移显示位--------------------------------------------------------
CHANGEBIT:
CLI
PUSH AX
PUSH BX
PUSH DX
PUSHF
MOV DX,ZWK ;显示位
MOV AL,DISPLAYBIT
OUT DX,AL
MOV AL,SWITCH
MOV DX,ZXK ;显示数
OUT DX,AL
MOV BL,DISPLAYBIT;
ROL BL,01H;
CMP BL,20H
JBE SETBIT
MOV BL,01H
SETBIT: MOV DISPLAYBIT,BL;
CALL Delay
mov al,20h
mov dx,port0
out dx,al
POPF
POP DX
POP BX
POP AX
STI
iret
Delay: ;延时子程序
push cx
mov cx,0FFEEH
loop $
pop cx
ret
;8253初始化程序 ----------------------------------------------------------
FOR8253:
CLI
MOV DX,Port53_0 ;接y2 A4A3A2 = 010(11)
MOV AL,36H ;计数器0 先低后高 方式三 二进制
OUT DX,AL
MOV DX,Port53_1
mov ax,DELAYTIME ;初始值*2的7+1次方 = 4.91MHz * 1S
OUT DX,AL
MOV AL,AH
OUT DX,AL
STI
ret
;8259初始化子程序--------------------------------------------------------------
FOR8259:
MOV AL,13H ;13h 边沿触发 1Bh电平触发 icw1
MOV DX,Port0 ;接y0
OUT DX,AL
MOV AL,08H ;IRQ0的中断号 icw2
MOV DX,Port1
OUT DX,AL
MOV AL,01H ;icw4 09h 缓冲 01h非缓冲
OUT DX,AL
MOV AL,0FEH ;IRQ0 ocw1屏蔽字
OUT DX,AL
RET
ENDPR:
;程序数据区-------------------------------------------------------------------
ORG 2000H
LEDMAP:
db 0c0h,0f9h,0a4h,0b0h,099h,092h,082h,0f8h
db 080h,090h,088h,083h,0c6h,0a1h,086h,08eh,0ffh
KeyTable: ;键码定义
db 07h,04h,08h,05h,09h,06h,0ah,0bh
db 01h,00h,02h,0fh,03h,0eh,0ch,0dh
DELAYTIME DW 4e20H; 1s 4e20 2s 9c40
DISPLAYBIT DB 01H
SWITCH DB 00H
CODE ENDS
END START
展开阅读全文