1、 合肥工业大学 计算机与信息学院 课程设计 课 程:微机原理与接口技术设计 专业班级:信息安全13-1班 学 号:2013211885 姓 名:张留柱 一、设计题目及要求: 获取开关编号,并按规律显示 设计要求: 1. 拨动开关K1~K8,最右边的数码管显示对应的开关编号1~8。 2. 按“1”键,当前显示的开关编号从右至左按1秒间隔逐位循环显示(每次只显示一 个数码管)。 3. 按“2”键,当前显示的开关编号从右至左按2秒间隔逐位循环显示(每次只显示一 个数码管)。 4. 按“E”键
2、停止循环显示,并清除所有数码管的显示内容。 二、设计思想: 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
3、 A口输入 方式0( 基本输入/ 输出方式) 的功能 – 8255A 相当于三个独立的8 位数据口:A 、B 、C。 或看作 。 或看作4 个独立的数据端口:A 、B 、C 高、C 低。 – 各端口既可设置为 输入 口,也可设置为 输出 口。 • 但不能同时实现输入及输出。 • 16 种不同的输入输出组合。 – 设置为 输出 口时有 锁存能力,设置为输入口时无锁 存能力。 定时/计数器:8253 方波; 8253芯片介绍 8253是一种可编程定/计数器,有三个十六位计数器,其计数频率范围为0~2MHZ,用+5V单电源供电。 8253的六种
4、工作方式: ⑴方式0:计数结束中断 ⑷方式3:方波频率发生器 ⑵方式1:可编程频率发生 ⑸方式4:软件触发的选通信号 ⑶方式2:频率发生器 ⑹方式5:硬件触发的选通信号 8253的0号通道工作在方式3,产生方波 代码段;8253初始化程序 ---------------------------------------------------------- FOR8253: CLI MOV DX,Port53_0 ;接y2 A4A3A2 = 010(11) MOV AL,36H ;计数器
5、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级 中断优先控制,通过级联可以扩展
6、至 64级 优先级控制。 – 在中断响应周期,可以自动提供相应的中断类型号。 • 软件方面 – 每一级中断都可以通过编程设置为允许或屏蔽。 – 可通过编程选择8259A的工作方式和设定中断类型 号 可通过编程选择8259A的工作方式和设定中断类型 号 ICW1 : 00010011 即为13H设置边沿触发单片8259无需级联 ICW2: 00001000 设置IRQ0中断号 ICW4 : 00000001
7、 09h 缓冲 01h非缓冲 OCW1 : 11111110 开放IPQ0中断 中断子程序为本设计的核心程序,主程序只是一直在循环读键盘。中断程序的显示是默认设置的1S一次移位 并且为LED显示设置了一个延时的小程序这是为了避免 中断显示时 与读键盘的LED管的地址相同而有冲突 代码段;8259初始化子程序-------------------------------------------------------------- FOR8259: MOV AL,13H ;13h 边沿触发 1Bh电平触发
8、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 中断程序
9、 ;中断子程序,左移显示位-------------------------------------------------------- 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 D
10、X,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
11、 iret Delay: ;延时子程序 push cx mov cx,0FFEEH loop $ pop cx Ret 键盘扫描显示实验。 利用实验系统提供的键盘扫描电路和显示电路,做一个扫描键盘和数码显示实验,把按键输入的键码在六位数码管上显示出来。 读键子程序-------------------------------------------------------------------- GetKey:
12、 ;键扫子程序 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
13、 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
14、 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
15、 key6: add al,bl cmp al,10h jnc fkey mov bx,offset KeyTable xlat fkey: ret 设计总思想 主程序一直在循环着度键盘的操作而中断则一直以1S的间隔来循环LED显示 并且对输入的键盘值进行判断,而实现实验要求 代码段 ;循环读取键盘输入并控制程序跳转------------------------------------ READINPUT: CALL GetKey and al,0fh
16、 ;显示键码 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 ;
17、按“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 SWITC
18、HINPUT MOV BL,00H SWITCHFILTER: INC BL ..... 三、 功能流程图: 四、 结果讨论: 实验的结果基本达到了实验的要求,因为在中断里设置了一个显示的延时程序(为了读取键值,不然读取不了输入的按键),所以导致时间间隔比要求的1S 2S略微的长了一点,其它的要求都可满足。 这样的实践活动,刚拿到试验箱时,人都是无从下手,但是只要慢慢的静下来,一步步的查资料咨询,就不会有什么难事的 附录:实验代码:(完整的源程序) -----
19、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 0FFE8
20、H 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,
21、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 C
22、ALL 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
23、 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
24、 JMP READSWT ;读键子程序-------------------------------------------------------------------- GetKey: ;键扫子程序 mov al,0ffh ;关显示口(影响键盘读入) mov dx,ZXK ;键盘扫描和数码管显示存在共用端口的情况 out dx,al ;(按键直接显示在数码管上) mov bl,0
25、 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
26、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 k
27、ey5 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:
28、 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
29、]; MOV SWITCH,BL MOV DISPLAYBIT,01H ;显示位初始化 MOV WORD PTR DELAYTIME,4e20H ;显示速度初始化 RET ;中断子程序,左移显示位-------------------------------------------------------- CHANGEBIT: CLI PUSH AX PUSH BX PUSH DX PUSHF
30、 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
31、 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初始化程序 --------
32、 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 M
33、OV 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
34、 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:
35、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






