当前位置: 首页 > 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.dtcms.com/a/199570.html

相关文章:

  • Linux问题排查-找到偷偷写文件的进程
  • 服务器的基础知识
  • 软件设计师完整性约束考点分析——求三连
  • AIGC与文本生成:人工智能写作的新纪元
  • Go语言测试用例的执行与分析
  • Git基础面试题
  • 【大模型面试每日一题】Day 23:如何设计一个支持多模态(文本+图像)的大模型架构?
  • Hadoop中 8020、9000、50070 端口用途的详细对比
  • 云计算与大数据进阶 | 26、解锁云架构核心:深度解析可扩展数据库的5大策略与挑战(下)
  • mariadb 升级 (通过yum)
  • Profinet转Ethernet IP主站网关:点燃氢醌生产线的智慧之光!
  • 践行“科学智能”!和鲸打造 AI for Science 专属应用
  • 关于能管-虚拟电厂的概述
  • 爬虫攻防战:从入门到放弃的完整对抗史与实战解决方案
  • NFT市场开发技术全解析:从架构设计到实现
  • verify_ssl 与 Token 验证的区别详解
  • [Java][Leetcode middle] 151. 反转字符串中的单词
  • 研读论文《Attention Is All You Need》(7)
  • Axure难点解决分享:垂直菜单展开与收回(4大核心问题与专家级解决方案)
  • LeetCode 35 搜索插入位置题解
  • 力扣HOT100之二叉树:230. 二叉搜索树中第 K 小的元素
  • python-leetcode 67.寻找两个正序数组中的中位数
  • MySQL数据库基础 -- SQL 语句的分类,存储引擎
  • Django框架的前端部分使用Ajax请求一
  • 【数根】2022-1-24
  • Vue 中 v-model 的三种使用方式对比与实践
  • C++23 std::mdspan:多维数组处理新利器
  • 【第二届帕鲁杯】第二届帕鲁杯 主环境 基本完整wp
  • linux安装conda环境-ubuntu
  • ECharts-饼图