在8086系统中用汇编语言写一个钢琴键盘,利用中断实现,要求只需要8个键位按键盘上的顺序从‘A'到’K',对应C调到

时间: 2023-06-17 22:04:30 浏览: 25
下面是一个简单的钢琴键盘程序,按下对应的键位可以发出对应的音符。 ```assembly .model small .stack 100h .data keymap db 0,0,0,0,0,0,0,0 keyindex db 0 toneTable dw 3822, 3405, 3033, 2863, 2551, 2272, 2024, 1911, 1703, 1517, 1432 ; C5, D5, E5, F5, G5, A5, B5, C6, D6, E6, F6 ; toneTable 中的值分别对应 C 调中的 C D E F G A B C D E F 音符的频率 .code mov ax, @data mov ds, ax ; 初始化键盘映射表 mov cx, 8 mov di, offset keymap mov al, 'A' init_keymap: stosb inc al loop init_keymap ; 初始化键盘中断 mov ax, 0 mov es, ax mov word ptr es:[9*4], offset keyboardHandler mov word ptr es:[9*4+2], cs mov ah, 25h mov al, 9 int 21h ; 设置音符输出端口 mov al, 10110000b out 43h, al mov ax, 3577 out 42h, al mov al, ah out 42h, al ; 主循环 mainLoop: mov ah, 0 int 16h cmp ah, 0 je mainLoop ; 检查按键是否在键盘映射表中 mov bl, ah mov bh, 0 mov di, offset keymap mov cx, 8 check_key: cmp [di], bl je found_key inc di inc bh loop check_key jmp mainLoop ; 找到按下的键位在键盘映射表中的索引 found_key: mov [keyindex], bh ; 输出对应的音符 mov si, offset toneTable mov cx, [keyindex] shl cx, 1 add si, cx mov ax, [si] out 0x61, al mov al, inportb(0x61) or al, 3 out 0x61, al ; 等待音符发射完毕 mov cx, 1000 wait: loop wait ; 关闭音符输出端口 mov al, 10110000b out 43h, al mov ax, 0 out 42h, al out 42h, al jmp mainLoop keyboardHandler: push ax push bx push cx push dx ; 读取键盘状态 in al, 60h mov ah, al mov al, 20h out 20h, al ; 检查按键是否释放 test ah, 80h jnz keyboardHandler_exit ; 发送键码到主程序 mov ah, 0 mov al, [keymap+ah] stosb keyboardHandler_exit: pop dx pop cx pop bx pop ax iret end ``` 这个程序中,键盘中断处理程序会将按下的键码存储到 `keymap` 数组中。主程序会在每次循环中检查 `keymap` 数组,如果有键码被存储则会根据键码输出对应的音符。音符的控制使用了 x86 中的可编程中断控制器。程序中使用的音符频率表是 C 调中的音符频率表,可以根据需要修改。 注意,在运行此程序时需要将其编译成 DOS 可执行文件,并在 DOS 环境下运行。另外,这个程序只是一个简单的示例,实际的钢琴键盘程序可能需要更复杂的音符控制和键盘映射逻辑。

最新推荐

在Visual Studio中用C++语言创建DLL动态链接库图文教程

主要介绍了在Visual Studio中用C++语言创建DLL动态链接库图文教程,本文详细讲解了DLL库的创建过程,并给出了代码示例,需要的朋友可以参考下

新能源汽车行业专题报告:电动智能化的自主可控与新动能.pdf

新能源汽车行业专题报告:电动智能化的自主可控与新动能.pdf

区域销售额统计报表.xlsx

区域销售额统计报表.xlsx

固定资产移转表.xlsx

固定资产移转表.xlsx

基于51单片机的usb键盘设计与实现(1).doc

基于51单片机的usb键盘设计与实现(1).doc

"海洋环境知识提取与表示:专用导航应用体系结构建模"

对海洋环境知识提取和表示的贡献引用此版本:迪厄多娜·察查。对海洋环境知识提取和表示的贡献:提出了一个专门用于导航应用的体系结构。建模和模拟。西布列塔尼大学-布雷斯特,2014年。法语。NNT:2014BRES0118。电话:02148222HAL ID:电话:02148222https://theses.hal.science/tel-02148222提交日期:2019年HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire论文/西布列塔尼大学由布列塔尼欧洲大学盖章要获得标题西布列塔尼大学博士(博士)专业:计算机科学海洋科学博士学院对海洋环境知识的提取和表示的贡献体系结构的建议专用于应用程序导航。提交人迪厄多内·察察在联合研究单位编制(EA编号3634)海军学院

react中antd组件库里有个 rangepicker 我需要默认显示的当前月1号到最后一号的数据 要求选择不同月的时候 开始时间为一号 结束时间为选定的那个月的最后一号

你可以使用 RangePicker 的 defaultValue 属性来设置默认值。具体来说,你可以使用 moment.js 库来获取当前月份和最后一天的日期,然后将它们设置为 RangePicker 的 defaultValue。当用户选择不同的月份时,你可以在 onChange 回调中获取用户选择的月份,然后使用 moment.js 计算出该月份的第一天和最后一天,更新 RangePicker 的 value 属性。 以下是示例代码: ```jsx import { useState } from 'react'; import { DatePicker } from 'antd';

基于plc的楼宇恒压供水系统学位论文.doc

基于plc的楼宇恒压供水系统学位论文.doc

"用于对齐和识别的3D模型计算机视觉与模式识别"

表示用于对齐和识别的3D模型马蒂厄·奥布里引用此版本:马蒂厄·奥布里表示用于对齐和识别的3D模型计算机视觉与模式识别[cs.CV].巴黎高等师范学校,2015年。英语NNT:2015ENSU0006。电话:01160300v2HAL Id:tel-01160300https://theses.hal.science/tel-01160300v22018年4月11日提交HAL是一个多学科的开放获取档案馆,用于存放和传播科学研究文件,无论它们是否已这些文件可能来自法国或国外的教学和研究机构,或来自公共或私人研究中心。L’archive ouverte pluridisciplinaire博士之路博士之路博士之路在获得等级时,DOCTEURDE L'ÉCOLE NORMALE SUPERIEURE博士学校ED 386:巴黎中心数学科学Discipline ou spécialité:InformatiquePrésentée et soutenue par:马蒂厄·奥布里le8 may 2015滴度表示用于对齐和识别的Unité derechercheThèse dirigée par陪审团成员équipe WILLOW(CNRS/ENS/INRIA UMR 8548)慕尼黑工业大学(TU Munich�

valueError: Pandas data cast to numpy dtype of object. Check input data with np.asarray(data).

这个错误通常发生在使用 Pandas DataFrame 时,其中包含了一些不能被转换为数字类型的数据。 解决方法是使用 `pd.to_numeric()` 函数将数据转换为数字类型。例如: ```python import pandas as pd import numpy as np # 创建一个包含字符串和数字的 DataFrame df = pd.DataFrame({'A': ['a', 'b', 'c'], 'B': [1, 2, '3']}) # 尝试将整个 DataFrame 转换为数字类型会报错 np.asarray(df, dtype=np.float) # 使