8086数字电子钟的设计 附程序代码

合集下载

8086汇编语言程序设计——第一个程序

8086汇编语言程序设计——第一个程序

8086汇编语⾔程序设计——第⼀个程序本系列以80X86系列微型计算机为基础,以MASM5.0为汇编上机实验环境,重点介绍Intel8086指令系统。

Intel8086指令系统中有100多条指令,利⽤这些指令可以编写出复杂的程序实现更多功能。

汇编语⾔是直接控制计算机硬件⼯作的最简便的语⾔。

学习了汇编语⾔可具有在CPU寄存器级上进⾏控制和操作的能⼒,可获得直接对计算机硬件底层编程的经验。

⼀个计算的例⼦例 *编写⼀个汇编语⾔程序,实现下列公式计算。

假设X=4,Y=5汇编指令如下:如果在DEBUG下⽤A命令输⼊这些指令,必须把X、Y换成具体的数值;Z、Z1是存储单元地址,最后两条指令可写为MOV [0],AL和MOV [1],AH,这样才能⽤T命令执⾏。

D:\dos〉DEBUG-AMOV AL,4ADD AL,5MOV BL,8IMUL BLMOV BL,4MOV BH,0SUB AX,BXMOV BL,2IDIV BLMOV [0],ALMOV [1],AH采⽤DEBUG的A命令输⼊程序的做法明显不⽅便,⼀是⽆法给出变量名即符号地址,⼆是调试修改程序不便。

1. 编写⼀个完整的汇编语⾔源程序需要增加段定义伪指令和定义数据存储单元伪指令等必须有的伪指令。

伪指令与C语⾔等⾼级语⾔中的说明性语句的含义类似,起到说明作⽤。

⽤记事本gedit或者vi编写,保存到dos⽬录下注释符号为;号2. 汇编、链接、执⾏汇编语⾔源程序既可以⽤⼤写字母也可以⽤⼩写字母书写。

汇编语⾔程序建⽴及汇编过程如图所⽰。

⽤户编写的源程序要经汇编程序MASM汇编(翻译)后⽣成⼆进制⽬标程序,⽂件名默认与源程序同名、扩展名为.OBJ;再经过LINK连接⽣成可执⾏程序,⽂件名默认与源程序同名、扩展名为.EXE。

注意:源程序⼀定要和MASM和LINK⽂件放在同⼀个⽂件夹中。

执⾏MASM和LINK命令时需要按多次回车。

3. 在DEBUG下执⾏程序MOV AH,4C指令对应的偏移地址是0023,这就是断点(所谓断点,就是程序执⾏到该处停下来不再继续)。

数电实验数字钟的设计代码

数电实验数字钟的设计代码

数电实验数字钟的设计代码数字钟是一种常见的电子设备,用于显示当前时间。

它是基于数字电路技术设计的,可以实时地显示时、分、秒的数字。

在这篇文章中,我将为大家介绍数字钟的设计代码,以及它的原理和实现过程。

在开始设计数字钟之前,我们需要准备一些基础材料和器件。

首先,我们需要一块数字时钟显示屏,它可以显示四位数的时、分、秒。

其次,我们需要几个集成电路芯片,包括时钟发生器、计数器、解码器等。

另外,还需要一些细小的电子元件,如电阻、电容、晶体管等。

准备好这些材料后,我们就可以开始设计数字钟的电路了。

首先,我们先来了解一下数字钟的原理。

数字钟的核心部分就是计数器。

计数器可以根据时钟发生器提供的脉冲信号进行计数,当计数到一定值时,就会触发一次计数事件。

我们可以将计数事件与显示屏相连,通过解码器将计数的结果转化成数字信号,进而在显示屏上以数码形式显示出来。

通过不断循环计数,我们就可以实现数字钟的功能了。

接下来,我们将详细介绍数字钟的设计代码。

首先,我们需要定义一些常量和变量。

常量包括时钟频率、计数器的初始值等,而变量则用来保存时、分、秒的数值。

接着,我们需要编写时钟发生器的代码,它可以产生一个固定频率的脉冲信号。

然后,我们需要编写计数器的代码,它会根据时钟发生器的脉冲信号进行计数,并触发计数事件。

最后,我们需要编写解码器的代码,它可以将计数的结果转化成数字信号,供显示屏显示。

在编写完代码后,我们需要将它们烧录到集成电路芯片中。

然后,将电路连接起来,将显示屏与解码器相连。

确保所有电子元件的接触良好,然后通电测试。

如果一切正常,数字钟就会开始工作,并在显示屏上显示出当前的时、分、秒。

在这个实验中,我们学习到了数字电路设计的基本原理和实现过程。

数字钟作为一个常见的例子,展示了数字电路的实际应用。

通过这个实验,我们不仅提高了自己的动手实践能力,还加深了对数字电路的理解。

相信通过这次实验,我们对数字钟的设计代码有了更深入的了解,也能够在今后的实践中运用这些知识。

8086数字时钟课程设计报告

8086数字时钟课程设计报告

INTEL 8086/8088系列微型计算机原理及接口技术课程名称:微型计算机原理及接口技课程设计设计题目:具有年月日时分秒功能的时钟显示院系:电气工程学院班级:设计者:学号:同组者:指导教师:设计时间:目录一、设计内容与要求 (2)二、设计思路 (3)三、流程图 (4)四、程序 (7)五、运行结果 (12)六、硬件设计…………………………………………………………………………………………………七、调试步骤 (13)八、心得体会 (14)九、参考文献 (14)一、设计内容与要求:用汇编语言编写一个时钟程序,在微机屏幕上显示当前时间****年**月**日**时**分**秒。

在程序启动后,微机屏幕上显示当前时间,按下a键开始计时,按下b键停止计时,按下c键退出程序。

二、设计思路:利用BIOS的INT 1AH的2号系统功能调用,将计算机系统的时间参数(BCD 码)送入寄存器。

其中CH 和CL中保存的是小时数和分钟数;DH中保存的是秒钟数。

利用除法命令DIV,若进行字节操作,16位被除数隐含在AX中,8位除数就是源操作数,结果的8位商在AL中,8位余数在AH中,即(AL)(AH)/(SRC)的商(AL)(AH)/(SRC)的余数若进行字操作,32位被除数低16位隐含在AX中,高16位8位隐含在DX中,16位除数就是源操作数,结果的16位商在AX中,16位余数在DX中,即(AX)(DX,AX)/(SRC)的商(DX)(DX,AX)/(SRC)的余数通过以上方法将二进制表示的年月日时分秒转换为BCD码,再将BCD码表示的时,分,秒转换成AS CⅡ码并送入屏幕显示。

能调用子程序,若显示时间与当前时间不符,则校准显示时间,并用INT 21H 的7号功能调用判断输入回车并清屏。

若输入字符C,则令SIGN=3,即退出程序,若无输入或输入字符不是C,则反复从系统中取出当前时间并显示。

详细过程见程序注释。

