LED数码管显示独立按键次数

news/2025/3/31 18:17:19/文章来源:https://www.cnblogs.com/luckydoog/p/18798976

前言

目标

2个独立按键,按下K1,数码管显示的数字加1
按下K2,数码管显示的数字减1

效果

https://www.bilibili.com/video/BV1aXo9YxEhY

原理

  • 独立按键,用于控制数字的加减

  • 把完整的数字,分成若干数位显示

  • 构造一个函数 show_digit(pos,digit) , 可以在指定位置(0<=pos<=7), 显示指定的数(0<=digit<=9)

  • 利用视觉暂留效应,快速遍历一个完整数字的所有位,可以做到“同时”显示多位数字

参考

  • 4-2 动态数码管显示

  • 独立按键控制LED数码管 https://www.cnblogs.com/luckydoog/p/18798811

遇到的问题

1. 超过3位就无法显示

原因是红色框起来的地方,一开始写成了 pos%=3

属于是笔误

2. 残影

原因:根据江科大51单片机的教程,残影问题来自于两次位选之间,段数据未清零,导致第二个位置显示了前一个位置的字符,留下了残影

解决方法:可以通过在两次位选之间,进行 清零 来解决

3. 无法显示 超过 65535 的数

这是由于一开始这里的 digit 只用了 unsigned int 类型

而我们的51单片机上的 unsigned int 只有 16 位,表示范围 是 0 - 65535

解决方法

用 unsigned long 来定义 digit 变量,表示范围是 0 到 232-1

完整代码

#include <REGX52.H>
#include <INTRINS.H>#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned longunsigned char led_data[]={0x3F,  //"0"0x06,  //"1"0x5B,  //"2"0x4F,  //"3"0x66,  //"4"0x6D,  //"5"0x7D,  //"6"0x07,  //"7"0x7F,  //"8"0x6F,  //"9"
};void Delay1ms()	;
void Delay(int t);
void show(ulong digit);
void show_digit(uchar pos, uchar digit);void main()
{ulong digit = 0;while(1){if(0 == P3_1){Delay(10);while(0 == P3_1){//nop}Delay(10);  if(digit<99999999){digit++;}else{digit = 0;}}else if(0 == P3_0){Delay(10);while(0 == P3_0){//nop}Delay(10);  if(digit>0){digit--;}else{digit = 99999999;}}show(digit);}
}void Delay1ms()		//@11.0592MHz
{unsigned char i, j;_nop_();i = 2;j = 199;do{while (--j);} while (--i);
}void Delay(int t){int i = 0;for(i=0;i<t;i++){Delay1ms();}
}void show(ulong digit)
{unsigned char pos = 0;do{show_digit(pos,digit%10);digit/=10;pos++;}while(digit);
}void show_digit(uchar pos, uchar digit)
{static uchar pos_map[][3] = {{0,0,0},{0,0,1},{0,1,0},{0,1,1},{1,0,0},{1,0,1},{1,1,0},{1,1,1}};pos %= 8;P2_2 = pos_map[pos][2];P2_3 = pos_map[pos][1];P2_4 = pos_map[pos][0];digit %= 10;P0 = led_data[digit];Delay1ms();P0 = 0;//clear
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/907362.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Bitcoin部署到openEuler RISC-V

Bitcoin项目源码是用C++写的,我对C++以及它的编译工具又比较熟悉,这次我尝试了在openEuler RISC-V 24.09上面部署Bitcoin。网上编译Bitcoin源码的很多都是以前旧版的,旧版编译是用automake之类的工具,但是在最新版只需要用cmake就行,两者的部署方式不相同,我分别记录一下…

NVIDIA安装程序无法继续

原因 在更新驱动时,手贱,下驱动一半关闭了下载流程。导致下载失败,而且进入不了Geforece 解决方法:官网下载最新版驱动,再尝试。 如果不行,检查Windows更新,更新至最新版本 重启后如果不可行,再关闭杀毒软件,关闭防火墙,再尝试,重启再尝试。 如果还是不行,使用卸载…

锚定碳中和,三重角色重构,运营商的第四次跃迁

「 作为能源消耗大户,运营商在面对碳中和的级终命题时需要转变发展思路、转变角色定位。」5G+AI倒逼运营商基础设施建设大规模提速,运营商要更好的生存发展必须要降本提效,碳中和的大目标则要求运营商在快速发展的同时还要破解能源消耗指数级增长的魔咒——这似乎是一个不可…

SpringBoot整合RabbitMQ--Fanout模式

使用springBoot整合rabbitMQ需要事先导入相关依赖:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><dependency><groupId>org.springframework.bo…

查看网站支持的tls版本

f12 打开chrome 开发面板本文由 trykle 发布联系方式:QQ 294986636本文地址:https://www.cnblogs.com/trykle/p/18798939

解析PromQL并修改添加Label

最近做的项目中用到了Prometheus做预警服务,其中Prometheus使用promql语言来查询。项目中用户通过UI或者自己手动输入PromQL时候是缺少一些系统参数的,所以需要在用户输入完成以后同步到Prometheus时候将这部分缺失的信息给添加回去,这里就需要修改用户写的PromQL了。 实现思…

学习安装配置vue

1.先将nodejs下载2.在我们的安装目录下,创建名为node_cache和node_global的两个文件夹 3.打开cmd窗口,执行如下命令,将npm的全局模块目录和缓存目录配置到刚才创建的那两个目录。 npm config set prefix “D:\soft2024.7.6\nodejs\node_global” npm config set cache “D:\…

K8s Ingress, 你这个老6

Ingress 这个老6,结合nodeport和ClusterIp两种服务类型,你在引流这一块玩的花啊。 入口一夫当关,对内如鱼得水。本文是有态度马甲的第185篇原创。 本文记录了k8s中核心对象Ingress的产生背景和实现机制。 我们都知道k8s Service是一种将Pods通过网络暴露出来的抽象,每个服务…

C# .NET core 中处理图像,SkiaSharp,ImageSharp,NetVips,Magick.net多维度对比

2025年有哪些图像处理库,我们可以在项目中使用哪些库?本文列出了最流行的现有库。 .NET Core图片处理库SkiaSharp(https://github.com/mono/SkiaSharp) Magick.net(https://github.com/dlemstra/Magick.NET) ImageSharp(https://github.com/SixLabors/ImageSharp) NetV…

20243317 实验二《Python程序设计》实验报告

课程:《Python程序设计》 班级: 2433 姓名: 邓雅文 学号:20243317 实验教师:王志强老师 实验日期:2025年3月26日 必修/选修: 公选课 一、实验内容 1、掌握python中函数定义与调用相关知识点 大致框架与C语言相同,同样有实参,形参,可能有返回值,形式如下: def 函数名…

MEBCY-v2

MERCY-v2 信息收集 查找目标主机ip ┌──(root㉿kali)-[~] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:84:b2:cc, IPv4: 192.168.158.143 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.158.1 00:50:56:c…

人群密度分析预警摄像机

人群密度分析预警摄像机是可以实时地统计出一个指定区域内的总人数。当所监视区域的人员数量达到设定的阀值时摄像机输出报警信号。可设置人数阈值和时间阈值。用于设置触发进入区域内的人数值,达到该设定的阈值则摄像机输出报警信号。人数阈值可以手动设置,系统默认值为5人,…