北邮微原硬件实验报告_第1页
北邮微原硬件实验报告_第2页
北邮微原硬件实验报告_第3页
北邮微原硬件实验报告_第4页
北邮微原硬件实验报告_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

微机原理硬件实验报告2015-2016学年第一学期微机原理硬件实验报告学院: 班级:学号:姓名: 序号:目录实验一 熟悉实验环境及IO的使用3一 实验目的3二 实验内容3三 实验过程31 实验原理32 流程图33 源代码44 子程序清单65 代码分析6四 实验总结6实验二 8255A并行接口应用7一 实验目的7二 实验内容7三 实验过程71 八位数码管位选规律72 六位数码管静态显示83 六位数码管动态显示114 扩展:显示键盘输入学号15四 实验总结21实验三 8253计数器/定时器的应用22一 实验目的22二 实验内容22三 实验过程221 蜂鸣器发音规律222 音乐发生器233 扩展:小键盘弹琴功能32四 实验总结38实验一 熟悉实验环境及IO的使用一 实验目的1通过实验了解和熟悉实验台的结构,功能及使用方法。2通过实验掌握直接使用Debug的I、O命令来读写I/O端口。3学会Debug的使用及编写汇编程序。二 实验内容1学习使用Debug命令,并用I、O命令直接对端口进行读写操作。2用汇编语言编写跑马灯程序。实现功能:1)通过读入端口状态,选择工作模式(灯闪烁方式、速度等);2)通过输出端口控制灯的工作状态(低电平灯亮)。三 实验过程1 实验原理1在Debug下,用I是命令读输入端口的状态,即拨码开关的状态,用O命令向端口输出数据,通过LED发光管来查看。测试结果:1)使用命令:I 0EEE0H读取开关状态,得出的结果为左低右高,即 S0 是低位,S7 是高位。2)实验命令:O 0EEE0H测试LED,改变输入的值可依次测试各个数码管是否正常。LED左边为高位,右边为低位。2分析以下程序段的作用MOV AH, 0BHINT 21HOR AL,ALJZ 0100INT 20H该段程序实现了检测键盘状态,在键盘有任意键输入时退出程序返回DOS的功能。该实现依赖于0BH号中断调用和巧妙使用程序入口返回地址直接返回。在DOS的DEBUG模式下,地址不用添加十六进制H标志。地址默认为16进制,多写了反而画蛇添足产生错误。普通数据为了区分需要添加H。2 流程图3 源代码DATA SEGMENTPORT EQU 0EEE0HDATA ENDSSTACK SEGMENT STACKSTACKDB 100 DUP(?)STACK ENDSCODE SEGMENTASSUME DS:DATA,CS:CODE,SS:STACKBEGIN: MOV AX,DATAMOV DS,AXMOV AL,07FH ;MOV DX,PORT MOV SI,2 START: PUSH AX;入栈保存IN AL,DX;读取拨码开关状态MOV BL,AL;BL存储拨码开关状态POP AX;出栈恢复TEST BL,10H;.判断左数第五个拨码开关的状态,;实现灯型的变化JNZ TWO;ON状态为两个灯CMP SI,1;判断AL状态JZ CONT;SI等于1时AL有两位为0,应恢复为只有一位为0, MOV AH,ALROR AH,1OR AL,AHMOV SI,2;AL恢复为只有一位为0,SI变为2JMP CONTTWO:CMP SI,2JZ CONT;SI为2时只有AL只有1位为0,应对其变换MOV AH,ALROR AH,1AND AL,AH;AL有两位为0MOV SI,1CONT:OUT DX,ALTEST BL,08H;.判断第四个拨码开关的状态,实现暂停JNZ START;ON状态实现暂停TEST BL,02H;.判断第二个拨码开关的状态,;实现速度的变化JNZ HIGHSP;ON状态实现高速MOV BP,0200H;低速状态时延JMP MOVEHIGHSP:MOV BP,0100H;高速状态时延MOVE:CALL DELAYTEST BL,04H;判断第三个拨码开关的状态,实现方向的变化JNZ LEFT;ON状态为方向向左RIGHT:ROR AL,1;右移,以备点亮下一盏灯JMP EXITLEFT:ROL AL,1;左移,以备点亮下一盏灯EXIT:TEST BL,01H;判断第一个拨码开关的状态JZ START;OFF状态继续运行,ON状态实现退出MOV AL,0FFH;实现全灭 OUT DX, ALMOV AH,4CHINT 21HDELAYPROC MOV CX,BP;BP越大延时次数越多,速度越慢LOOP1:PUSH CXMOV CX,0FFFFHLOOP2:LOOP LOOP2POP CXLOOP LOOP1RETDELAYENDPCODEENDSEND BEGIN4 子程序清单1)子程序名:DELAY功能:实现延迟显示,即控制每个LED点亮持续一定时间;入口参数:BP,赋值给CX控制循环次数,从而实现速度的控制;出口参数:无;使用寄存器:CX,BP。5 代码分析1)通过读取拨码开关地址获得拨码开关状态,将该状态的值赋给BL,实现对灯型、暂停、速度、方向以及退出的控制。2)灯型的控制:通过相应拨码开关的状态选择灯型。灯型一共有两种,第一种为每次亮一盏灯,此时控制输出的寄存器AL中的值只有一位为0,其余七位为1;第二种为每次亮两盏灯,此时控制输出的寄存器AL中的值两位为0,其余六位为1。使用寄存器SI表示当前寄存器AL中0的个数,当SI的值与控制灯型的信息不一致时,通过逻辑与/逻辑或的操作,修改AL的值。3)暂停的控制:通过相应拨码开关的状态判断是否执行暂停操作。当需要暂停时,控制输出的寄存器AL中的值保持不变,当不需要暂停时,控制输出的寄存器AL中的值循环左移/循环右移。4)速度的控制:通过相应拨码开关的状态判断速度的大小。在不同的状态下,对BP赋不同的值,BP作为DELAY子程序的入口参数控制延时的时间从而实现速度的变化。BP越大,则外循环次数越多,所耗时间越长,每个LED点亮持续时间越久,即速度越慢。5)方向的控制:通过相应拨码开关的状态判断方向。在不同的状态下,对控制输出的寄存器AL中的值循环左移/循环右移,即可控制显示的方向。6)退出的控制:通过相应拨码开关的状态判断是否退出程序。四 实验总结虽然本次实验是第一次微原硬件实验,但是在此之前已经有了一定的软件编程基础,并且在VHDL实验中我们也曾编写过跑马灯实验,因而实验之前对实验原理及代码结构有初步的掌握。实验过程中我们按照讲义中的要求先对拨码开关及LED进行了测试,便捷了之后程序的编写。总而言之,通过本次实验,我们对利用汇编语言对硬件进行编程有了一定的掌握,对后续实验的开展奠定了良好的基础。实验二 8255A并行接口应用一 实验目的1掌握8255A的功能及方式0、1的实现。2熟悉8255A与CPU的接口,以及传输数据的工作原理及编程方法。3了解七段数码管显示数字的原理。4掌握同时显示多位数字的技术。二 实验内容1八段数码管的显示规律及数码管的位选规律。.2六位数码管静态显示。在数码管电路上静态地显示6位学号,当主机键盘按下任意键时,停止显示,返回DOS。3六位数码管动态显示。要求在数码管电路16位数码管上,动态显示字符串HELLO,当主机键盘按下任意键时结束。4扩展部分:完成扫描键盘(PC口)输入自己的学号,并在数码管上显示。三 实验过程1 八位数码管位选规律在方式0(输入/输出)下,以A口为输出口,B口为输出口, A口接六个共阴极数码管的八位段码,高电平点亮数码管的某一段,B口接数码管的位选(即要使哪个数码管亮),高电平选中某一位数码管点亮。测试结果如下图:根据上述测试结果,不难得出0-9对应的编码,如下表:字形0123456789编码0EDH21H0F4H0F1H39H0D9H0DDH61H0FDH0F9H2 六位数码管静态显示2.1 实验原理1)电路6个数码管的同名阳极段已经复接,当段选寄存器寄存了一个字型编码之后,6个数码管都将显示出相同的数字。如果要使6个数码管“同时”显示不同的数字,必须采用扫描显示的方法。2)通过选位寄存器选择某一位数码管,显示其数字(对应段值为1),然后关闭此数码管,再选择下一位数码管进行显示;如果在一秒钟内,每一位数码管都能显示30次以上,则人眼看到的是几位数码管同时在显示。实验证明,在扫描显示过程中,每一位显示延迟1ms是最佳选择。3)在本次实验中,采用行扫描方式,一次扫描6位数码管,并进行反复循环,使得每位数码管显示虽然存在间隔,但人眼仍为同时显示。每位数码管显示的时间即为显示延迟,在每一次扫面之后检测键盘状态,若有任意键输入,便退出返回DOS界面。2.2 流程图2.3 源代码DATA SEGMENTNUM DB 0F4H,21H,0EDH,0DDH,39H,61H;学号后六位为DATA ENDS;-STACK SEGMENT STACK STACKDB 100 DUP(0)STACK ENDS;-CODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTAT:MOV AL,B;A,B,C口均以方式0输出MOV DX,0EE03H ;设置控制地址OUT DX,AL;送控制字到控制地址MOV AX,DATAMOV DS,AX ;设置段地址MOV ES,AXLOP1:XOR SI,SI ;SI清零MOV CX,06H ;循环6次,即一个周期6位数码管MOV DX,0EE00H ;A口的地址赋给DX,A口接八位段码MOV BL,B ;高电平即选中该位数码管点亮LOP2:MOV AL,NUMSI ;将需要显示的数字赋给ALOUT DX,AL ;送AL输出至A端口MOV AL,BL ;将控制哪一位亮的功能赋给ALINC DX;B口的地址赋给DX,B口接六位数码管OUT DX,AL;送AL输出至B端口,完成指定位显示指定数字DEC DX;重新将A口地址赋给DXROL BL,1 ;循环移位,控制下一位数码管亮INC SI;SI加1,使得下次显示中改变所显示的数字CALL DELAY ;延时,即每位数码管点亮的时间CALL KEY ;判断是否有键盘输入LOOP LOP2 ;循环6次,6位数码管依次按要求点亮JMP LOP1;循环,重新于第一位开始点亮;- DELAY PROC NEAR ;延时程序,双重循环PUSH BX;BX入栈,保留BX寄存器中的数据PUSH CX;CX入栈,保留CX寄存器中的数据MOV BX,000BH ;BX重新赋值LOP3: MOV CX,00H ;CX重新赋值LOOP $;每循环一次,CX自减1,直至结果为0,即FF次DEC BX;BX减1JNZ LOP3 ;结果为0时停止,即循环11次POP CX;CX中数据恢复为入栈前的值POP BX;BX中数据恢复为入栈前的值RETDELAY ENDP;- KEY PROC NEAR ;判断是否有键盘输入PUSH AX;AX入栈,保留BX寄存器中的数据MOV AH,0BH ;检查输入设备状态INT 21HOR AL,AL;无输入字符AL为00H,有输入为FFHJZ GOON ;全为0即为无输入,返回主程序MOV DX,0EE01HMOV AL,00HOUT DX,AL;完成B端口清零,即6位全灭MOV AH,4CH ;退出程序INT 21HGOON:POP AXRETKEY ENDP;- CODE ENDSEND STAT2.4 子程序清单1)子程序名:DELAY功能:实现延迟显示,即控制每个LED点亮持续一定时间;入口参数:无;出口参数:无;使用寄存器:BX,CX,FR。2)子程序名:KEY功能:判断是否有键盘输入,若有则退出程序;入口参数:无;出口参数:无使用寄存器:AX,DX,FR。2.5 代码分析1)静态显示的过程可以分为六个状态,在每个状态中,只有一位数码管工作,显示对应数字信息。系统循环进行这六个状态,当速度合适时有静态显示六位数字的效果。2)在数据段中定义NUM,在NUM中存入待显示的“”六位数字,根据之前测试得其对应编码为0F4H,21H,0EDH,0DDH,39H和61H;CX表示循环次数;SI表示显示数字在NUM中的位置;BL控制数码管的工作状态。3)在每个状态中,将需要显示的信息赋值给AL,送至8位段码的A口输出,然后将BL赋给AL,送至控制6位数码管的B口输出,从而使数码管在不同的位置显示数字信息。4)在每个状态结束时,对BL做循环移位,SI自加1,调用延时函数控制显示的速度。调用判断键盘输入函数,延时之后若无键盘输入,进入下一状态。如此循环完成6位数码管的显示。5)若循环一个周期仍无键盘输入,则回到第一个状态重新循环,直至有键盘输入。6)延时程序中,采用两层嵌套循环实现延时。对BX,CX采用入栈操作后重新赋值,BX赋初值为000BH,CX为00H,内循环为每循环一次,CX自减1,直至CX等于0,即内循环FFFFH次,外循环为每循环一次,BX减一,当BX为0时终止循环,即外循环0BH次,总共实现FFFFH*0BH次时跳出循环,BX,CX恢复为原值后返回主程序,实现延时显示。7)判断有无键盘输入时,调用DOS命令,AH为0BH即为判断是否有键盘输入,无字符输入时AL为00H,与自身或操作之后结果仍全为0,返回主程序,若有字符输入时AL与自身或操作之后结果不为0,对B端口输出00H,即6位数码管全灭之后退出程序。3 六位数码管动态显示3.1 实验原理1)数码管动态显示“HELLO”字符串,相当于每次显示6位静态字符,每次显示一定时间间隔之后,显示另外6位静态字符。具体如下图所示:显示0.5sH显示0.5sHE显示0.5sHEL显示0.5sHELL显示0.5sHELLO显示0.5sHELLO显示0.5s2)每次显示静态字符串的核心代码与静态显示实验的代码相同,因而可以将静态显示中的程序封装为一个子程序直接使用。增加的功能为需要按一定时间间隔移位读取“HELLO”,程序中通过将其前加入六个空字符,作为码表存储,第一次读取为六个空字符,第二次为五个空字符和字符“H”,第三次为四个空字符和字符“HE”,依次类推,显示时依次往后读取即可。3)可以通过读取拨码开关输入的状态,控制延时的时间,从而实现速度快慢的变化以及实现暂停的功能。3.2 流程图3.3 源代码DATASEGMENTMESGDB 0,0,0,0,0,0,3DH,0DCH,8CH,8CH,0EDH,0 ;据显示规律“HELLO”对应码表为3DH,0DCH,8CH,8CH,0EDHDATAENDS ;-STACKSEGMENT STACK STACKDB 100 DUP(0)STACK ENDS ;-CODE SEGMENTASSUME DS:DATA,CS:CODE,SS:STACK ;- MAIN PROC FARMOV AX,DATAMOV DS,AX;设置段地址MOV ES,AXMOV AL,80HMOV DX,0EE03H OUT DX,AL ;端口A,B,C均以方式0输出LOP6:MOV BX,OFFSET MESG;设置偏移量MOV CX,07H ;循环次数,对应7个状态LOP5:MOV DX,0EEE0H ;拨码开关状态控制显示速度IN AL,DX;读拨码开关状态给ALINC AL;自加1,预防全0时不便延时AND AL,07H;取低三位的值XOR AH,AH;高八位清零MOV DX,AX ;DX表示显示速度LOPZ:CALL DISP ;调用静态显示函数DEC DX ;DX为拨码开关后三位状态,自减1JNZ LOPZ ;DX不为0时继续显示;DX越大同一状态显示时间越长,速度越慢INC BX ;自加1,BX指向下一状态LOOP LOP5 ;循环7次,实现滚动效果JMP LOP6 ;每次循环结束后回到第一个状态MAIN ENDP;-DISP PROC NEAR ;将静态显示封装为子程序PUSH CX;入栈保护 PUSH DXPUSH AXMOV BP,000AH ;控制延时LOPX:XOR SI,SIMOV CX,06H ;循环6次,即依次点亮6位数码管MOV DX,0EE00HMOV AH,B ;一次只亮一位LOP2:MOV AL,MESGBX+SI;需要显示的字符对应的码值赋给ALOUT DX,AL;完成段码输出MOV AL,AH ;控制第几个数码管工作INC DXOUT DX,AL ;完成位码输出DEC DXROL AH,1 ;下一个数码管工作INC SICALL DELAY ;调用延时函数实现每位数码管的延时显示CALL KEY ;调用判断键盘输入状态的函数LOOP LOP2 ;如此循环直至数码管依次被点亮DEC BP;自减1JNZ LOPX ;BP不为0则继续循环,即显示的字符串不变POP AX;出栈恢复POP DXPOP CXRET DISP ENDP;- KEY PROC NEAR ;判断是否有键盘输入PUSH AX;入栈保护MOV AH,0BHINT 21H;DOS调用,将键盘输入信息赋给ALOR AL,ALJZ GOON ;若没有输入则继续工作MOV DX=0EE00HMOV AL,00H;若有输入则六个数码管均不工作OUT DX,ALMOV AH,4CH ;退出程序INT 21HGOON:POP AXRETKEY ENDP ;-DELAY PROC ;控制延时,两层循环PUSH AX;入栈保护PUSH CXMOV AX,000BH ;外循环0BH次LOPD: MOV CX,0HLOOP $ ;内循环FFFF次DEC AXJNZ LOPD POP CXPOP AX RETDELAY ENDP ;- CODE ENDSEND MAIN3.4 子程序清单1)子程序名:DELAY功能:实现延迟显示,即控制每个LED点亮持续一定时间;入口参数:无;出口参数:无;使用寄存器:AX,CX,FR。2)子程序名:KEY功能:判断是否有键盘输入,若有则退出程序;入口参数:无;出口参数:无;使用寄存器:AX,DX,FR。3)子程序名:DISP功能:静态显示6位指定字符;入口参数:无;出口参数:无;使用寄存器:AX,CX,DX,SI,BP,FR。3.5 代码分析1)动态显示的过程可以分为七个状态,在每个状态中,静态显示六位数码管信息。系统循环进行这七个状态,当速度合适时有动态显示的效果。2)在数据段中定义MESG数组,依次存入“0,0,0,0,0,0,3DH,0DCH,8CH,8CH,0EDH,0”;CX表示循环次数,对应表中的七个状态;BX表示当前需要显示的状态,DX表示动态显示的速度。3)将静态显示的程序封装为子程序以供调用,在每个状态中调用子程序DISP实现六位数码管的静态显示,调用子程序DELAY实现延时,调用子程序KEY判断键盘有无输入。4)每个状态结束时,BX加1,表示进入下一状态,如此循环完成数码管的动态显示。5)主程序中通过读取拨码开关状态,将其后三位赋给DX,并在子程序DISP返回时,自减实现延时。DX越大,循环时间越久,则对应的滚动速度越慢。6)若循环一个周期仍无键盘输入,则回到第一个状态重新循环,直至有键盘输入。4 扩展:显示键盘输入学号4.1 实验原理通过4*4键盘电路输入学号,其控制原理如下:1)通过地址为EE02的端口C读取键盘输入,其中PC4、PC5、PC6、PC7分别接行输入,PC3、PC2、PC1、PC0分别接列输入。此外,本次实验识别闭合键的方法为行扫描法,具体方法为使键盘某一行线为低电平,其余为高电平,然后读取列值,如列值中有某位位低电平,则表明行列交叉点处的键被按下;否则扫描下行,直到扫完全部的行线为止。另外,在读取按键输入时需增添相应的防抖代码,以避免读取误差。2)基于上述方法,获得低电平的行列交叉点为按键输入,反馈其对应的数字至数码显示输出或执行相应的功能。4.2 流程图1)主程序流程图2)READ子程序4.3 源代码DATA SEGMENTID DB 6 DUP(0);4*4键盘ARRAY DB B,B,B,BDB B,B,B,BDB B,B,B,BDB B,B,B,BKEY DB 0EDH,21H,0F4H,0F1H,39H ;数字04对应码表DB 0D9H,0DDH,61H,0FDH,0F9H ;数字59对应码表 DATA ENDS ;-STACK SEGMENT STACK STACKDB 100 DUP(0)STACK ENDS ;-CODE SEGMENTASSUME DS:DATA,CS:CODE,SS:STACK ;- MAIN PROC FARMOV AX,DATAMOV DS,AX;设置段地址MOV ES,AXMOV DX,0EE03H MOV AL,16H;C口PC3复位OUT DX,ALCLEAR:XOR DX,DX ;DX表示已显示/存储数字的个数MOV CX,6;循环次数,表示最多显示/存储的数字个数MOV AL,0XOR SI,SILOPC: MOV IDSI,AL ;将6位ID清零 INC SILOOP LOPCDELETE:NOPAGN1: CALL READ ;读入按键信息CMP AL,0FFH ;判断是否释放按键(防抖动)JNE AGN1 ;未释放则循环 CMP DX,0 ;当前没有显示数字时跳过删除操作JE NEXTDEC DX ;将存储的数字减少一位MOV AL,0MOV SI,DXMOV IDSI,AL ;将显示的最后一位数字清零 NEXT:CALL DISP ;调用静态显示函数CALL READ ;调用读取键盘函数CMP AL,0FFH ;判断键盘是否有输入JE NEXT ;没有输入则循环保持原状;键盘有输入CLD ;设置字符串操作时DI自动加一MOV CX,16;循环次数,表示键盘16个按键MOV DI,OFFSET ARRAY REPNZ SCASB ;寻找输入的按键在键盘中的位置 MOV BX,OFFSET ARRAYSUB DI,BXDEC DI;DI表示输入按键的位置CMP DI,9 ;判断键入是否为数字JBE ISNUM ;跳转到显示数字对应程序CMP DI,12;判断键入是否为清除键(C)JE CLEAR ;跳转到清除对应程序CMP DI,13 ;判断键入是否为删除键(D)JE DELETE;跳转到删除对应程序CMP DI,14;判断键入是否为退出键(E)JE EXIT ;跳转到退出对应程序JMP NEXT ISNUM:NOPAGN2: CALL READ ;读入按键信息CMP AL,0FFH ;判断是否释放按键(防抖动)JNE AGN2 ;未释放则循环 ;释放则进行对应操作MOV AL,KEYDIMOV SI,DXMOV IDSI,AL ;将输入数字储存起来INC DXCALL DISP;调用静态显示函数CMP DX,7 ;判断是否已经显示6位数字JE CLEAR;若已经显示6位数字,则下一次输入时清零JMP NEXTEXIT:MOV AX,4C00H;退出程序INT 21HMAIN ENDP ;-READ PROC NEAR ;读取键盘输入PUSH DX;入栈保护MOV DX,0EE03H;A口、B口以及C口的高四位以方式0输出,;C口低四位以方式0输入MOV AL,81HOUT DX,ALMOV AL,00HMOV DX,0EE02HOUT DX,AL;C口高四位清零IN AL,DX ;读取列信息 MOV BL,AL;存储列信息;-MOV DX,0EE03H;A口、B口以及C口的低四位以方式0输出;C口高四位以方式0输入MOV AL,88HOUT DX,ALMOV AL,00HMOV DX,0EE02HOUT DX,AL;C口低四位清零IN AL,DX ;读取行信息OR AL,BL ;行列相与得到输入信息,存在AL中POP DX;出栈恢复RET READ ENDP;-DISP PROC NEAR ;静态显示程序PUSH CX;入栈保护PUSH DXPUSH AXMOV BP,000FH;控制延时LOPP:XOR SI,SIMOV CX,06H;循环6次,即依次点亮6位数码管MOV DX,0EE00HMOV AH,B;一次只亮一位LOPD:MOV AL,IDSI;需要显示的字符对应的码值赋给ALOUT DX,AL;完成段码输出MOV AL,AH ;控制第几个数码管工作INC DXOUT DX,AL ;完成位码输出DEC DXROL AH,1;下一个数码管工作INC SICALL DELAY ;调用延时函数实现每位数码管的延时显示LOOP LOPD;如此循环直至数码管依次被点亮DEC BP ;自减1JNZ LOPP ;BP不为0则继续循环,即显示的字符串不变POP AX ;出栈恢复POP DXPOP CXRET DISP ENDP;- DELAY PROC ;控制延时,两层循环PUSH AX ;入栈保护PUSH CX MOV AX,0003H;外循环03H次LOP1: MOV CX,00HLOOP $;内循环FFFF次DEC AXJNZ LOP1 POP CXPOP AX RETDELAY ENDP ;- CODE ENDSEND MAIN4.4 子程序清单 1)子程序名:READ功能:读取键盘输入信息,反馈给主程序;入口参数:无;出口参数: AL,存储键盘输入信息,反馈给主程序使用寄存器:AX,BL,DX。2)子程序名:DISP功能:静态显示指定字符;入口参数:无;出口参数:无;使用寄存器:AX,CX,DX,SI,BP,FR。3)子程序名:DELAY功能:实现延迟显示,即控制每个数码管点亮持续一定时间;入口参数:无;出口参数:无;使用寄存器:AX,CX,FR。4.5 代码分析1) 将4*4键盘各按键对应的输入信息按顺序存储在ARRAY中,数码管中数字0-9对应的码表存储在KEY中,定义数组ID,用以存储键盘输入的信息。2) 主程序开始时先进行初始化,清空各存储器信息,调用READ子程序,读取键盘按键。将4*4键盘输入送至端口C,先将C口高四位清零,低四位输入至AL中,并将AL赋值给BL,再将C口低四位清零,高四位输入至AL中,BL与AL相与,获得最终输入信息并存储在AL中反馈给主程序。3) 对键盘输入采用防抖程序,当读取到键盘有输入时,读取之后判断该按键是否释放,若该按键未释放,则一直循环读取直至释放后开始之后相应的代码执行。通过防抖程序,避免了一次按键多次显示的现象的出现。4) 主程序获得输入信息后,在ARRAY数组中寻找与之相同的输入信息,从而获得键盘输入的按键在键盘中的位置。5) 若键盘输入为数字0-9,则将其对应的码送入ID中存储,并调用DISP子程序显示,若键盘输入为清零、删除、退出等子程序,则进入相应的子程序完成其待完成的功能。6) 若键盘为显示满6个字符,则继续上述步骤,读取键盘信息,判断位置,送入ID中存储或执行相应功能;若键盘显示已满6个字符,则调用清零程序,将ID中内容清空,数码管不显示数字。7) 重复执行上诉程序,直到键盘输入退出时退出程序。四 实验总结本次试验中的四个实验为循序渐进的过程,因为本次实验板的数码管段码与之前的VHDL不同,在第一个实验中我们测试获得了正确的段码,使得后续程序得以顺利的编写。本次试验相对复杂,但是因为前期我们对显示延时、滚动显示有一定的基础,在确认代码流程、明确各寄存器与输入输出关系的基础上,我们对延时参数、循环次数等进行了多次修改,以达到较好的显示效果,最终成功完成了实验,使得我们的汇编语言编写及硬件实验能力有了更进一步的提高。实验三 8253计数器/定时器的应用一 实验目的实现掌握8253用作定时器的编程原理二 实验内容1完成一个音乐发生器,通过蜂鸣器放出音乐,并在数码管上显示乐谱。音符频率对照如下:音符1(do)2(re)3(mi)4(fa)5(so)6(la)7(si)i(do)频率256288320341384426.64805122扩展部分:利用小键盘实现弹琴功能,并显示弹奏的乐谱。三 实验过程1 蜂鸣器发音规律测试:在Debug状态下,用“O”命令测试8353的发生功能,3组通道工作是否正常。电路按照如下方式连接: 1) 8253的CS接译码器输出Y1 其地址为EE20-EE27H2) 8253的OUT接蜂鸣器的BELL端3) 8253的门控信号GATE接+5V4) 8253的CLK端接Q7(32KHz)5) 清零复位电路中的T/C端接地(或接RESET端)注意:由于8253计数速率应小于2MHz,CLK0的输入信号必须由8MHz经393分频到小于2MHz后使用。393分频之后,Q0输出为4MHz,Q1输出为2MHzQ7输出32KHz。按照上述连接方式连接电路图,根据教材中所列各音符对应的蜂鸣器频率,根据计数器的性质,利用下列公式,计算分频系数为计数初值:不难得出七种音符在高中低音阶时计数器对应的计数值,绘制为下表:对应的编码,如下表:1(do)2(re)3(mi)4(fa)5(so)6(la)7(si)低音1221089791817264中音61544845403632高音30272422201816后续实验的展开均基于上表规律。2 音乐发生器2.1 实验原理1) 微机系统使用的8253,其3个通道均有固定的用途:0号计数器为系统时钟源,每隔55ms向系统主8259IR0提一次中断请求;1号计数器用于动态存储器的定时刷新控制;2号计数器为系统的发声源。2) 用户在使用微机系统的时候,可以使用0号和2号计数器,但不能改变对1号计数器的初始化。实验箱上的8253,其数据线D7D0,地址线A1、A0和控制线RD、WR通过总线驱动卡和微机系统的三总线相连。3) 除此之外,三个计数器的引出段和片选端都是悬空的,这意味着实验箱上的8253的三个计数器都归用户使用,可以单独使用其中的一个计数器,也可以串联使用其中的2个或3个计数器。8253计数器的输入信号,其频率不能超过2MHz,否则长时间使用,芯片过热。4) 8253使用之前,需先对其进行初始化编程,其步骤分为向控制寄存器端口写入控制字对使用的计数器规定其使用方法,向使用的计数器端口写入计数初值。8253的控制字控制规律如下:D7D6D5D4D3D2D1D0计数器选择读写方式选择工作方式选择数制选择D7D600:使用0号计数器,D7D601:使用1号计数器D7D610:使用2号计数器,D7D611:无效D5D400:锁存当前计数值D5D401:只写低8位(高8位为0),读出时只读低8位D5D410:只写高8位(低8位为0),读出时只读高8位D5D411:先读/写低8位,后读/写高8位计数值D3D2D1000:选择方式0,D3D2D1001:选择方式1D3D2D1X10:选择方式2,D3D2D1X11

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论