三、流程图:四、程序:GB MACRO X ;宏定义MOV AX,0200HMOV BX,0000HMOV CX,0000HMOV DX,XINT 10HENDMXIANSHI MACRO Y,Z,WMOV BP,OFFSET YMOV AH,13HMOV AL,0BMOV BX,0EHMOV CX,ZMOV DX,WINT 10HENDMDATA SEGMENTBUFFER1 DB 11 DUP (?)BUFFER2 DB 9 DUP (?)SECOND DB ?SIGN DB ?STR1 DB 'THE CURRENT TIME: $'STR4 DB 'PRESS C TO EXIT:$'DATA ENDSSTACK SEGMENT STACK 'STACK'DB 100 DUP ('S')STACK ENDSCODE SEGMENT PARA 'CODE'ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA STA PROC FARPUSH DSXOR AX,AXPUSH AXMOV AX,DATAMOV DS,AXMOV ES,AXMOV AX,0600HMOV BX,0754HMOV CX,0000HMOV DX,194FHINT 10HXIANSHI STR1,17,0416H ;显示‘ THE CURRENT TIME:’XIANSHI STR4,16,1016H ;显示‘ PRESS C TO EXIT:’BEGIN: CMP SIGN,3 ;若输入字符C,则令SIGN=3,即退出程序,若无输入或输入字符不是C,则反复从系统中取出当前时间并显示JE TUI1MOV AH,2AHINT 21H ;取日期LEA BX,BUFFER1PUSH DX ;保护寄存器MOV AX,CX ;利用除法产生商和余数,把以二进制形式保存的年号转换为BCD码MOV DX,0000H ;年号除以1000得到商即为年号的千位MOV CX,1000DIV CXOR AL,30H ;年号的千位转换为其ASCII码并存入BUFFER1第1存储单元中MOV [BX],ALMOV AX,DX ;年号的百位转换为其ASCII码并存入BUFFER1第2存储单元中MOV CL,64HDIV CLOR AL,30HINC BXMOV [BX],ALMOV AL,AHMOV AH,00H ;年号的十位转换为其ASCII码并存入BUFFER1第3存储单元中MOV CL,10DIV CLOR AL,30HINC BXMOV [BX],ALOR AH,30H ;年号的千位转换为其ASCII码并存入BUFFER1第4存储单元中INC BXMOV [BX],AHPOP DX ;年号转换完毕INC BXMOV CL,2DH ;“—”号的ASCII码存入BUFFER1第5存储单元中MOV [BX],CL ;月数除以10得到商即为月数的十位MOV AL,DH ;月数的十位转换为其ASCII码并存入BUFFER1第6存储单元中CMP AL,10JAE L1JMP L2L1: ADD AL,6L2: PUSH AXAND AL,0F0HSHR AL,1SHR AL,1SHR AL,1SHR AL,1OR AL,30HINC BXMOV [BX],ALPOP AXAND AL,0FHOR AL,30HINC BXMOV [BX],AL ;月数的十位转换为其ASCII码并存入BUFFER1第7存储单元中INC BX ;月数转换完毕MOV CL,2DH ;“—”号的ASCII码存入BUFFER1第8存储单元中 MOV [BX],CL ;日期除以10得到商即为日期的十位MOV AL,DL ;日期的十位转换为其ASCII码并存入BUFFER1第9存储单元中MOV AH,00HMOV CL,10DIV CLOR AL,30HINC BXMOV [BX],AL ;日期的个位转换为其ASCII码并存入BUFFER1第10存储单元中OR AH,30HINC BX ;年月日转换完毕MOV [BX],AHMOV CL,'$' ;“$”号的ASCII码存入BUFFER1第11存储单元中 INC BXJMP NEXTTUI1:JMP TUI2NEXT:MOV [BX],CLXIANSHI BUFFER1,10,0616H ;用9号功能显示年月日MOV AH,2CHINT 21H ;取时间LEA BX,BUFFER2MOV AL,CH ;小时数除以10得到商即为小时数的十位MOV AH,00HMOV CH,10DIV CHOR AL,30H ;小时数的十位转换为其ASCII码并存入BUFFER2第1存储单元中MOV [BX],ALOR AH,30H ;小时数的个位转换为其ASCII码并存入BUFFER2第2存储单元中INC BXMOV [BX],AHINC BXMOV CH,3AH ;“:”号的ASCII码存入BUFFER2第3存储单元中 MOV [BX],CH ;分钟数除以10得到商即为分钟数的十位MOV AL,CLMOV AH,00HMOV CL,10DIV CLOR AL,30H ;分钟数的十位转换为其ASCII码并存入BUFFER2第4存储单元中INC BXMOV [BX],AL ;分钟数的个位转换为其ASCII码并存入BUFFER2第5存储单元中OR AH,30HINC BXMOV [BX],AHINC BXMOV CL,3AH ;“:”号的ASCII码存入BUFFER2第6存储单元中 MOV [BX],CLMOV AL,DH ;秒数除以10得到商即为秒数的十位MOV AH,00HMOV CL,10DIV CLOR AL,30H ;秒数的十位转换为其ASCII码并存入BUFFER2第7存储单元中INC BXMOV [BX],ALOR AH,30H ;秒数的个位转换为其ASCII码并存入BUFFER2第8存储单元中INC BXMOV [BX],AHINC BX ;时分秒转换完毕MOV CL,'$' ;“$”号的ASCII码存入BUFFER2第9存储单元中 MOV [BX],CLXIANSHI BUFFER2,8,0716H ;用9号功能显示时分秒CALL DELY ;调用子程序,若显示时间与当前时间不符,则校准显示时间JMP BEGINTUI2: RETSTA ENDPDELY PROCPUSH CXPUSH DXMOV AH,2CHINT 21HMOV SECOND,DHRE: MOV AH,2CHINT 21HPUSH DXMOV AH,6MOV DL,0FFHINT 21HPOP DXCMP AL,63H ;若输入字符C,则令SIGN=3,即退出程序,若无输入或输入字符不是C,则反复从系统中取出当前时间并显示JE Z3JMP CONTINZ3: MOV SIGN,3CONTIN: CMP SECOND,DHJE RECMP SIGN,1JMP EXITEXIT: POP DXPOP CXRETDELY ENDPCODE ENDSEND STA五、运行结果:程序运行后如下图所示:按下c键,则会出现下图界面:(此时按下任意键即可退出该程序)(注意,若没按下任何键或按下的不是c键,则不会出现下图所示界面)六、硬件设计:1、硬件设计说明:由8284产生系统脉冲送8253的CLK1,通过CPU置计数初值使计数器2输出1KHZ方波。

(完整版)8086汇编经典例程,推荐文档

(完整版)8086汇编经典例程,推荐文档

sub bl,26 mov al,'a' add al,bl
MOV CX,00H WAIT1: LOOP WAIT1
;延时计数器 ;延时
DW 2 DUP (25*8,25*8,50*8) DW 12 DUP (25*8),100*8
jmp next40
DEC DX
next24: sub bl,52
==========================================
MAIN ENDP
MOV AX,[SI]
5. 编写一个数组排序(从小到大)的小程序,数组在程
序中定义,程序先将原数组显示一遍,然后排序,再
DISP PROC
将排好序的数组显示一遍。
PUSH SI
==========================================
MUS_TIME2 DW 3 DUP(50),25,25,50,25,25,100 DW 2 DUP(50,50,25,25),100 DW 3 DUP(50,25,25),100
crlf proc push ax push dx
音演奏歌曲 ========================================== ;这是一个音乐程序,按大写字母“A”,唱乐曲“玛丽
ccc segment assume cs:ccc,ds:qqq
main proc far start: mov ax,qqq
mov ds,ax
next3:
jmp next10 cmp al,'a' jnae next4 cmp al,'z' ja next4 sub al,'a'

