1、微机原理与接口技术课程设计 1目录目录目录目录1摘要摘要1关键词关键词1第一章第一章引言引言2第二章第二章 硬件系统设置硬件系统设置32.1 硬件系统原理图32.2 芯片资料介绍42.2.1 8253 芯片42.2.1.1 8253 内部计数器的 3 个引脚42.2.1.2 8253 的工作方式42.2.1.3 8253 的编程42.2.2 8255 芯片52.2.2.1 连接外设的数据端口52.2.2.2 8255 工作方式52.2.2.3 8255 的编程52.2.3 8259 芯片62.2.3.1 8259 的编程及操作方式62.2.4 74LS240 芯片 72.2.4.1 74ls2
2、40 内部结构72.2.4.2 芯片介绍72.2.5 75452 芯片72.2.5.1 75452 内部结构72.2.5.2 芯片介绍82.3 线路连线82.3.1 实验连线82.3.2 时钟脉冲的产生82.3.3 键盘的设置92.3.4 LED 显示器的设置10第三章第三章 软件系统设置软件系统设置123.1 程序流程图123.1.1 主程序流程图123.1.2 0 处理流程图(开始计时)133.1.3 1处理流程图(名次存储)133.1.4 2 处理流程图(显示成绩)143.1.53处理流程图(比赛结束 1)153.1.6 4处理流程图(比赛结束 2)15微机原理与接口技术课程设计 23.
3、1.7 中断处理流程图163.2 参数信息17第四章第四章 课程设计总结课程设计总结184.1 心得体会184.2 源程序清单194.3 参考文献25微机原理与接口技术课程设计 1摘要摘要数字式秒表是一种用于体育中田径比赛的一种计时装置。本次课程设计是做一个数字式秒表,主要是利用 8253 作为定时器,为秒表提供定时脉冲,使用 7 段码显示器作为秒表时间显示,用键盘控制秒表。数字式秒表拥有以下几点功能:1:可控制比赛的开始和结束和继续比赛;2:可记录成绩,依次排名,给予显示在第一位;3:可通过按键关闭设备关键词关键词80X86,8259 中断,8255,8253,键盘,LED 动态显示 微机原
4、理与接口技术课程设计 2第一章第一章引言引言 微型计算机的新技术、新机型,新应用层出不穷,日新月异。使得微机硬件得到飞速发展!人们对计算机计算的精度和软件的逐步更新提出更高的要求。秒表在我们的生活总运用比较广泛,从各项体育赛事,到个人手机上的倒计时器,无处不在,怎样提高其计算精度,提高运算效率成为首要因素,基于此,此次课设我们用汇编语言,利用 8086CPU 和 PCI 试验箱进行数字式秒表的制作,我们将从硬件系统设置、软件系统设置、课设总结(包括汇编源代码、硬件系统设置原理图,参考文献)几方面介绍本次课设的主要成果。此课设主要利用 8253 的定时器输出为秒表提供定时脉冲,7 段码显示器作为
5、秒表时间显示,用键盘控制秒表的工作过程。键盘控制秒表计时的开始,记录,结束,计时结束后按相应按键显示所记录的时间。计时范围为 1 分钟,满 1 分钟自动退出比赛,计时精度为 0.1 秒。第一章为引言,粗略地介绍此次课设的主要内容。第二章为硬件系统设置,在此章中从基本芯片入手,介绍 8253、8255、8259的内部结构功能、工作方式以及初始化编程和 74LS240P,75425N 的真值状态,工作环境,以便读者更容易了解此课设的基本部件,对硬件原理有逐步深入的了解。另外,从键盘和 LED 显示器的设定的原理、编程进行详细的描述。第三章为软件系统设置,在此章中我们从秒表的五大功能机制入手,软件设
6、置中,我们给出了主程序,中断程序以及各功能模块的程序流程图,使之实现一目了然。此外,还给出了参数信息,增加了汇编源代码的可读性。第四章为课程设计总结。此部分包括心得体会,附录 1(汇编源代码,)和附录2(参考文献)。在此课设中,韩雁老师在硬件的检测,软件的设置方面都给出了精心的指点,在此表示衷心的感谢!微机原理与接口技术课程设计 3第二章第二章 硬件系统设置硬件系统设置2.1 硬件系统原理图硬件系统原理图此章节主要介绍硬件系统原理图,其中键盘和显示器在后面详细介绍.数字式秒表系统构成图A4 D0 A15 D7 CPUCPU INTR -RD -WR-INTA A0 A1 D0 PA0 D7 P
7、A7 PB0 82558255 PB3-CS-RD PC0-WR A0A1 PC3D0A0A1 CLK0 OUT0D7 GATE082538253-RD-WR-CS A0 IR0 IR7 D0 82598259 D7-INTA -CSINTR地址译码器VCC1.193MHZIOY0IOY2反向驱动电 路LED显示器显示器键盘列线4*44*4 键盘键盘键盘行线75452N微机原理与接口技术课程设计 42.2 芯片资料介绍芯片资料介绍此部分从芯片的工作方式以及初始化编程方面介绍 8253、8255、8259 芯片。2.2.12.2.1 82538253 芯片芯片2.2.1.12.2.1.1 825
8、38253 内部计数器的内部计数器的 3 3 个引脚个引脚CLK(时钟)输入,在计数过程中,此引脚上每输入 1 个时钟信号(下降沿),减1 计数器的计数值将减 1GATE(门控)输入,控制计数器工作:软件触发时,作用开启/关闭计数:高电平允许,低电平禁止。硬件触发/重触发:上升沿将初值送入减 1 计数器OUT(计数器输出)输出,根据设置工作方式的不同,OUT 引脚可输出单个或连续的波形信号。一般是在计数过程结束时(计数值归 0),OUT 引脚信号发生变化。2.2.1.22.2.1.2 82538253 的工作方式的工作方式方式 0 计数结束中断方式 1 可编程单稳方式 2 连续负脉冲发生器方式
9、 3 连续方波发生器方式 4 软件触发选通方式 5 硬件触发选通本次课设中 8253 工作在方式 3,此方式为可软、硬件触发的方波发生器,N=Fclk/Tclk,在本次设计中,FclK 信号为 1.193MHZ,输出信号为 100HZ,N 为 11930。其端口地址为4043H,40H 口用于计数器 0,41H 口用于计数器 1,42H 口用于计数器 2,43H 口用于状态和控制口。2.2.1.32.2.1.3 82538253 的编程的编程8253 加电后的工作方式不确定,必须经初始化编程后,才能正常工作初始化编程:先写入控制字再写入计数初值工作后,可随时读取计数值一般先将计数值锁存在通道内
10、的锁存器中然后可分两次读取 16 位的计数值初始化程序片段:初始化程序片段:Mov al,计数器控制字 Mov dx,控制寄存器端口 Out dx,al微机原理与接口技术课程设计 5 Mov ax,计数器初值 Mov dx,计数器端口 Out dx,al ;写计数器的初值低字节 Mov al,ah Out dx,al ;写计数器计数初值高字节2.2.22.2.2 82558255 芯片芯片2.2.2.12.2.2.1 连接外设的数据端口连接外设的数据端口端口 A:PA0-PA7(A 组控制)常作数据端口使用,功能最强大端口 B:PB0-PB7(B 组控制)常作数据端口使用端口 C:PC4-PC
11、7(A 组控制),PC0-PC3(B 组控制)可作数据、状态或控制端口使用可拆分成两个 4 位端口分别输入或输出每位可独立进行输出控制(位控制)2.2.2.22.2.2.2 82558255 工作方式工作方式方式 0:基本输入输出方式(不带联络)适用于无条件传送和查询方式的接口电路方式 1:选通输入输出方式(带输入联络或输出联络)适用于查询和中断方式的接口电路方式 2:双向选通方式(同时带输入联络和输出联络)适用于可双向传送数据的外设,适用于查询和中断方式的接口电路2.2.2.32.2.2.3 82558255 的编程的编程编程:只写 1 个方式控制字到控制口。D7:方式字/复位字选择位,1时
12、为 8255A 方式控制字,0时为 PC 口的置/复位控制字,当 D7 为1时,其余各位的含义为:D6D5:A 组选择方式选择位。00为方式 0,01为方式 1,10为方式2。D2:B 组方式选择位。0为方式 0,1为方式 1.D4、D3、D1、D0:分别为 PA 口、PC7PC4 口、PB 口、PC3PC0 口输入/输出方式选择位。0为输出,1为输入。工作过程中:通过数据端口对外设数据进行读写微机原理与接口技术课程设计 6本次课设 8255 均工作在方式 0,其把 PA 口、PB 口和 PC 口的高 4 位、低 4 位都作为基本输入/输出口,可以独立地设置为输入或输出方式。初始化程序片段:初
13、始化程序片段:Mov al,方式选择控制字 Mov dx,端口号 ;如果端口号256,所以用 dx 间接寻址 Out dx,al ;写入控制寄存器2.2.32.2.3 82598259 芯片芯片2.2.3.12.2.3.1 82598259 的编程及操作方式的编程及操作方式初始化编程在 8259 开始工作前:用户必须对 8259A 进行初始化编程。通过写入初始化命令字 ICW 对 8259A 进行初始化中断操作编程在 8259A 工作期间:可以随时向 8259A 写入操作命令字 OCW,使之按用户设置的新的工作方式进行工作,用户还可以通过写操作命令字 OCW 通知 8259A操作方式编程 OC
14、W1,其格式为:OCW1 也可称为屏蔽操作字,其被写入 8259 内部的中断屏蔽寄存器 IMR。OCW1 的 8 位与IR0IR7 相对应,当其某一位为 1 时,即相应 IR 上的输入信号被屏蔽。IMR 中的内容在任何时候都可读出或写入,只要访问奇口地址。OCW2,其用于设置中断结束方式和优先级循环方式。其格式为:OCW3,其用于设置特殊中断屏蔽方式和程序查询方式、读状态方式。其格式为:初始化程序片段:初始化程序片段:Mov al,00010101B ;ICW1,边沿触发,要 ICW4,级联要 ICW3 Out 20h,al ;写入 ICW1 Mov al,00001000B ;ICW2:设置
15、 ir0 中断类型号 Out 21h,al ;写入 ICW2 Mov al,00000101B ;ICW3:主片 8259A 的 IR2 接从片 INT微机原理与接口技术课程设计 7 Mov al,00000101B ;ICW4:不用缓冲,正常中断结束,非特殊全嵌套方式 Out 21h,al ;写入 ICW42.2.42.2.4 74ls24074ls240 芯片芯片2.2.4.12.2.4.1 74ls24074ls240 内部结构内部结构 74ls24074ls240 内部结构2.2.4.22.2.4.2 芯片介绍芯片介绍 真值表输 入输出 -G-G A A Y Y 1 1 X X Z Z
16、 0 0 1 1 0 0 0 0 0 0 1 1正常工作温度及其压值:25,5V,工作电流-15MA,24MA温度范围:-25-75,在此课设中用作反向驱动器,增大输出电流。2.2.52.2.5 7545275452 芯片芯片2.2.5.12.2.5.1 7545275452 内部结构内部结构 微机原理与接口技术课程设计 82.2.5.22.2.5.2 芯片介绍芯片介绍 真值表A AB BY Y 0 0 0 0 0 0 0 0 1 1 0 0 1 1 0 0 0 0 1 1 1 1 1 1正常工作压值范围:4.75-5.25V.工作电流 400MA,500MA正常工作温度范围:0-70,在此课
17、设中用作反向驱动器。2.3 线路连线线路连线 此部分从实验连线,时钟脉冲,键盘和 LED 显示详细介绍硬件部分的工作原理。2.3.12.3.1 实验连线实验连线8255 模块的 SWR、SRD 分别连到 ISA 总线接口模块的 IOWR、IORD。8255 模块的数据(AD0AD7)、地址线(A0A7)分别连到 ISA 总线接口模块的数据(LAD0QD7)、地址线(LA0LA7)。8255 模块选通线 CE 连到 ISA 总线接口模块的 IOY0。8255 的 PA0PA7 连到键盘显示模块的 KD0KD7;8255 的 PB0PB3 连到键盘显示模块的 KL1KL4;8255 的 PC0PC
18、3 连到键盘显示模块 KH1KH4。2.3.22.3.2 时钟脉冲的产生时钟脉冲的产生8253 的 D7到 D0接总线上,gate 端接高电平,out0接 8259 的 IR0,通过次部分可以产生100hz 的信号,具体连线如下图:IR0IR78259 D0D7-INTAINTR -CSD0 CLK0D7 OUT GATE0 8253-RD-WR-CS微机原理与接口技术课程设计 9时钟脉冲产生示意图2.3.32.3.3 键盘的设置键盘的设置键盘的接口一般分为独立式和矩阵式。独立式按键就是各按键相互独立、每个按键各接一根输入线,一根输入线上的按键是否按下不会影响其他输入线上的工作状态。因此,通过
19、检测输入线的电平状态可以很容易判断哪个按键被按下了。独立式按键电路配置灵活,软件结构简单。但每个按键需占用一根输入线,在按键数量较多时,输入口浪费大,电路结构显得很繁杂。故此种键盘适用于按键较少或操作速度较高的场合。若采用此方式,各按键开关均采用上拉电阻,这是为了保证在按键断开时,各IO 口线有确定的高电平。当然如输入口线内部已有上拉电阻,则外电路的上拉电阻可省去。矩阵式键盘适用于按键数量较多的场合,它由行线和列线组成,按键位于行、列的交叉点上,一个 4*4 的行、列结构可以构成一个含有 16 个按键的键盘。很明显,在按键数量较多的场合,矩阵键盘与独立式按键键盘相比,要节省很多的 I/O 口。
20、行、列线分别接到按键的两端。行线通过上拉电阻接到+5V 上。平时无按键时,行、列线处于高电平状态,而当有键按下时,行、列线将导通,因此行线电平状态将由与此行线相连的列线电平决定。按键的识别在此课设中采用扫描法。让所有的列线处于低电平,当有键按下时,按键所在的行电平将被拉成低电平,根据此行电平的变化,便能判定此行有键被按下。为了进一步判定到底哪一列的键被按下,可在某一时刻只让一条列线处于低电平,而其余所有列线处于高电平。键盘接线图键盘接线图键盘扫描程序:键盘扫描程序:prog:mov bl,0 ;键号的初值为 0 mov cl,0efh ;送扫描初值 mov dl,4 ;计数值为行数 frow:
21、mov al,cl ;扫描一行 mov dx,protc rcl al,1 ;修改行扫描 mov cl,al ;读列线无效,判别是否有列线为低 in al,dx and al,0fhVCC PB0 PB1 PB2 PB38255 PC0 PC1 PC2 PC3微机原理与接口技术课程设计 10 cmp al,0fh jnz fcol ;有列线为低电平,则转 fcol mov al,bl ;没有则使键号寄存器的值=键号值+列数/行数 add al,4 mov bl,al dec dl ;行未扫描完,则转 frow jnz frow jmp down ;已扫描完,则转 down fcol:or al
22、,0f0h ;此列为低电平,则转 proce rcr al,1 jnc proce inc bl ;如果未找到低电平的列线,则使键号=键号+1,转 fcol 继续 proce:;键命令处理程序 Down:.;后续处理程序 2.3.42.3.4 LEDLED 显示器的设置显示器的设置LED 是 7 段码显示,并且是共阴的,将 8255 的 PA0-PA7接到键盘显示单元的 KD0-KD7,PC0-PC3接到 KH1-KH4,通过次部分可让 LED 动态显示相应的信息。LEDLED 显示器原理图反向驱动器反向驱动电路Vcc PA0PA1PA2PA3PA4PA5PA6PA78255PC0PC1PC2
23、PC3 微机原理与接口技术课程设计 11 八位 LEDLED 显示程序:Led:mov di,offset buffdata ;指向缓冲区首地址 Mov cl,80h ;使最左边 LED 亮 Disi:mov bl,di+1 ;bl 中为要显示的数 Push bx Pop ax Mov bx,offset table ;段表首址送 bx Xlat ;段码送 al Mov dx,porta ;段码送段控端口 porta Out dx,al Mov al,cl ;位扫描码送为控端口 portb Mov dx,portb Out dx,al ;保存位扫描码 Push cx ;延时 Mov cx,30
24、h Delay:loop delay Pop cx Cmp cl,01 ;显示扫描到最右边 LED 码?Jz quit ;是,则已显示一遍,退出 Inc di ;否,则指向下一位 LED Shr cl,1 ;位码指向下一位 Jmp disi ;显示下一位 LED Quit:ret Table:db c0h,8eh ;0F 的段码Buffdata:db 8dup(?);8 个字节的缓冲区 此课设使用共阴结构,阴极控制端为低电平,数码显示短输入高电平时发亮。显示器的工作方式有静态显示和动态显示。所谓静态显示,就是当显示器显示某一个字符时,相应的二极管恒定地导通或截止。优点是显示稳定,在发光二极管导
25、通电流一定的情况下显示器的亮度大,在系统运行过程中,仅在需要更新显示内容时 CPU 才执行一次显示更新子程序,大大节省了 CPU 的时间,提高 CPU 的利用率。所谓动态显示,就是一位一位地轮流点亮各位显示器,对于每一位显示器来说,每隔一段时间点亮一次。显示器的亮度与导通电流有关,也与点亮时间和间隔时间的比例有关。调整电流和时间参数,可实现亮度较高比较稳定的显示。此课设中使用的是动态显示,8255 的 A 口作为扫描口,经反向驱动器 75452 接显示器公共极,B 口作为数据口,接到显示器的各个段。微机原理与接口技术课程设计 12第三章第三章 软件系统设置软件系统设置3.1 程序流程图程序流程
26、图此部分包括主程序,0 处理流程图,1 处理流程图,2 处理流程图,3 处理流程图,4 处理流程图,中断处理流程图以及软件设置各模块能实现的功能。3.1.13.1.1 主程序流程图主程序流程图开机初始化调用键盘初始化程序有键按下吗?转至G处理程序转至M处理程序转至A处理程序转至P处理程序转至R处理程序返回 DOSN该功能块的主要作用:清显示缓冲区,使 LED 显示灯开始显示时值全为“0”,设置标志单元的值。3.1.23.1.2 00 处理流程图(开始计时)处理流程图(开始计时)微机原理与接口技术课程设计 133.1.33.1.3 11处理流程图(名次存储)处理流程图(名次存储)N Y N Y
27、1功能块:是记录成绩,当将按下 2 键时将 LED 灯显示的时间存储起来,并将该成绩的名次存储起来。首先读标志单元,根据相应单元的值来判断是否继续执行。若可继续执行则将当前的成绩和名次存储,然后将名次变量加 1。为了判断是否记录满 8 个成绩,还需设置了一个记录标志,用于记录当前已记录了几个成绩,若记录满 8 个,则清除可存储标志位,再 0 0 0清 ms 时间常数单元、名次单元、显示记录数单元建立比赛开始和可存储标志返回可存储吗?将显示缓冲区的秒和 0.1 秒所对应的单元内容送相应记录的显示缓冲区将名次单元+1建立记录标志记录满 8 个吗?清可存储标志返回读标志寄存器微机原理与接口技术课程设
28、计 14按 1键就不能再记录数据了。3.1.43.1.4 22 处理流程图(显示成绩)处理流程图(显示成绩)NYNY2 功能块:首先读取标志单元的信息,检查其是否符合条件,若符合条件则取记录数,再将对应数据输出显示,这里要建立了一个标志单元用来记录当前以经显示过的记录数,每输出一个记录,该标志单元就加一,然后与总记录数比较,若超过总记录数则将该标志单元清零。读标志寄存器可记录吗?取记录数将相应的记录值送显示缓冲区记录数加 1记录数名次数吗?将记录数清 0返回微机原理与接口技术课程设计 153.1.53.1.533处理流程图(比赛结束处理流程图(比赛结束 1 1)中断矢量复原返回3 功能块:退出
29、返回 DOS 需要复原中断矢量,若不复原中断矢量,可能会发生不可预料的错误,8259 关中断,cpu 关中断,关闭程序。3.1.63.1.6 44处理流程图(比赛结束处理流程图(比赛结束 2 2)清比赛可存储标志返回4 功能块:1.比赛结束将标志单元的 D0 位(比赛开始/结束位)和 D2 位(可否存储成绩位)均置“0”,清空所有标志,代表比赛结束2.显示停止,并显示最后一次显示的内容。微机原理与接口技术课程设计 163.1.73.1.7 中断处理流程图中断处理流程图 NYNYNYNY 保护现场ms 时间常数加 1到 100ms 否?将 0.1 秒单元加 1满 1 秒否?将秒单元加 1,清 0
30、.1 秒单元满 10 秒否?将 10 秒单元加 1,清秒单元满 60 秒否?清 100 秒单元清比赛和可存储标志调用 4 位 LED 动态显示程序送中断结束命令恢复现场中断返回微机原理与接口技术课程设计 17中断处理程序在该设计中是很的重要的,数字式秒表时间的走动、键盘扫描过程中对按键功能的执行都要通过中断程序来实现。首先进入中断程序就要保护现场,这一点是至关重要的。若不保护 CPU 当前的执行状态,当中断程序返回时,CPU 有可能处在错误的状态。应通过一系列推入堆栈指令来保护中断时的现场。主程序的初始化中设置了中断的频率为每隔 0.01 秒发生一次,而我们要的精度是 0.1 秒。用 coun
31、t 单元来记录是否到 0.1 秒,将 count 单元的值和 10 比较,到 10 则为 0.1 秒,否则 count值加 1。秒单元值的变化与此类似,当 0.1 秒单元值为 10 时,秒低位单元的值才加 1;当秒低位单元的值为 10 时,秒高位单元值才加 1,当秒高位单元值为 6 时应清零。计时满 1 分钟时自动结束,在秒高位单元清零时还应将 D0(比赛开始/结束位)和 D2(是否可存储位)清零。3.2 参数信息参数信息inttype 定义 8 号中断p8253ctr1 定义 8253 控制口p8253ctr0 定义 8253 计数器 1 的端口p8255ct1 定义 8255 控制端口cn
32、t1定义 8253 的初值(用于产生 100HZ 的信号)display 定义显示提示信息asctab 定义一张表,用于显示键盘输入的显示count定义计数,用于 0.1 秒计一个数buff定义显示缓冲期,并给显示缓冲器定义初值为 0mc 定义一个存储空间,用于记录 8 个选手的成绩和名次bit定义位选信号desg 定义一张共阳的 LED 表flag 定义标识符 flagpoint dw str 将地址传给指针 pointmess 显示桌面微机原理与接口技术课程设计 18第四章第四章 课程设计总结课程设计总结4.1 心得体会心得体会 本次课程设计从总体上来说是对芯片 8253、8255,825
33、9 的应用。8253 用来产生产生时钟脉冲;8255 是一个并口,连接控制 LED 显示器和键盘,8259 是用来产生中断。8253 产生产生时钟脉冲,并每 0.1s 给 8259 产生一次中断,通过 CPU 产生中断响应,并扫描键盘,如果有键按下,则按照响应的情况来判断是否在中断中进行计数,如果是 0 键按下,则开始计数,计数的时候将响应的字符输到显示缓冲器,并同过 8255 并口,动态的显示在 LED上;如果是 M 键盘按下,仍旧计数,并通过一个指针将当前的数值传到 mc 相应的单元中,并进行 count 计数,判断其是否超出限制,如果超出限制则停止计数,如果没有超出限制则进行计数;如果是
34、 P 键按下,中断中跳过计数部分,并将相应要显示的内容从 mc 中输出到显示缓冲区,按照一个指针来循环显示要显示的内容;如果按下的是 4 键,则表示比赛结束,将所有的标志单元都清空,中断中也跳过计数部分,输出停留在最后显示的内容上;如果按下的是 3 键,则表示整个程序的运行结束,8259 关中断,CPU 关中断。在程序中多次用到压栈,弹出操作,目的是在中断程序执行前将所有中断程序中用到的寄存器都入栈,在中断结束之前都要将刚才入栈的寄存器出栈,在程序中多次用到延时程序,在没个高速设备相低速设备输出的时候都要进行延时,在扫描键盘中,我们在按键按下的时候和按键释放的时候都进行了延时,确保按键的有效性
35、和按键抖动的滤去。在显示单元我们用到动态显示的方法,既可以减少线路上的成本也可以提高资源的有效利用,我们将 8255 的 A 口用于显示字符,8255 的 C 口用于位选,选择哪个 LED 将显示数据。键盘单元中,我们也是使用8255 来作为控制的接口,共用了 8255 的 C 口来输出,8255 的 B 口用来读取,两个口一起工作来定位键盘上哪个键被按下。最终的课程设计能达到最初设定的目标。在课程设计前几天,我们组先用 LED 显示、键盘控制 8259A 中断三个程序对我们的仪器箱进行了初步检测。在确认无误后,对三条程序进行累加,然后对五个功能键进行分别设定,反复调试、编译、链接,在老师的精
36、心指导下完成了此次课程设计,在此再次表示衷心的感谢!微机原理与接口技术课程设计 194.2 源程序清单源程序清单inttype equ 08h ;定义 8 号中断p8253ctrl equ 43h ;定义 8253 控制口p8253cto equ 40h ;定义 8253 计数器 1 的端口 p8255ctl equ 0c803h ;定义 8255 控制端口cnto equ 11930 ;用来计算频率.model small ;定义为小模式.data ;数据段str db 36 dup(?);定义一个数组存放前八个成绩flag db 0 ;定义标志位mc db 1 ;定义存放名次num db
37、1 ;定义名次count db 0 ;定义计数,用于 0.1 秒计一个数point dw str ;定义指针point2 dw str ;定义指针buff db 0,0,0,0 ;定义显示缓冲区,用于显示键盘输入的显示buff2 db 0,0,0,0 ;定义显示缓冲区,用于显示键盘输入的显示bit db 1 ;定义位选信号mess db 0-开始比赛 1-记录成绩 2-显示成绩 3-退出返回 DOS 4-结束比赛:,0dh,0ah,$dseg db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h asctab db 0123456789ABCDEF .
38、code ;代码段 mov ax,data ;段地址初始化 mov ds,ax mov ah,9 ;9 号调用,用于显示提示信息 lea dx,mess ;将 mess 的偏移量送给 dx int 21h ;显示提示信息 mov al,36h ;写 8253 方式字 mov dx,p8253ctrl out dx,al mov ax,cnto mov dx,p8253cto ;写初值 out dx,al ;先写低位 mov al,ah out dx,al ;再写高位 mov al,81h ;8255 初始化 mov dx,p8255ctl ;将方式字输出到 8255 控制口 out dx,al
39、 mov al,inttype ;DOS 调用,读取中断向量 mov ah,35h ;es:bx=中断向量 int 21h push es push bx ;将 cpu 自己的 8 号中断向量保护 微机原理与接口技术课程设计 20 push ds mov ax,data ;初始化 mov es,ax mov dx,offset intp ;取 intp 的偏移量 mov ax,seg intp ;取 intp 的段地址 mov ds,ax mov al,inttype ;设置 inttpye 的新中断向量 mov ah,25h ;ES:BX=中断向量 int 21h pop ds ;ds 出栈
40、 in al,21h ;CPU 开中断(开 IR0)and al,0feh out 21h,al stiab:call button ;键盘调用 cmp al,3 ;判断是否按下 3 号键 jz rp ;如果是则转向 rp cmp al,1 ;判断是否按下 3 号键 jz mp ;如果是则转向 mp cmp al,4 ;判断是否按下 4 号键 jz ap ;如果是则转向 ap cmp al,2 ;判断是否按下 2 号键 jz pp ;如果是则转向 pp cmp al,2 ;判断是否按下 3 号键 jnz ab ;如果是则转向 ab OR flag,05h ;如果按键为 2,则标志位最后一位为
41、1 jmp abmp:test flag,04h ;存储代码 jz ab mov al,mc mov buff,al ;将第一位的名次先放到 buff,然后放到数组 lea si,buff mov di,point mov cx,4 cld rep movsw cmp mc,8 ;名次到了 8,标志位清 0 jz go ;转向 go 段程序 inc mc ;inc 自加 add point,4 jmp abgo:and flag,0fah lea bx,str mov point,bx微机原理与接口技术课程设计 21 jmp abpp:and flag,0feh cmp num,9 ;判断是否
42、按过 8 次,如果不是则退出 jz ab inc num lea di,buff mov si,point2 mov cx,4 cld rep movsw add point2,4 jmp abap:push bx and flag,0 ;对标志位和名次及 num 进行初始化 mov mc,1 ;名次置 1 mov num,1 ;计数置 1 lea bx,str mov point,bx mov point2,bx mov buff,0 ;将 1 位显示器缓冲器置 0 mov buff+1,0 ;将 2 位显示器缓冲器置 0 mov buff+2,0 ;将 3 位显示器缓冲器置 0 mov b
43、uff+3,0 ;将 4 位显示器缓冲器置 0 pop bx jmp abrp:cli pop dx pop ds mov al,inttype mov ah,25h int 21h ;dos 调用 mov ah,4ch ;带返回码终结程序 int 21h ;主程序结束intp:push si ;将 ax、bx、dx、si、cx 入栈,保护 cpu 现场 push di push ax push bx push cx push dx test flag,01h ;判断标志位 D0 是否为 1,为 1 则开始,否则不计数 jz iexit inc count ;次数加 1微机原理与接口技术课程设
44、计 22 cmp count,10 ;将 count 与 10 比较 jnz iexit ;若 count 不等于 10,则转 iexit mov count,0 ;否则 count 置 0 inc buff+3 ;秒的那位加 1 cmp buff+3,10 ;将秒的那位与 10 比较 jnz iexit ;若秒的那位不等于 10,则转 iexit inc buff+2 ;否则向秒的高位进 1 mov buff+3,0 ;秒位置 0 cmp buff+2,10 ;秒的高位与 10 比较 jnz iexit ;不为 10 则转 iexit inc buff+1 ;否则分位加 1 mov buff
45、+2,0 ;秒的高位置 0 cmp buff+1,6 ;秒位与 6 比较 jnz iexit ;若不等则转 iexit mov buff+1,0 ;分位置 1 and flag,0feh iexit:lea bx,dseg ;去数据表的首地址 lea si,buff ;取缓冲区的首地址agi:mov al,si ;将 si 的内容送给 al xlat ;将 ASC码转换成数据 mov ah,al mov dx,0c801h mov al,bit out dx,al cmp al,04h ;判断是否为第二位,是则加点,否则继续 jnz q1 and ah,7fhq1:mov dx,0c800h
46、;取相应的段和位 mov al,ah out dx,al mov di,30 mov cx,0000h ;延时delay:loop delay dec di ;缓冲区地址加 1 jnz delay inc si shl bit,1 ;将位加 1 cmp bit,10h ;将 bit 和 10h 相比 jnz agi ;不等于则循环 mov bit,1 ;否则将 bit 置 1 mov al,0 mov dx,0c801h out dx,al mov al,20h 微机原理与接口技术课程设计 23 out 20h,al pop dx ;将 cx、si、dx、bx、ax 出栈,恢复 cpu 状态
47、pop cx pop bx pop ax pop di pop si iret button proc nearnext:mov dx,0c801h mov al,0 out dx,al ;写 c 口全写 0,即使行线为 0 inc dxabb:in al,dx ;读列线 and al,0fh cmp al,0fh ;判断是否都为 1 jz abb mov si,10 mov cx,000hdelayy:loop delayy ;延时 dec si jnz delayy mov bh,00 ;存放行值 mov bl,0 ;存放列值 mov cx,4 ;判别行数 mov ah,0feh ;赋值
48、11111110again:mov al,ah ;逐行输出为 0,判别该行是否有键按下 mov dx,0c801h out dx,al inc dx in al,dx and al,0fh cmp al,0fh ;判断 al 是不是全 1 jnz ab1 ;若有键按下就跳到 ab1 add bh,4 ;该行没键按下就给行值加 4 shl ah,1 loop again ;等待检测下一行 jmp kexitab1:mov cx,4ab3:shr al,1 jc ab2 jmp ab4ab2:inc bl loop ab3微机原理与接口技术课程设计 24ab4:add bh,bl mov al,b
49、h lea bx,asctab ;将 asctab 段地址传给 bx xlat ;将 ASC码转换成数据 push ax mov dl,al mov ah,2 int 21h mov dx,0c801h mov al,0 out dx,al inc dxab5:in al,dx and al,0fh cmp al,0fh jnz ab5 mov si,10 mov cx,000hdelay2:loop delay2 dec si jnz delay2 pop axkexit:ret button endpend微机原理与接口技术课程设计 254.3 参考文献参考文献【1】韩雁、徐煜明 微机原理与接口技术 电子工业出版社 2008.52008.5【2】马维华、易仲芳 微型计算机及接口技术 科学出版社 2002.22002.2【3】奚抗生 汇编语言程序设计 航空工业出版社 19941994【4】唐棠等 微型计算机与接口技术 南京大学出版社 19951995