东北大学接口技术课设.docx
《东北大学接口技术课设.docx》由会员分享,可在线阅读,更多相关《东北大学接口技术课设.docx(17页珍藏版)》请在冰豆网上搜索。
东北大学接口技术课设
接口技术课程设计
------------数字钟
计算机1307
陈天浩
20134003
1、外观描述
数字钟的输出用到6个7段数码管,显示时采用十进制。
它们分别表示:
小时的高位,小时的低位,分钟的高位,分钟的低位,秒的高位,秒的低位。
如下图表示12:
34:
58.
数字钟的输入有两个按钮:
调时按钮和调分按钮。
每当按下一次调时按钮,时间前进一个小时;每当按下一次调分按钮,时间前进一分钟。
由于秒差异不大,所以不设置调秒按钮了。
当数字钟一上电时,显示00:
00:
00.然后就开始计时了。
在计时过程中,可以随时按下调时按钮和调分按钮来调整当前时间。
当计数到23:
59:
59时,数字钟变为00:
00:
00。
2、内部总体结构
数字钟有三个模块,模块功能及主要芯片如下所示:
1.调时按钮和调分按钮======>8259中断控制器
2.电子计数======>8253定时/计数器
3.显示系统======>8255并行传输芯片及6个七段数码管
整个系统采用中断控制方式,没有采用程序查询方式。
中断共有3种:
1、调时中断====>调时子程序=====>小时
2、调分中断====>调分子程序=====>分钟
3、8253计数中断===>调秒子程序=====>秒
采用中断方式来实现使得本系统结构清晰简练,模块之间划分明确,主程序显得凝练、短小。
同时系统很容易进行扩充,比如还可以添加一个复位中断,作为8259的第四个中断,每当按下复位中断,数字钟回归00:
00:
00.
三、8255并行传输芯片-------显示系统
显示系统用一片8255并行芯片和6片七段数码管组成,采用扫描显示技术。
8255工作在方式0状态,用一片8255控制6片七段数码管,8255的A端口作为数据总线,8255的B端口作为地址总线。
A端口控制应该显示多少,书上说“段码”,其实就相当于数据总线;B端口控制让这几片中的那一片显示,书上说“位码”,其实就相当于地址总线,也可以说是片选信号。
本系统在端口配置上进行如下处理。
比如:
OUT8255PortA,AL
表示将AL中的内容输出到8255的A端口。
8255PortA是在DSEG中定义的全局变量。
这样做可读性很好。
Display函数的作用就是显示某一位上的数字。
在上面的代码中用到了几个全局变量:
Table表示的是将一位十进制数字转化为7位二进制,从而使得这7位分别控制七段数码管上7个管的亮灭。
Which实际上相当于参数传递,要显示哪一个,就写在which里面。
如上面代码所示:
time从低位到高位依次是:
秒低位、秒高位、分低位、分高位、时低位、时高位。
四、8253计数/计时芯片--------计时电路
在本系统中,采用了可编程定时计数器8253产生1hz的秒信号来驱动时间的流逝,每隔1秒钟产生一个中断信号,调用中断程序来改变内存中的时间数值。
8253通道0输入2MHz的频率,计数值为50000(最大计数值是65536)。
实际上是50000个一循环,所以输出频率是
2MHz/50000=40Hz
再把这40Hz的频率输出到通道1的输入端口,通道1的计数值为40,这样一来通道1的输出就是1Hz。
把这1Hz的频率输出到8259的0号中断上去,从而每1s产生一个中断,使时间过一秒。
对8253进行初始化的代码如下:
五、8259中断控制器------系统的核心部分
8259芯片十分复杂,它有2类命令字:
初始化命令字ICW共4个,操作命令字OCW共2个。
ICW1:
设置是否级联、采用电平有效还是上升沿有效;
ICW2:
设置中断向量的基地址
ICW3:
用于级联的控制
ICW4:
两个功能:
中断嵌套方式选择、中断结束方式选择。
OCW1:
中断屏蔽
OCW2:
中断结束、中断优先级设置。
本系统中的8259不需要进行级联,只在IR0上接上8253的秒++控制信号,IR1上接上调分钟按钮信号,IR2上接上调节小时按钮信号。
初始化代码如下:
6、中断向量表
中断向量表的填写是把中断事件和响应函数结合起来的重要方法。
中断向量表中有三项内容:
8253的秒中断信号调用incSECOND函数使秒增加1;分钟按钮中断信号调用函数incMINUTE使分钟增加1;小时按钮中断信号调用函数incHOUR使小时增加1.
7、incSECOND中断程序
中断程序共有三个函数:
incSECOND,incMINUTE,incHOUR。
三个函数异曲同工,下面仅讨论incSECOND,incMINUTE和incHOUR可以在源代码中查看。
如上所示,时间定义为六个部分。
秒对应time[0]和time[1],incSECOND函数所表达的其实就是下面这段话:
incMINUTE函数如下:
所不同的是,在汇编语言中需要注意保护现场、关中断开中断等操作。
8、课设总结
在这次课设中,我体会到了中断的好处:
中断能使程序更好地模块化,程序结构跟清晰。
通过对一些芯片的使用,我加深了对硬件知识的理解,也更深的理解了软件调用硬件的过程。
在做数字钟的过程中,在图书馆看了很多芯片用法的书。
其实就三种芯片重要:
8255、8253、8257.大部分关于芯片的知识是在课设中理解的,课上知识很糊涂的知道了。
纸上得来终觉浅,绝知此事要躬行。
9、源代码
DSEGSEGMENT
//端口定义
8255PortADW0000;
8255PortBDW0001;
8253Port0DW0002;
8253Port1DW0003;
8259Port0DW0004;
8259Port1DW0005;
//段码转换表,将4位二进制数转化为7位,从而控制七段数码管的7段的亮灭
//在本程序中只用到0-9
TABLEDB3FH,06H,5BH,4FH,66H
DB6DH,7DH,07H,7FH,6FH
//WHICH是一个全局变量,用于8255控制6个7段译码器中的哪一个接受数据
WHICHDW0;
//时间6个:
秒低位、秒高位、分钟低位、分钟高位、小时低位、小时高位;初始时间为00:
00:
00;
TIMEDB0,0,0,0,0,0;
DSEGENDS
CSEGSEGMENT
ASSUMECS:
CSEG
ASSUMEDS:
DSEG
MAIN:
CALLFillTable;//填写中断向量表,必须在将DSEG赋给DS之前填写中断向量表,否则DS还要变
//初始化8255并行芯片
MOVAL,10001000B
OUT8255PortA,AL
CALLINIT8259//初始化8255
CALLINIT8253//初始化8253
MOVAX,DSEG
MOVDS,AX
//显示6位时间
MOVAX,0
SHOW:
CALLDISPLAY
INCAX
CMPAX,6
JNZSHOW
MOVAX,4C00H
INT21H
CSEGENDS
ENDMAIN
DISPLAYPROC
//把要显示的数据送到8255的A端口
MOVSI,WHICH//显示6位中的哪一位
MOVAL,[SI+TIME]
MOVBX,OFFSETTABLE
XLAT
OUT8255PortA,AL
//把要显示的哪一个送到8255的B端口
MOVAL,1
MOVCX,WHICH
SHLAL,CL
OUT8255PortB,AL
RET
DISPLAYENDP
FillTablePROC
MOVAX,0
MOVDS,AX
MOVSI,11111000B*4
MOV[SI],OFFSETincSECOND;
MOV[SI+2],SEGincSECOND;
MOVSI,11111001B*4
MOV[SI],OFFSETincMINUTE;
MOV[SI+2],SEGincMINUTE
MOVSI,11111010B*4
MOV[SI],OFFSETincHOUR;
MOV[SI+2],SEGincHOUR
RET
FillTableENDP
INIT8259PROC
MOVAL,13H
OUT8259Port0,AL;//设置ICW1,上升沿触发非级联方式
MOVAL,11111000B
OUT8259Port1,AL//设置ICW2,中断地址范围为F8-FF
MOVAL,01H
OUT8259Port1,AL//设置ICW3,非自动结束中断方式
MOVAL,11111000B
OUT8259Port1,AL//设置OCW1,不屏蔽0,1,2三个中断
RET
INIT8259ENDP
INIT8253PROC
MOVAL,00110000B
OUT8253Port0,AL
OUT8253Port1,AL
MOVAX,50000
OUT8253Port0,AL
MOVAX,40
OUT8253Port1,AL
RET
INIT8253ENDP
incHOURPROC
CLI
PUSHAX
PUSHBX
PUSHCX
PUSHDX
PUSHSI
PUSHDI
PUSHF
MOVAL,TIME+5
MUL10
ADDAL,TIME+4
INCAL
CMPAL,24
JNZOVER
XORAL,AL
OVER:
XORAH,AH
DIV10
MOVTIME+4,AH
MOVTIME+5,AL
MOVAX,4
MOVWHICH,AX
CALLDISPLAY
MOVAX,5
MOVWHICH,AX
CALLDISPLAY
POPF
POPDI
POPSI
POPDX
POPCX
POPBX
POPAX
SETI
IRET
incHOURENDP
incMINUTEPROC
CLI
PUSHAX
PUSHBX
PUSHCX
PUSHDX
PUSHSI
PUSHDI
PUSHF
MOVAL,TIME+3
MUL10
ADDAL,TIME+2
INCAL
CMPAL,60
JNZOVER
XORAL,AL
CALLincHOUR
OVER:
XORAH,AH
DIV10
MOVTIME+2,AH
MOVTIME+3,AL
MOVAX,2
MOVWHICH,AX
CALLDISPLAY
MOVAX,3
MOVWHICH,AX
CALLDISPLAY
POPF
POPDI
POPSI
POPDX
POPCX
POPBX
POPAX
SETI
IRET
incMINUTEENDP
incSECONDPROC
CLI
PUSHAX
PUSHBX
PUSHCX
PUSHDX
PUSHSI
PUSHDI
PUSHF
MOVAL,TIME
MUL10
ADDAL,TIME+1
INCAL
CMPAL,60
JNZOVER
XORAL,AL
CALLincMINUTE
OVER:
XORAH,AH
DIV10
MOVTIME,AH
MOVTIME+1,AL
MOVAX,0
MOVWHICH,AX
CALLDISPLAY
MOVAX,1
MOVWHICH,AX
CALLDISPLAY
POPF
POPDI
POPSI
POPDX
POPCX
POPBX
POPAX
SETI
IRET
incSECONDENDP