电子时钟工具的程序设计及代码示例

电子时钟工具的程序设计及代码示例

电子时钟工具的程序设计及代码示例为满足现代生活的需求,电子时钟成为人们生活中的常见工具。

除了具备实时显示时间的功能外,电子时钟还可以根据用户需求进行各种定制,如显示日期、倒计时、闹钟等功能。

本文将探讨电子时钟的程序设计方法,并提供一个简单的代码示例。

一、程序设计方法在进行电子时钟的程序设计前,我们需要确定以下几个关键因素:1. 使用的编程语言:根据实际情况选择合适的编程语言,如C++、Java、Python等。

2. GUI框架:确定使用什么图形界面框架,如Qt、Tkinter等。

3. 实时更新:确定时间的实时更新方式,可以利用计时器、循环等方式进行时间更新。

4. 用户交互:考虑用户是否需要与电子时钟进行交互,如设置闹钟、选择日期等。

二、代码示例以下是一个基于Python和Tkinter的电子时钟代码示例,代码注释中详细说明了每个函数的功能和实现方法:```pythonimport tkinter as tkfrom datetime import datetimedef update_time():# 获取当前时间current_time = datetime.now().strftime("%H:%M:%S")# 更新时间标签time_label.config(text=current_time)# 每隔1秒更新一次时间time_label.after(1000, update_time)# 创建窗口window = ()window.title("电子时钟")# 创建时间标签time_label = bel(window, font=("Arial", 100), bg="white") time_label.pack(pady=50)# 更新时间update_time()# 运行窗口主循环window.mainloop()```以上代码创建了一个简单的窗口,使用标签实时显示当前时间。

基于8086的电子时钟设计(彩色图版)

基于8086的电子时钟设计(彩色图版)

目录错误!未找到引用源。

摘要 (1)Abstract (1)第一章电子钟设计总体方案设计 (2)1.1 设计目的 (2)1.2 设计要求 (2)1.3 方案比较 (2)1.3.1 非中断方式与中断方式的比较 (2)1.3.2 LED显示与液晶显的比较 (3)1.4 总体方案设计思路 (3)第二章系统硬件设计 (4)2.1 8255与CPU之间的连接关系 (4)2.2 8253与周边电路的连接关系 (4)2.3 8259与周边电路连接关系 (5)2.4 液晶显示模块与8255之间的连线关系 (5)2.5 地址译码器与按键 (6)2.6 系统总体硬件电路图 (6)第三章系统软件设计 (7)3.1 编址及控制字的确定 (7)3.1.1 编址 (7)3.1.2 控制字 (7)3.2 分块子程序 (7)3.2.1 1602读写操作子程序 (7)3.2.2中断子程序 (9)3.3 主程序设计 (11)总结与致谢: (13)参考文献: (14)附录: (15)摘要本设计以微机原理与接口技术为基础,以8086CPU为核心,利用INTER 8253可编程定时/计数器,通过引入时钟发生器产生标准时钟进行精准定时;经定时器产生中断源,采用可编程中断控制器8259A进行中断扩展,用可屏蔽中断方式进行时间的采集;以可编程并行I/O接口芯片8255A扩展接口,驱动MSC1602液晶模块进行时间显示。

关键词:微机原理;接口技术;8086CPU;可屏蔽中断;MSC1602液晶;可编程;INTER 8253定时/计数器;中断控制器8259A;并行I/O接口芯片8255AAbstractThis design take the microcomputer principle and the connection technology as a foundation, by the 8086CPU core, uses the INTER 8253 programmable fixed time/counters, produces the standard clock through the introduction clock generator to carry on fine fixed time; Produces the interrupt source after the timer, uses programmable interrupt controller 8259A to carry on the interrupt to expand, sends the maskable interrupt way to carry on the counting; By programmable parallel I/O the connection chip 8255A expansion connection, actuates the MSC1602 liquid crystal module to carry on the time demonstration.Key word: Microcomputer principle; Connection technology; 8086CPU; Maskable interrupt; MSC1602 liquid crystal; Programmable; INTER 8253 fixed time/counters; Interrupt controller 8259A; Parallel I/O connection chip 8255A第一章电子钟设计总体方案设计1.1 设计目的电子钟是一种基于微电子技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更长的使用寿命,因此得到了广泛的使用。

数字时钟代码

数字时钟代码

数字时钟代码1. 介绍数字时钟是一种常见的显示时间的装置,它通过数字显示屏显示当前的小时和分钟。

本文档将介绍如何编写一个简单的数字时钟代码。

2. 代码实现以下是一个基本的数字时钟代码实现示例:import timewhile True:current_time = time.localtime()hour = str(current_time.tm_hour).zfill(2)minute = str(current_time.tm_min).zfill(2)second = str(current_time.tm_sec).zfill(2)clock_display = f"{hour}:{minute}:{second}"print(clock_display, end="\r")time.sleep(1)代码说明:- `time.localtime()` 函数返回当前时间的结构化对象,包括小时、分钟和秒等信息。

