当前位置: 首页 > news >正文

汇编语言与接口技术--矩阵按键

一、 实验要求

1.利用单片机开发板的矩阵键盘实现个人学号后8位的输入和显示

2.利用矩阵键盘S1~S10输入数字1~0

3.利用数码管LED8~LED1从左到右显示8位学号

二、 实验设计

 1.整体思路

初始化一些存储单元(40H - 47H)为特定值,设置堆栈指针(SP)和一个计数器(R7)。跳转到KEY2标签处开始主要的按键检测和处理逻辑。在按键检测过程中,通过不断调用子例程检查按键状态,根据不同的按键情况进行相应的处理,包括确定按下的键值、更新显示内容等。

2.流程图

从开始处初始化一些存储单元和寄存器,然后跳转到KEY2。

在KEY2中,调用KS检测按键状态,如果有按键按下则进行后续处理,否则循环等待。

如果KS检测到有按键按下,会依次经过K1和K2的处理,设置一些寄存器的值。

进入K3后,根据端口P1的不同位状态判断按下的键值,将键值入栈并跳转到LK。

在LK中,等待按键释放,然后从数据表中读取一个值并根据R7的值将其存入不同的存储单元。

KS子例程用于检测按键状态,DisPlay子例程用于显示存储单元的内容,D10ms子例程用于实现延迟。         

3.主要模块设计思路及分析

(1)初始化部分

将内存地址 40H 到 47H 的存储单元初始化为 3FH。这可能是为后续的显示操作做准备,3FH 可能代表某种初始显示状态。

设置堆栈指针SP为 60H,确保程序有足够的堆栈空间。

将寄存器R7初始化为 7,这个寄存器可能在后续的循环或计数操作中使用。

 

 (2)KEY2模块

首先调用KS子例程,可能是用于检测按键状态。如果有按键按下(JNZ判断结果为非零),则跳转到K1标签处处理按键事件;如果没有按键按下,则调用D10ms和DisPlay子例程进行一些延迟和显示操作,然后回到KEY2继续等待按键。

(3)K1和K2模块

K1模块在检测到可能有按键按下后,再次进行延迟和按键检测确认。如果确认有按键按下,则跳转到K2模块;否则回到KEY2继续等待。

K2模块初始化寄存器R2为 0F7H 和R4为 00H,可能用于后续的按键扫描操作。

(4) K3及相关按键判断模块

K3模块将R2的值输出到端口P1,然后根据端口P1不同位的状态判断按下的是哪个按键。如果是特定的位为低电平,则将对应的键值存入累加器A,并将A的值入栈,然后跳转到LK标签处进行后续处理。

如果没有检测到有效的按键按下,则进入NEXT模块。在NEXT模块中,递增R4寄存器,检查R2的最低位是否为 0,如果是则回到KEY2继续等待按键;如果不是,则对R2进行循环右移操作,然后回到K3继续进行按键扫描。

(5) LK模块

在LK模块中,再次调用KS子例程检测按键状态,并调用DisPlay子例程进行显示。如果有按键按下(JNZ判断结果为非零),则继续在这个模块循环等待按键释放。

当按键释放后,从栈中弹出一个值存入累加器A。然后设置数据指针DPTR指向一个数据表(Value),将A的值与R4的值相加,根据这个结果从数据表中读取一个值存入累加器A,并将A的值再次入栈。

(6) 按键值处理模块(NUM7到NUM0和NUM)

这个模块根据R7的值,将从数据表中读取的值存入不同的存储单元(40H - 47H)。每个标签(NUM7到NUM0)对应不同的存储单元,通过比较R7的值来确定要存储的位置。

最后,递减R7寄存器,调用DisPlay子例程进行显示,然后跳转到KEY2继续等待下一次按键事件。

(7) KS模块

KS模块将 0F0H 输出到端口P1,读取端口P1的值存入累加器A,然后将A与 0F0H 进行异或操作。这个操作可能是用于检测按键状态,通过特定的逻辑判断是否有按键按下。

(8) DisPlay模块

DisPlay模块用于显示存储在 40H - 47H 中的内容。通过设置端口P2和P0的值,依次将不同存储单元的值输出到某个显示设备上,并在每次输出后调用D10ms子例程进行短暂的延迟。

(9) D10ms模块

D10ms模块实现了一个大约 10 毫秒的延迟。通过两层循环,利用寄存器R3和R4进行计数,达到一定的延迟时间。在延迟过程中,保存和恢复一些寄存器的值,以确保程序的其他部分不受影响。

       

三、 实现效果

 

四、总结

1. 在实验过程中可能会出现各种错误,例如指令执行结果与预期不符、程序无法正常运行等。由于汇编语言的调试相对困难,没有高级语言那样的调试工具,定位错误变得更加具有挑战性。

2. 首先仔细检查代码中的语法错误,确保指令的正确书写和寄存器、内存地址的正确使用。然后通过逐步执行代码,观察寄存器和内存单元的变化,分析程序的执行路径,找出可能出现问题的地方。可以使用模拟器或调试工具来辅助调试,例如设置断点、单步执行等。

3. 在实验过程中遇到了各种问题,通过不断地分析和调试,提高了我的问题解决能力和逻辑思维能力。学会了如何从错误中吸取教训,找到问题的根源并采取有效的解决方法。实验中涉及到与硬件接口的交互,使我对硬件与软件的协同工作有了更直观的认识。了解了如何通过软件控制硬件接口,实现特定的功能,以及硬件接口的状态如何影响软件的执行。

相关文章:

  • Go语言入门指南
  • HTTPS协议
  • 设计模式 - 单例模式
  • C Primer Plus第五章习题
  • 如何通过Bigemap Pro实现面合并和相交
  • 强化学习能让小模型多恐怖?
  • 文献阅读 250219-Global water availability boosted by vegetation-driven changes (1)
  • 记录 pycharm 无法识别提示导入已有的模块解决方案 No module named ‘xxx‘
  • Redis 客户端C++使用
  • DeepSeek R1与互联网医院的深度融合:金医慧通案例的创新实践与启示
  • jenkins+docker自动发版java后端完整流程
  • 深度学习-3.深度前反馈网络
  • Docker 实战应用
  • Hackthebox- Season7- Titanic 简记 [Easy]
  • Starlink卫星动力学系统仿真建模番外篇6-地球敏感器
  • “深入浅出”系列之杂谈篇:(3)Qt5和Qt6该学哪个?
  • 2000字,极简版华为数字化转型方法论
  • 常用安全哈希算法bcrypt
  • 汽车免拆诊断案例 | 2010 款路虎揽胜车空调偶尔出风异常
  • C#应用程序重启实现
  • 恒生银行回应裁员传闻:受影响的员工数目占银行核心业务员工总数约1%
  • 国防部:菲方应停止一切侵权挑衅危险举动,否则只会自食苦果
  • 为什么越来越多景区,把C位留给了书店?
  • 佩斯科夫:俄方代表团15日将在伊斯坦布尔等候乌克兰代表团
  • 广东早熟荔枝“抢滩”上海,向长三角消费者喊话:包甜,管够
  • 习近平致电祝贺阿尔巴尼斯当选连任澳大利亚总理