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

汇编:电子计数器

一、 实验要求

  1. 掌握数码管显示方式
  2. 掌握软件延时方法
  3. 掌握键盘扫描及去抖动方法

二、 实验设计

 1.整体思路

  • 主循环中,先检查K1是否被按下。若K1被按下,计数器R1加1,并跳转到显示部分。若K1未被按下,则继续执行下一步。
  • 检查K2是否被按下。若K2被按下,计数器R1减1,并跳转到显示部分。若K2未被按下,则继续执行下一步。
  • 检查是否长按K1。若K1被长按,计数器R1会连续加1,直到K1被松开。若K1按键未被长按,则跳转回主循环。
  • 显示部分将计数器R1的值通过数码管显示出来。首先点亮LED3(百位),然后通过除法运算获取百位的值,并在数码管显示表中查找对应的值,最后将该值输出到P0口供数码管显示。接着依次点亮LED2(十位)和LED1(个位),并进行相应的除法运算和数码管显示操作。
  • 最后,通过延时函数控制数码管的稳定性,然后跳转回主循环,继续执行按键检测和数码管显示操作。

2.流程图

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

(1)MAIN模块

  • 检查K1按键是否被按下,如果按下则执行加1操作并跳转到DISPLAY部分进行数码管显示。
  • 如果K1未被按下,检查K2按键是否被按下,如果按下则执行减1操作并跳转到DISPLAY部分进行数码管显示。
  • 如果K1和K2都未被按下,则继续检查K1是否长按,如果长按则连续执行加1操作。

(2)DISPLAY模块:

  • 首先,根据R1的值计算百位、十位和个位,并通过移位操作将各位数值依次送入P0口以控制数码管的显示。
  • 每次显示完一位数字后,调用DELAY延时函数以确保数码管有足够的响应时间。
  • 最后,跳转回MAIN继续循环执行按键检测和数码管显示。

         

三、 实现效果

四、 总结

  1. 延时函数在这个代码中用于产生一定的延时,以确保LED的显示稳定。但是一开始写的代码都无法运行,最后采用了同学的延时函数代码。
  2. 关于显示函数,采用了之前学习C语言时编写函数的思路,通过个十百位分别除以0、10、100来取各个位最终应该显示的数字。
  3. 通过这次实验我学会了如何利用单片机的I/O端口控制外围设备(LED和数码管),并通过按键输入来控制计数器的增减。
ORG 0000HMOV R1, #0 ; 初始化R1为0MAIN:; 检查K1是否被按下MOV P3, #0FFHMOV A, P3CPL A																													  	JNB ACC.0, CHECK_K2 ; 跳转到检查K2是否被按下; K1被按下,计数器加1INC R1LJMP DISPLAYCHECK_K2:; 检查K2是否被按下MOV P3, #0FFHMOV A, P3CPL AJNB ACC.1, CHECK_K1 ; 跳转到检查K1是否被按下; K2被按下,计数器减1DEC R1LJMP DISPLAYCHECK_K1:; 检查是否长按K1MOV P3, #0FFHMOV A, P3CPL AJNZ MAIN ; 如果没有按键输入,则返回主循环; K1长按,连续加1MOV P3, #0FFHMOV A, P3CPL AJZ CHECK_K1 ; 继续检查是否长按K1DISPLAY:MOV P2, #8 ; 点亮LED3(百位)MOV A, R1 MOV B, #100DIV ABMOV DPTR, #TABLEMOVC A, @A+DPTRMOV P0, ALCALL DELAYMOV P2, #4 ; 点亮LED2(十位)MOV A, BMOV B, #10DIV ABMOVC A, @A+DPTRMOV P0, ALCALL DELAYMOV P2, #0       ; 点亮LED1(个位)MOV A, BMOVC A, @A+DPTRMOV P0, ALCALL DELAYLJMP MAINDELAY:			  ;延时函数MOV R5, #100
DELAY0:MOV R6, #1
DELAY1:MOV R7, #20
DELAY2:DJNZ R7, DELAY2DJNZ R6, DELAY1DJNZ R5, DELAY0RETTABLE:DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H, 7FH, 6FH ; 数码管显示表END

http://www.xdnf.cn/news/534619.html

相关文章:

  • SCT2A10一款4.5V-85V 0.6A 高效率同步可调频率的降压DCDC转换器
  • Kubernetes高阶使用指南:深入探索容器编排的艺术
  • 基于大模型的手术全流程智能决策支持系统大纲
  • 关于systemverilog中在task中使用force语句的注意事项
  • 核保核赔的集中管理方案
  • GO语言学习(五)
  • 【C/C++】C++并发编程:std::async与std::thread深度对比
  • GPFS故障实际生产故障处理分析
  • 告诉我,pavucontrol的用法,我连接耳机的时候,输入设备应该使用什么呢?
  • AI神经网络降噪 vs 传统单/双麦克风降噪的核心优势对比
  • Ktransformers0.3框架的api访问接口程序
  • vue2.0 组件生命周期
  • LLaMA-Factory:了解webUI参数
  • Mysql 刷题 day06
  • Image and depth from a conventional camera with a coded aperture论文阅读
  • “保证医疗器械信息来源合法 真实、安全的保障措施、情况说明及相关证明”模板
  • 滑动窗口算法详解:从理论到实战(LeetCode 3 438)
  • 自动化测试的框架有哪些?原理是什么?
  • 深入掌握MyBatis:连接池、动态SQL、多表查询与缓存
  • springboot+mybatis或mybatisplus在进行%name%的前后模糊查询时如何放防止sql注入
  • 汇川MD810-20M4110GXXX变频器为什么要加GRJ9000S电源滤波器?
  • C# 深入理解类(属性)
  • python打卡day30
  • Navicat连接开启sm3认证的瀚高数据库
  • 网络请求和状态管理
  • SAP学习笔记 - 开发13 - CAP 之 添加数据库支持(Sqlite)
  • 《虚实共生:双向映射重塑具身智能决策逻辑》
  • 5.19 打卡
  • 存储系统02——Libevent事件循环
  • Interrupt 2025 大会回顾:关于LangChain 的 AI Agent会议内容总结