- `str(current_time.tm_hour).zfill(2)` 将小时转换为字符串,并使用 `zfill()` 方法填充到两位数。

- `str(current_time.tm_min).zfill(2)` 和`str(current_time.tm_sec).zfill(2)` 同理处理分钟和秒。

- 使用 f-string 格式化字符串 `clock_display`,将小时、分钟和秒显示为 `` 的形式。

- `print(clock_display, end="\r")` 使用 `\r` 实现覆盖打印,使得时钟在同一行连续显示。

- `time.sleep(1)` 让程序每隔一秒更新一次时间。

请注意,上述代码需要在支持 Python 的环境中运行。

3. 结束语通过以上的代码实现,我们可以编写一个简单的数字时钟。

基于8086的电子时钟设计

基于8086的电子时钟设计

基于8086的电子时钟设计概述:电子时钟是一种利用电子技术实现时间显示的装置。

本文将介绍基于8086微处理器的电子时钟的设计方案,包括硬件设计和汇编语言编程。

1.硬件设计:(1)8086微处理器:选择适合的8086微处理器芯片,并进行相应的引脚连接。

8086微处理器是16位的,具有高性能和大容量寻址能力。

(2)时钟电路:设计一个稳定的时钟电路,可以使用定时器或石英晶体振荡器,通过一个合适的预分频器产生高频时钟信号。

(3)显示器件:选择合适的显示器件,如LED数码管或液晶显示屏。

这些显示器件需要提供合适的接口电路,以便与8086微处理器进行通信。

(4)键盘电路:设计一个键盘电路,用于设置和调整时钟的时间。

键盘电路需要提供合适的接口电路,以便与8086微处理器进行通信。

2.汇编语言编程:使用汇编语言编程,可以通过对8086微处理器内部的寄存器和存储器进行操作,实现电子时钟的功能。

(1)初始化:在程序开始时,对相关的寄存器和存储器进行初始化,包括时钟计数器、时分秒寄存器、显示器接口等。

(2)时钟计数器:利用定时器或石英晶体振荡器产生的高频信号,通过适当的预分频器产生时钟计数器的时钟信号。

在程序中对时钟计数器进行相应的设置和控制,实现时钟的精确计时。

(3)时分秒寄存器:通过键盘电路输入时、分和秒的数值,将其存储到相应的寄存器中。

通过程序控制这些寄存器,实现时钟数值的更新和显示。

(4)显示器接口:利用合适的接口电路,将8086微处理器输出的数码信号转换为相应的显示信号,显示在数码管或液晶显示屏上。

通过程序控制接口电路,实现时钟数值的实时显示。

3.功能实现:(1)时间设置:通过键盘电路,输入时、分和秒的数值,将其存储到寄存器中,实现时间的设置。

(2)时间显示:通过程序控制,将寄存器中存储的时、分和秒的数值显示在数码管或液晶显示屏上,实现时间的实时显示。

(3)闹钟功能:通过键盘电路设置闹钟的时间,通过程序判断当前时间和闹钟的时间是否相等,如果相等,则触发相应的闹钟响铃。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

附件3课程设计(综合实验)报告( 2011 -- 2012 年度第 1 学期)名称:硬件课程与实践题目:8086数字电子钟的设计院系:班级:学号:学生姓名:指导教师:设计周数:2周成绩:日期:2011年09月01日一、课程设计的目的与要求1. 综合运用学过的相关软、硬件知识,利用伟福LAB6000实验设备,设计具有实用功能的电子钟,实现电子时钟的准确运行、校时等功能。

2.熟悉伟福LAB6000的功能,掌握数码管设计和键盘设计的要领及相关技术,能够利用实验设备实现电子钟系统的设计。

3.提高自己的硬件设计分析能力,同时培养软硬结合的系统设计思维,从而提高设计系统的可行性和准确性。

二、课程设计正文A.设计题目:8086数字电子钟的设计:1.设计并完成LED七段数码管数字钟电路。

2.数字钟显示格式为:HH:MM:SS。

3.具有通过键盘能够调整时、分、秒及设置闹铃的功能。

4.具有暂停时间及复位功能。

B.设计方案本设计采用LAB6000伟福仿真实验箱,利用4MHz脉冲信号源和多级分频电路产生脉冲信号,4MHz脉冲信号经过F/64分频后得到62.5KHz脉冲信号,将脉冲信号传递给8253定时器,定时器每0.000016秒中断一次,在中断服务程序中对中断次数进行计数,0.000016秒计数62500次就是1秒,然后在中断服务程序中对秒计数得到分和小时值并判断闹铃是否到时。

编写键盘扫描和LED显示程序完成设置时间、定闹铃及数码管显示功能。

