北邮微原硬件实验(4)

2020-02-21 22:56

DELAY PROC NEAR PUSH CX

MOV CX,100H WAIT0: LOOP WAIT0 POP CX RET DELAY ENDP

;延时子程序2

DELAY1 PROC NEAR PUSH CX

MOV CX,0FFFFH WAIT1: LOOP WAIT1 POP CX RET DELAY1 ENDP

;获取键盘输入值的子程序 KEY PROC NEAR

PUSH AX ;保护现场 PUSH CX PUSH DX

MOV CX,00H ;从第一行开始扫描 CHECK: MOV DX,28AH ;C口地址给DX MOV BX,OFFSET NUM ADD BX,CX MOV AL,[BX] OUT DX,AL ;防抖

IN AL,DX ;判断是否有键盘按下 MOV AH,AL CALL DELAY IN AL,DX CMP AL,AH

JNZ CHECK ;不相等说明为抖动,重新检测 ;判断按下的列

AND AL,0FH CMP AL,0FH JZ NEXT CMP AL,0EH JZ NEXT1 CMP AL,0DH JZ NEXT2 CMP AL,0BH

JZ NEXT3 MOV BX,01H JMP GOT NEXT: INC CX CMP CX,05H JNZ JUMP1

MOV CX,01H ;修改变量扫描下一行 JUMP1: JMP CHECK NEXT1: MOV BX,04H JMP GOT

NEXT2: MOV BX,03H JMP GOT

NEXT3: MOV BX,02H ;计算按下键盘的数值 GOT: SUB CX,01H MOV AL,CL MOV DL,04H MUL DL ADD BL,AL

SUB BL,01H ;此时BX中所存即为对应的偏移量 POP DX ;恢复现场 POP CX POP AX RET KEY ENDP ;主程序

START: MOV AX,DATA MOV DS,AX ;8253初始化 MOV DX,283H MOV AL,36H OUT DX,AL ;8255初始化

MOV DX,28BH MOV AL,81H ;C口输入 OUT DX,AL

MOV DX,289H ;B口位选数码管 MOV AL,01H OUT DX,AL ;扫描键盘

LOOP1: CALL KEY

CMP BX,0 ;按0播放音乐 JZ PLAY0

CMP BX,9 ;按9退出

JZ EXIT ;按1~8发出对应音

MOV CX,BX

MOV BX,OFFSET DIGITAL ;数码管显示音符 ADD BX,CX MOV AL,[BX]

MOV DX,288H ;A口输出 OUT DX,AL ;播放该音符

MOV BX,OFFSET FENPIN MOV AX,CX ADD AX,AX ADD BX,AX

;计数,先低八位后高八位 MOV AX,[BX] MOV DX,280H OUT DX,AL MOV AL,AH OUT DX,AL CALL DELAY1 CALL DELAY1

MOV DX,28AH ;C口输入 IN AL,DX ;检测键盘是否弹起

MOV AH,AL LOOP2: CALL DELAY IN AL,DX CMP AL,AH JZ LOOP2

;初始化8253,停止播放音乐 MOV AX,0H MOV DX,283H MOV AL,36H OUT DX,AL JMP LOOP1

;播放音乐

PLAY0: MOV CX,01H PLAY: PUSH CX ;读取音符,存于CX中

MOV BX,OFFSET MUSIC ADD BX,CX MOV AL,[BX]

MOV CL,AL MOV CH,0H ;数码管显示

MOV BX,OFFSET DIGITAL ADD BX,CX MOV AL,[BX] MOV DX,288H OUT DX,AL ;播放该乐符

MOV BX,OFFSET FENPIN MOV AX,CX ADD AX,AX ADD BX,AX

;计数,先低八位后高八位 MOV AX,[BX] MOV DX,280H OUT DX,AL MOV AL,AH OUT DX,AL POP CX

;延时,持续播放 MOV AX,90H LOOP3: CALL DELAY1 DEC AX

JNZ LOOP3

;乐曲未结束时,CX加1 INC CX

CMP CX,28H;共40个音符 JNZ JUM JMP LOOP1 JUM: JMP PLAY

EXIT: MOV AL,0 MOV DX,288H OUT DX,AL MOV AX,4C00H INT 21H

CODE ENDS END START

五、 实验结果

1. 按小键盘的0,播放预置音乐,数码管显示音符对应的数字1~8; 2. 按小键盘的1~8,分别发出do,re,mi,fa,so,la,si,高音do,数码管

显示按下的音符对应的1~8数字;

3. 按小键盘的9,数码管熄灭,放音停止,返回dos;

六、 实验总结

1. 在开始用MUSIC存乐谱实现了代码的多用性,可以直接在开头改变对

应数字来实现不同乐曲的演奏;

2. 开头用DIGITAL存数码管需要显示的0~8数字,数码管显示原理参考

实验三和四,不同点在于8255中C口为输入,B口位选数码管仅第一路亮;

3. 实验难点主要在小键盘与数码管,8254的连接控制。获得键盘输入值

的子程序参考了实验五的键盘扫描,其原理为先给第一行一个低电平,然后检测哪一列为低电平如第三列,则为坐标(1,3)的按键被按下。若所有列均无低电平则给第二行低电平重复上述检测; 4. 在代码中需加入延时程序以保证音乐播放的准确性;

5. 按键要加入防抖程序。原理为检测按键是否达到一定时长,如果达到

则为按键,否则判断为误触

七、 实验收获与心得体会

通过本次试验熟悉了可编程定时器/计时器的使用。通过键盘,8254,数码管的组合实现简单的电子琴功能。在本次试验中只使用了0至9十个按键,有机会可以完善,如不同的按键可以播放不同的乐曲等。此外,本实验中防抖非常重要,第一次连接试验箱试验时没有写入防抖程序导致按键发音不对,后加入按键防抖程序问题得以解决。这让我想到了数电实验用VHDL写打地鼠程序时也需要写防抖程序,体会到了编程的相通性以及编程中必须要面面俱到才能保证结果的正确稳定。

八、 思考题

写出8253计数初值,输入频率和输出频率的关系: 答:输出频率 = 输入频率/8253计数初值


北邮微原硬件实验(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:聪明的使者

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: