MOV BP,0044H ;控制显示速度
LOPX:XOR SI,SI
MOV CX,06H ;每次记录六个数码管的状态 MOV DX,0E800H ;从外部设备读入数据 MOV AH,00000001B ;每次显示一个数码管 LOP2:MOV AL,MESG[BX+SI] OUT DX,AL
MOV AL,AH ;决定显示哪一个数码管 INC DX
OUT DX,AL ;控制哪一个LED灯亮 DEC DX
ROL AH,1 ;使得下一个LED灯亮 INC SI
CALL DELAY ;调用延时子程序 CALL KEY ;检验按键是否有输入
LOOP LOP2 ;循环执行LOP2直到所有六个数码管都被点亮 DEC BP
JNZ LOPX ;外层循环,控制显示时间 POP AX POP DX POP CX
16
RET DISP ENDP
;返回DOS子程序--------------------------------------------- KEY PROC NEAR ;检测键盘输入 PUSH AX MOV AH,0BH INT 21H OR AL,AL
JZ GOON ;没有键盘输入则跳向GOON MOV AH,4CH ;有任意输入则返回DOS INT 21H GOON:POP AX RET KEY ENDP
;延时子程序-------------------------------------------------- DELAY PROC PUSH AX PUSH CX
MOV AX,0002H ;外层循环 LOPD: MOV CX,0H
LOOP $ ;内层循环 DEC AX
17
JNZ LOPD POP CX POP AX RET DELAY ENDP
CODE ENDS END MAIN
五、实验心得与体会:
这次的实验里我学习了使用8255芯片进行并口接口的应用,先用了I/O命令检测出了数码管的显示规律和段选规律。在实际编写代码时,应该时刻都记住实际上数码管显示图形时,我们看到多个数码管的显示都是逐个选通。应该给数码管加入高于24*6Hz的始终使得人眼无法分清数码管是被依次点亮。在HELLO的动态显示时,这个问题更加复杂,不仅需要在每次显示时数码管被逐个点亮,还需要在每经过一个显示周期,HELLO字符都左移1位,这无法通过二进制数的左右移位实验,而需要另外编写代码。另外还需要注意就是在实验中,每次换下一个数码管显示的时候还会显示之前数码管已经显示的字符,需要将原来的显示清零,才能呈现出所需的左右移动的变化过程。
本次过程经过多次调试,另外还经历了电脑死机、板子失灵、无法返回DOS等问题的干扰。但最终我和组员能够相互协作,并且认真分析一些bug出现的原因,并且及时分析修改代码,使得我们能最终顺利完成实验,收获颇丰。
实验三 8253计数器/定时器的应用
一、实验目的:
18
学习掌握8253用作定时器的编程原理
二、实验内容:
1. 完成一个音乐发生器,通过蜂鸣器放出音乐,并在数码管上显示乐谱。
三,电路测试与连接
测试:在Debug状态下,用“O”命令测试8353的发生功能,3组通道工作是否正常。 电路连接: 8253的CS接译码器输出Y1 其地址为E820-E827H 8253的OUT接蜂鸣器的BELL端 8253的门控信号GATE接+5V 8253的CLK端接Q7(32KHz)
清零复位电路中的T/C端接地(或接RESET端)
注意:由于8253计数速率应小于2MHz,CLK0的输入信号必须由8MHz经393分频到小于2MHz后使用。393分频之后,Q0输出为4MHz,Q1输出为2MHz??Q7输出32KHz。 编程提示:
1.8253控制端口地址为E823H 定时器0地址为E820H 定时器1地址为E821H 定时器2地址为E822H 2.定时器可工作在方式3下。
四、程序流程图: 软件程序流程图:
19
开始 8255初始化 8253A初始化 设置数码管选通信号 调用音阶子程序,并且读N
入拨码开关,蜂鸣器发声,键盘有输入? Y 结束
硬件连线图:
五、源程序代码:
20