C.硬件原理1.七段数码管显示和键盘扫描显示图1.1七段数码管图1.2伟福实验台六位LED的电路图及寻址空间实验箱提供了6位八段数码LED显示电路,只要按地址输出相应数据,就可以实现对显示器的控制。

将KEY/LED CS接到CS0上,则实验箱中八位段码输出地址为08004H,位码输出地址为08002H。

实验箱提供了一个6×4的小键盘,将KEY/LED CS信号接到CS0上,则列扫描地址为08002H,行码地址为08001H。

向列扫描码地址逐列输入低电平,然后从行码地址读回。

如果有键按下,则相应行的值应为低,如果无键按下,由于上拉的作用,行码为高。

这样就可以通过输出的列码和读取的行码来判断按下的是什么键。

在判断有键按下后,要有一定的时延,防止键盘抖动。

2.硬件连接图2.1伟福实验台内部总线连接8253用定时器/计数器1,8253片选接CS1,地址为09000H,8253时钟源CLK1接分频电路的F/64输出,频器的Fin接4MHz时钟,8253的GATE1接VCC;8259中断INT0接8253的OUT1,片选接CS2,地址为0A000H。

显示电路的KEY/LED CS 接CS0,地址为08000H。

如下图:D.运行界面三、课程设计总结或结论四、参考文献[1] 王保义, 张少敏.接口与通信. 北京-中国电力出版社, 2008[2] 沈美明, 温冬婵. IBM-PC汇编语言程序设计. 清华大学出版社,第二版. 2002[3] 陆红伟.微机原理实验与课程设计指导书. 中国电力出版社, 2006.8附录(设计流程图、程序等)CONTROL EQU 09003HCOUNT1 EQU 09001HIN_KEY EQU 08001H ; 键盘读入口OUTBIT EQU 08002H ; 位控制口OUTSEG EQU 08004H ; 段控制口ICW1 EQU 00010011B ; 单片8259, 上升沿中断, 要写ICW4ICW2 EQU 00100000B ; 中断号为20HICW4 EQU 00000001B ; 工作在8086/88 方式OCW1 EQU 11111110B ; 只响应INT0 中断CS8259A EQU 0A000H ; 8259地址CS8259B EQU 0A001HDATA SEGMENTCNT DB 0;闹铃显示RHOUR DB 1RMINUTE DB 0HOUR DB 0MINUTE DB 0SECOND DB 0NUM DB 0;判断闹铃LEDBUF DB 6 DUP(?) ; 显示缓冲RINGBUF DB 6 DUP(?)SETBUF DB 6 DUP(?)LEDMAP: ; 八段管显示码DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07HDB 7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71HKEYTABLE: ; 键码定义DB 16H, 15H, 14H, 0FFHDB 13H, 12H, 11H, 10HDB 0DH, 0CH, 0BH, 0AHDB 0EH, 03H, 06H, 09HDB 0FH, 02H, 05H, 08HDB 00H, 01H, 04H, 07HSET: DB 6DH, 79H, 07H, 01H, 00H, 00H;字符显示SETBELL: DB 7FH, 79H, 38H, 38H, 00H, 00H;字符显示BELLDATA ENDSCODE SEGMENTASSUME CS:CODE, DS:DA TADELAY PROC NEARPUSH AX ; 延时子程序PUSH CXMOV AL, 0MOV CX,AXLOOP $POP CXPOP AXRETDELAY ENDPDISPLAYLED PROC NEARMOV CL, 6 ; 共6个八段管MOV AH, 00100000B ; 从左边开始显示DLOOP:MOV DX, OUTBITMOV AL, 0OUT DX,AL ; 关所有八段管MOV AL, [BX]MOV DX, OUTSEGOUT DX,ALMOV DX, OUTBITMOV AL, AHOUT DX, AL ; 显示一位八段管PUSH AXMOV AH, 01HCALL DELAYPOP AXSHR AH, 1INC BXDEC CLJNZ DLOOPMOV DX, OUTBITMOV AL, 0OUT DX,AL ; 关所有八段管RETDISPLAYLED ENDPTESTKEY PROC NEARMOV DX, OUTBITMOV AL, 0OUT DX, AL ; 输出线置为0MOV DX, IN_KEYIN AL, DX ; 读入键状态NOT ALAND AL, 0FH ; 高四位不用RETTESTKEY ENDPGETKEY PROC NEARMOV CH, 00100000BMOV CL, 6KLOOP:MOV DX, OUTBITMOV AL, CH ; 找出键所在列NOT ALOUT DX, ALSHR CH, 1MOV DX, IN_KEYIN AL, DXNOT ALAND AL, 0FHJNE GOON_ ; 该列有键入DEC CLJNZ KLOOPMOV CL, 0FFH ; 没有键按下, 返回0FFHJMP EXIT1GOON_:DEC CLSHL CL, 2 ; 键值= 列* 4 +行MOV CH, 4LOOPC:TEST AL, 1JNZ EXIT1SHR AL, 1INC CLDEC CHJNZ LOOPCEXIT1:MOV DX, OUTBITMOV AL, 0OUT DX, ALMOV CH, 0MOV BX, OFFSET KEYTABLEADD BX, CXMOV AL, [BX] ; 取出键码MOV BL, ALWAITRELEASE:MOV DX, OUTBITMOV AL, 0OUT DX, AL ; 等键释放MOV AH, 10CALL DELAYCALL TESTKEYJNE WAITRELEASEMOV AL, BLRETGETKEY ENDPIENTER PROC NEARPUSH AXPUSH DXMOV NUM,0INC SECONDMOV AL, SECONDCMP AL, 60JNE J0MOV SECOND, 0INC MINUTEMOV AL, MINUTECMP AL, 60JNE J0MOV MINUTE, 0INC HOURMOV AL, HOURCMP AL, 24JNE J0MOV HOUR, 0J0: ;判断闹铃MOV AL,HOURCMP AL, RHOURJNE J1INC NUMJ1:MOV AL,MINUTECMP AL, RMINUTEJNE J2INC NUMJ2:CMP NUM, 2JNE EXITMOV CNT, 0EHL33:;MOV DX,0D000H;OUT DX,ALMOV BX, OFFSET BELLCALL DISPLAYLEDDEC CNTJNE L33EXIT:MOV DX, CS8259AMOV AL, 20H ; 中断服务程序结束指令OUT DX, ALPOP DXPOP AXIRETIENTER ENDPIINIT PROCMOV DX, CS8259AMOV AL, ICW1OUT DX, ALMOV DX, CS8259BMOV AL, ICW2OUT DX, ALMOV AL, ICW4OUT DX, ALMOV AL, OCW1OUT DX, ALRETIINIT ENDPSTART PROC NEARMOV AX, DA TAMOV DS, AXMOV NUM, 0MOV LEDBUF, 03FH ; 显示00.00.00MOV LEDBUF+1, 03FHMOV LEDBUF+2, 03FHMOV LEDBUF+3, 03FHMOV LEDBUF+4, 03FHMOV LEDBUF+5, 03FHMOV HOUR, 0MOV MINUTE, 0MOV SECOND, 0CLI ;关中断MOV AX, 0MOV DS, AXMOV AL, 76H; 01110110B ; 计数器1,16位,方式3,二进制MOV DX, CONTROLOUT DX, ALMOV AX, 65500MOV DX, COUNT1OUT DX, AL ; 计数器低字节MOV AL, AHOUT DX, AL ; 计数器高字节MOV BX, 4*ICW2 ; 中断号MOV AX, CODESHL AX, 4 ;*16ADD AX, OFFSET IENTER ;中断入口地址(段地址为0)MOV [BX], AXMOV AX, 0INC BXINC BXMOV [BX], AX ; 代码段地址为0CALL IINITMOV AX, DA TAMOV DS, AXSTI ;开中断LOOP2:MOV AL, HOURMOV AH, 0MOV CL, 10DIV CLMOV CH, AHMOV AH, 0 MOV BX, OFFSET LEDMAP ADD BX, AXMOV AL, [BX]MOV LEDBUF, ALMOV BX, OFFSET LEDMAP MOV AL, CHMOV AH, 0ADD BX, AXMOV AL, [BX]OR AL, 80HMOV LEDBUF+1, ALMOV AL, MINUTE MOV AH, 0MOV CL, 10DIV CLMOV CH, AHMOV AH, 0MOV BX, OFFSET LEDMAP ADD BX, AXMOV AL, [BX]MOV LEDBUF+2, ALMOV BX, OFFSET LEDMAP MOV AL, CHMOV AH, 0ADD BX, AXMOV AL, [BX]OR AL, 80HMOV LEDBUF+3, ALJMP L3LOOP1:JMP LOOP2L3:MOV AL, SECOND MOV AH, 0MOV CL, 10DIV CLMOV CH, AHMOV AH, 0MOV BX, OFFSET LEDMAP ADD BX, AXMOV AL, [BX]MOV LEDBUF+4, ALMOV BX, OFFSET LEDMAP MOV AL, CHMOV AH, 0ADD BX, AXMOV AL, [BX]OR AL, 80HMOV LEDBUF+5, ALMOV BX, OFFSET LEDBUFCALL DISPLAYLEDD0:MOV BX, OFFSET LEDBUFCALL DISPLAYLED ; 显示CALL TESTKEY ; 有键入?JE LOOP1 ; 无键入, 继续显示CALL GETKEY ; 读入键码AND AL, 0FH ; 显示键码MOV AH,0CMP AL,0AHJE SET0CMP AL,0BHJE BELL01CMP AL,0CHJE STOP1CMP AL,0DHJE CLEAR1JMP D0STOP1:CLISTOP2:MOV BX, OFFSET LEDBUFCALL DISPLAYLEDCALL TESTKEYJE STOP2CALL GETKEYAND AL, 0FHMOV AH, 0CMP AL, 0CHJNE STOP2STIJMP D0CLEAR1:MOV HOUR,0MOV MINUTE,0MOV SECOND,0 JMP D0SET0:MOV BX, OFFSET SETCALL DISPLAYLEDCALL TESTKEYJE SET0CALL GETKEYAND AL, 0FHMOV AH, 0MOV SETBUF[0],ALMOV BX, OFFSET LEDMAP ADD BX, AXMOV AL, [BX]MOV LEDBUF, ALSET1:MOV BX, OFFSET LEDBUF CALL DISPLAYLEDCALL TESTKEYJE SET1CALL GETKEYAND AL, 0FHMOV AH, 0MOV SETBUF[1],ALMOV BX, OFFSET LEDMAP ADD BX, AXMOV AL, [BX]MOV LEDBUF+1, ALJMP SET2BELL01:JMP BELL02SET2:MOV BX, OFFSET LEDBUF CALL DISPLAYLEDCALL TESTKEYJE SET2CALL GETKEYAND AL, 0FHMOV AH, 0MOV SETBUF[2],ALMOV BX, OFFSET LEDMAP ADD BX, AXMOV AL, [BX]MOV LEDBUF+2, ALSET3:MOV BX, OFFSET LEDBUF CALL DISPLAYLEDCALL TESTKEYJE SET3CALL GETKEYAND AL, 0FHMOV AH, 0MOV SETBUF[3],ALMOV BX, OFFSET LEDMAP ADD BX, AXMOV AL, [BX]MOV LEDBUF+3, ALJMP SET6BELL02:JMP BELL03SET6:MOV BX, OFFSET LEDBUF CALL DISPLAYLEDCALL TESTKEYJE SET6CALL GETKEYAND AL, 0FHCMP AL,0AHJE TIMESETJMP D0TIMESET:MOV AL , SETBUF[0]MOV CL,10DMUL CLMOV BL,SETBUF[1]ADD AL,BLMOV HOUR,ALCMP HOUR,24JL LP1MOV HOUR ,0LP1:MOV AL ,SETBUF[2]MOV CL,10DMUL CLMOV BL ,SETBUF[3] ADD AL,BLMOV MINUTE ,ALCMP MINUTE ,60JL LP2MOV MINUTE ,0LP2:MOV SECOND, 0JMP D0BELL03:MOV BX, OFFSET BELL CALL DISPLAYLED ; 显示CALL TESTKEY ; 有键入?JE BELL03 ; 无键入, 继续显示CALL GETKEY ; 读入键码AND AL, 0FH ; 显示键码MOV AH, 0MOV RINGBUF[0],ALMOV BX, OFFSET LEDMAP ADD BX, AXMOV AL, [BX]MOV LEDBUF, ALBELL1:MOV BX, OFFSET LEDBUF CALL DISPLAYLED ; 显示CALL TESTKEY ; 有键入?JE BELL1 ; 无键入, 继续显示CALL GETKEY ; 读入键码AND AL, 0FH ; 显示键码MOV AH, 0MOV RINGBUF[1],ALMOV BX, OFFSET LEDMAP ADD BX, AXMOV AL, [BX]MOV LEDBUF+1, ALBELL2:MOV BX, OFFSET LEDBUF CALL DISPLAYLED ; 显示CALL TESTKEY ; 有键入?JE BELL2 ; 无键入, 继续显示CALL GETKEY ; 读入键码AND AL, 0FH ; 显示键码MOV AH, 0MOV RINGBUF[2],ALMOV BX, OFFSET LEDMAP ADD BX, AXMOV AL, [BX]MOV LEDBUF+2, ALBELL3:MOV BX, OFFSET LEDBUF CALL DISPLAYLED ; 显示CALL TESTKEY ; 有键入?JE BELL3 ; 无键入, 继续显示CALL GETKEY ; 读入键码AND AL, 0FH ; 显示键码MOV AH, 0MOV RINGBUF[3],ALMOV BX, OFFSET LEDMAP ADD BX, AXMOV AL, [BX]MOV LEDBUF+3, ALBELL4:MOV BX, OFFSET LEDBUF CALL DISPLAYLEDCALL TESTKEYJE BELL4CALL GETKEY AND AL, 0FHCMP AL,0BHJE BELLSETJMP D0BELLSET:MOV NUM,0MOV AL , RINGBUF[0] MOV CL,10DMUL CLMOV BL,RINGBUF[1] ADD AL,BLMOV RHOUR,AL CMP RHOUR,24JL LP3MOV RHOUR ,0LP3:MOV AL ,RINGBUF[2] MOV CL,10DMUL CLMOV BL ,RINGBUF[3] ADD AL,BLMOV RMINUTE ,AL CMP RMINUTE ,60JL LP4MOV RMINUTE ,0LP4:JMP D0START ENDPCODE ENDSEND START。

相关文档
最新文档