微机原理与接口技术课程设计倒计时Word格式.docx
《微机原理与接口技术课程设计倒计时Word格式.docx》由会员分享,可在线阅读,更多相关《微机原理与接口技术课程设计倒计时Word格式.docx(21页珍藏版)》请在冰豆网上搜索。
PA7-PA0:
A端口的输入/输出引脚;
PB7-PB0:
B端口的输入/输出引脚;
PC7-PC0:
C端口的输入/输出引脚;
2)与CPU相连的引脚
RESET:
复位信号,低电平有效。
当RESET信号来到时,所有内部寄存器都被清0,同时3个端口被自动设为输入端口;
D7-D0:
8255A的数据线,和系统数据总线相连;
CS:
芯片选择信号。
只有当CS有效时,读出信号RD和写入信号WR才对8255A有效;
RD:
读出信号。
CPU通过IN指令使RD有效,将数据或状态信息从8255A中读到CPU;
WR:
写入信号。
CPU通过OUT指令使WR有效,将数据或状态信息从CPU中写道8255A;
A1,A0:
端口选择信号。
8255A内部有3个数据端口和1个控制端口,共4个端口。
规定A1,A0为00、01、10和11时,分别选中端口A、端口B、端口C和控制端口。
(3)8255A的控制字
1)8255A的方式控制字
8255A共有两个控制字,即工作方式控制字和对C口置位/复位控制字。
8255A的工作方式字格式和各位的含义如图4
图48255A工作方式控制字格式
方式0为基本的输入输出方式;
方式1为选通式输入/输出;
方式3为双向选通输入/输出方式。
2)C口置位/复位控制字
8255A的C口置位/复位控制字的格式如图5
图58255A的C口置位/复位控制字
八段共阴数码管
一般8段LED显示器的内部结构和引脚如图6(a)所示。
每段都是一个发光二极管,通过点亮不同的字段,可以显示0,1,…,9和A,B,…F。
其内部各发光二极管之间的连接方法有共阴极和共阳极两种,如图6(b)和图6(c)所示。
(a)结构和引脚(b)共阴极接法(c)共阳极接法
图6八段LED显示器
(1)共阴极接法:
把发光二极管的阴极连在一起构成公共阴极。
使用时公共阴极接地,这样阳极端输入高电平的段发光二极管就导通点亮,而输入低电平的则不点亮。
实验中使用的数码管为共阴极接法;
(2)共阳极接法:
把发光二极管的阳极连在一起构成公共阳极。
使用时公共阳极
接+5V。
这样阴极端输入低电平的段发光二极管就导通点亮,而输入高电平的则不点亮。
表18段LED显示字形段码
字型
共阴极字形代码
3FH
6
7DH
C
39H
1
06H
7
07H
D
5EH
2
5BH
8
7FH
E
79H
3
4FH
9
6FH
F
71H
4
66H
A
77H
灭
00H
5
6DH
B
7CH
4.功能电路
数码管显示电路
图7显示连接电路
实验箱上有四个LED显示器,本实验利用PC口的最高两位选中X4和X3两个数码管,即进行位锁存;
八段数码管为阳极LED器件。
要让A段点亮,要求PB0输出高电平“1”;
要使B段熄灭,要求从PB1输出低电平“0”。
其余各段以此类推。
要使LED上显示0-9十个数字,需要按照如下段码表来驱动数码管的八段LED:
表28段数码管段码表
显示字符
八段代码
开关与LED灯控制电路
图8开关与LED灯控制电路
设置8255的A端口工作在方式0下,作为输出端,电路连接如上图,在倒计时到0的时候LED灯从左到右接着再从右往左依次点亮,实现跑马灯功能。
开关K1为复位开关,在倒计时过程中置K1为“1”可以实现退出当前倒计时,置K1为“0”时又开始重新倒计时。
开关K0为暂停开关,在倒计时过程中置K0为“1”可以暂停倒计时,置K0为“0”时,数码管接着当前的显示数据执行递减,并且在暂停过程中数码管始终显示暂停时的数据。
三.程序模块及流程图
1.8255A初始化
程序开始时对8255A进行初始化,A组和B组控制工作在方式0,因此方式字中的D6D5和D2为0。
A口为输出,因此D4为0;
C口高4位为输出,因此D3为0,低4位为输入,因此D0为1;
B口为输出,因此D1为0。
根据程序设计要求,8255A的方式控制字为10000001B,即81H。
2.显示程序模块
根据方式控制字和连线可知,B口连接数码管的A~Dp进行段锁存,C口的高4位连接X4~X1进行位锁存。
显示程序如下:
DISPROCNEAR;
数码管显示子程序
PUSHAX;
保护现场
PUSHDX
MOVSI,3000H;
找到存数的缓冲区
MOVAL,0BFH;
10111111B,选中X3数码管
MOVDX,MY8255_C;
选中PC口,进而选中数码管
OUTDX,AL
MOVAL,[SI];
取出缓冲区中存放的键值
XLAT
;
查表指令,将以BX为基地址,AL为位移量的字节存储单元中的数赋给AL
MOVDX,MY8255_B;
写入数码管A~Dp
OUTDX,AL
CALLDALLY1;
调用延时函数
MOVAL,7FH;
01111111B,选中X4数码管
MOVAL,[SI+1];
XLAT
CALLDALLY1;
POPAX
POPDX
DISENDP
3.延时程序模块
控制一个循环程序循环N次以到达延时的目的。
具体语句如下:
DALLY:
PUSHCX;
PUSHAX
MOVCX,0FFFFH
A1:
MOVAX,4FFFH
A2:
DECAX;
自减
JNZA2
LOOPA1;
计数循环
POPAX
POPCX
RET
程序循环次数为N=(FFFF+1)*(4FFF+1),延时时间为N*n(n为程序语句执行时间)
4.控制程序模块
控制程序有暂停和复位,其中暂停可以用一个循环程序来实现,当暂停键拨下时,循环程序会进入死循环状态,直至暂停键拨回。
复位则只需按条件跳转至输入初始时间的程序语句处即可。
C口低4位为输入,读入开关状态,判断“0”和“1”状态进行控制。
程序代码如下:
PAUSE:
CALLDIS;
调用显示子程序
MOVDX,MY8255_C;
C口低4位为输入
INAL,DX;
读入C口的最低位的状态
TESTAL,01H;
00000001B
JNZPAUSE;
最低位为1暂停倒计时
RESET1:
MOVDX,MY8255_C;
C口低4位为输入
INAL,DX
TESTAL,02H;
00000010B
JNZRESET2;
第2位置1后执行RESET2
DECTIME;
减1倒计时
MOVCL,TIME
CMPCL,0FFH
当从初始值减到0后继续减1则值为0FFH,说明计数结束
JNZDISPY;
倒计时未到0,继续倒计时
JMPOUTPUT1;
跳到流水灯点亮
重新开始倒计时
RESET2:
JMPSHURU
5.LED灯点亮程序模块
当程序运行至倒计时结束的语句时启动点亮LED灯程序。
A口连接LED显示单元的D15~D8,通过A口送入的数据控制LED灯的点亮情况。
OUTPUT1:
点亮流水灯,流水灯0灭1亮
MOVCX,7;
循环计数初值
MOVLA,80H;
流水灯从左往右依次点亮
P4:
MOVAL,LA
MOVDX,MY8255_A
OUTDX,AL;
通过A口输出控制LED点亮
CALLDALLY
RORAL,1;
不进位的循环右移
MOVLA,AL
LOOPP4
MOVCX,8
MOVLB,01H;
流水灯从右往左依次点亮
P5:
MOVAL,LB
ROLAL,1;
不进位的循环左移
MOVLB,AL
LOOPP5
JMPprompt;
流水灯显示结束跳转到prompt
四.源程序
利用8255A设计倒计时,其中A端口连接LED显示单元的D8~D15,B口连接数码管的A~Dp,
进行段锁存,C口高4位连接数码管的X4~X1,进行位锁存,C口的低4位作为输入端,连
接开关的K3~K0,其他引脚与系统总线相连
***************根据CHECK配置信息修改下列符号值*******************
IOY0EQU9C00H;
PCI卡中断控制寄存器地址
*****************************************************************
MY8255_AEQUIOY0+00H*4;
8255计数器0端口地址
MY8255_BEQUIOY0+01H*4;
8255计数器1端口地址
MY8255_CEQUIOY0+02H*4;
8255计数器2端口地址
MY8255_MODEEQUIOY0+03H*4;
8255控制寄存器端口地址
DATASEGMENT
DTABLEDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;
对应0~9
TIMEDB;
存储倒计时的初始时间
CHUDB10;
存储被除数10
LADB;
存储数码管从左往右亮的数值
LBDB;
存储数码管从右往左亮的数值
BUFDB;
存储输入的十位数
TISHIDB13,10,"
Inputthetime:
"
"
$"
TIMESUPDB13,10,"
Timesup!
STRMSGDB13,10,"
press[r]torestart,[e]toexit:
ENDMSGDB13,10,"
Thanksforusing!
DATAENDS
STACK1SEGMENTSTACK
DW256DUP()
STACK1ENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK1
START:
MOVAX,DATA
MOVDS,AX;
装载数据段
MOVDX,MY8255_MODE;
初始化8255
MOVAL,81H
置8255的C口PC0~PC3输入开关状态,PC4~PC7进行数码管的位锁存B
口的PB0~PB7进行数码管的段锁存,A口的PA0~PA7控制流水灯的点亮
SHURU:
LEADX,TISHI;
给出输入时间提示
MOVAH,09H
INT21H;
显示输入倒计时时间的提示
MOVAH,01H
输入第1个数作为十位数
SUBAL,30H;
将AL的ASCLL减30H变为十进制的值
MOVCL,10
MULCL;
将操作数10和AL相乘结果存入AX中
MOVBUF,AL;
把十位数存入BUF中
MOVAH,01H;
输入第2个数作为个位数
INT21H
将AL的ASCII减30H变为十进制的值
ADDAL,BUF;
将两数相加作为倒计时的开始时间
MOVTIME,AL;
将数给TIME
DISPY:
MOVBX,OFFSETDTABLE;
取DTABLE的偏移值
MOVAL,TIME;
初值给AL
CBW;
将AX的高8位置0
MOVCL,CHU;
除数10给CL
DIVCL;
商/十位数存入AL,余数/个位数存入AH
MOVSI,3000H;
定义一个缓冲区
MOV[SI],AL;
商/十位数存入[SI],X3中
MOV[SI+1],AH;
余数/个位数存入[SI+1],X4中
PUSHAX;
PUSHCX
MOVCX,1FFFH;
通过延时不断刷新数码管
C1:
MOVAX,0FFFH
C2:
DECAX
CALLDIS;
JNZC2
LOOPC1;
通过循环调用不断刷新数码管显示
POPCX
POPAX;
弹出现场
CALLDIS;
INAL,DX;
TESTAL,01H;
JNZPAUSE;
INAL,DX
TESTAL,02H;
00000010B
JNZRESET2;
DECTIME;
MOVCL,TIME
CMPCL,0FFH;
当从初始值减到0后减1则值为0FFH,计数结束
JNZDISPY;
JMPOUTPUT1;
JMPSHURU;
重新开始倒计时
PUSHCX;
MOVCX,7;
MOVLA,80H;
OUTDX,AL;
RORAL,1;
MOVLB,01H;
ROLAL,1;
LOOPP5
JMPprompt;
流水灯点亮延时函数
DECAX
LOOPA1
DISPROCNEAR;
找到存数的缓冲区
MOVAL,0BFH;
XLAT
MOVAL,7FH;
MOVAL,[SI+1];
XLAT
DALLY1PROCNEAR;
数码管显示延时函数
PUSHAX
MOVCX,0FFH
C3:
MOVAX,0FFH
C4:
JNZC4
LOOPC3
POPAX
RET
DALLY1ENDP
prompt:
LEADX,TIMESUP;
将TIMESUP字符串输出
CALLPUTS
LEADX,STRMSG;
将STR字符串输出
CALLPUTS
P3:
MOVAH,1
键盘输入单个字符,AL=输入字符的ASCII码
CMPAL,72H;
测试按下的键为‘r’重新开始
JZP1
CMPAL,65H;
测试按下的键为‘e’退出
JZP2
JMPP3;
不处理其他按键的输入
P1:
JMPRESET2;
重新开始
P2:
LEADX,ENDMSG
MOVAH,4CH;
退出程序
PUTS:
MOVAH,9
进行字符串显示
RET
CODEENDS;
程序结束
ENDSTART
五.实验结果
图8课设平台
图9系统连线
图10数码管显示图11LED灯点亮显示
图12PC显示屏提示显示
六.总结
通过本次微机接口课程设计,让我对微机原理与接口技术和汇编语言的了解更加深刻。
我和我的组员王乐在TD-PIT+实验系统和PC机平台上利用并行接口8255A、键盘及数码管显示单元、开关及LED显示单元、键盘按键和电脑显示屏设计成一个倒计时器,最终很完美地实现了所有基本功能和扩展功能,感觉很有自豪感。
在这次课设中,我学到了很多,包括书本上的和书本外平时易忽视的东西。
一方面锻炼了我的动手能力,一方面提升了我的分析问题和解决问题的能力,还有就是团队合作精神。
在这过程中,我们遇到了很多问题,最突出的就是数码管显示问题,我们一起讨论研究并询问老师,最终都很完美地解决了所有问题,设计出了一个多功能的倒计时器。
感谢XXX老师的细心指导,感谢我的组员XX,最后感谢学校给我们提供这么好的学习平台。
附录1:
系统硬件框架
附录2:
系统总程序流程图
附录3:
8086/88计算机主板图