51单片机按键数码管(简单设计)

        51单片机按键数码管是一个简单的设计项目,使用四位数码管进行显示,矩阵按键加独立按键输入,将读取到据显示在数码管上。

一、参考PCB图

二、参考代码

#include <reg51.h>
// LED数码管引脚定义
sbit LED1 = P2 ^ 0;
sbit LED2 = P2 ^ 1;
sbit LED3 = P2 ^ 2;
sbit LED4 = P2 ^ 3;
// 矩阵按键引脚定义
sbit P1_0 = P1 ^ 0;
sbit P1_1 = P1 ^ 1;
sbit P1_2 = P1 ^ 2;
sbit P1_3 = P1 ^ 3;
sbit P1_4 = P1 ^ 4;
sbit P1_5 = P1 ^ 5;
// 独立按键引脚定义
sbit KEY1 = P1 ^ 6;
sbit KEY2 = P1 ^ 7;
// 按键扫描变量
unsigned char KeyNumber = 0;
unsigned char Matrix_KeyNumber = 0;
// 定义变量存放数码管的数据
unsigned char Dig_Buf[] = {0x00, 0x00, 0x00, 0x00};
// 共阴极数码管表
unsigned char code tab[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7C};
//--------------------------------定时器1--------------------------------
void Timer1Init(void)
{TMOD &= 0x0F; // 设置定时器16位 2msTMOD |= 0x10;TL1 = 0x30;TH1 = 0xF8;TF1 = 0;ET1 = 1;EA = 1;TR1 = 1;
}//--------------------------------动态扫描数码管-------------------------------
void Dig_Loop()
{// 声明静态变量,每次进入函数值不变static unsigned char CNT0 = 0;CNT0++;if (CNT0 > 3){CNT0 = 0;}P0 = 0x00; // 段码清0,消影P2 = 0XFF;switch (CNT0) // 位码输出{case 0:LED1 = 0;break;case 1:LED2 = 0;break;case 2:LED3 = 0;break;case 3:LED4 = 0;break;}P0 = Dig_Buf[CNT0]; // 段码输出
}//--------------------------------矩阵按键部分--------------------------------
unsigned char MatrixKey()
{unsigned char KeyNumber = 0;P1 = 0xFF;P1_0 = 0; // 依次发送低电平扫描按键 先拉高P1,再拉低某一端口if (P1_3 == 0){KeyNumber = 1;}if (P1_4 == 0){KeyNumber = 2;}if (P1_5 == 0){KeyNumber = 3;}P1 = 0xFF;P1_1 = 0;if (P1_3 == 0){KeyNumber = 4;}if (P1_4 == 0){KeyNumber = 5;}if (P1_5 == 0){KeyNumber = 6;}P1 = 0xFF;P1_2 = 0;if (P1_3 == 0){KeyNumber = 7;}if (P1_4 == 0){KeyNumber = 8;}if (P1_5 == 0){KeyNumber = 9;}return KeyNumber;
}void Loop_MatrixKey()
{static unsigned char LastKey = 0;static unsigned char NowKey = 0;LastKey = NowKey;NowKey = MatrixKey();if (LastKey == 0 && NowKey != 0){Matrix_KeyNumber = NowKey;};
}//--------------------------------独立按键部分--------------------------------
// 获取当前按键状态
unsigned char KeyState()
{unsigned char KeyNum = 0; // 没有按键按下返回0if (KEY1 == 0){KeyNum = 1;}if (KEY2 == 0){KeyNum = 2;}return KeyNum;
}
// 循环扫描,相当于沿检测
void Loop_Key()
{static unsigned char LastKey = 0, NowKey = 0;LastKey = NowKey;	 // 更新按键值NowKey = KeyState(); // 获取当前按键状态if (LastKey)		 // 判断有无按键按下{if (NowKey == 0) // 如果按下,获取按键编号{KeyNumber = LastKey;}}
}
//--------------------------------数码管显存左移函数--------------------------------
void Dig_Shift(unsigned char NewKey)
{Dig_Buf[0] = Dig_Buf[1];Dig_Buf[1] = Dig_Buf[2];Dig_Buf[2] = Dig_Buf[3];Dig_Buf[3] = NewKey;
}
//----------------------------主函数-----------------------------//
void main(void)
{// 定时器初始化Timer1Init();while (1){// 按键响应if (KeyNumber){ // 独立按键if (KeyNumber == 1){ // 按键0Dig_Shift(tab[0]);}if (KeyNumber == 2){ // 清零按键Dig_Buf[0] = 0x00;Dig_Buf[1] = 0x00;Dig_Buf[2] = 0x00;Dig_Buf[3] = 0x00;}KeyNumber = 0;}if (Matrix_KeyNumber){ // 矩阵按键Dig_Shift(tab[Matrix_KeyNumber]);Matrix_KeyNumber = 0;}}
}//----------------------------定时计数器1的中断服务子程序-----------------------------//
void Time1_ISR(void) interrupt 3
{// 重新装载定时器static unsigned char T0Count, T1Count = 0;TL1 = 0x30;TH1 = 0xF8;Dig_Loop(); // 数码管扫描T0Count++;if (T0Count >= 10){ // 20ms进行一次按键扫描T0Count = 0;Loop_MatrixKey();}T1Count++;if (T1Count >= 15){ // 30ms进行一次按键扫描T1Count = 0;Loop_Key();}
}

三、参考网址

        由于本次项目过于简单,不做过多描述,详情参考我的bilibili:

51单片机按键数码管_哔哩哔哩_bilibili

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

spark读取数据性能提升

1. 背景 spark默认的jdbc只会用单task读取数据&#xff0c;读取大数据量时&#xff0c;效率低。 2. 解决方案 根据分区字段&#xff0c;如日期进行划分&#xff0c;增加task数量提升效率。 /*** 返回每个task按时间段划分的过滤语句* param startDate* param endDate* param …

基于Leaflet和天地图的直箭头标绘实战-源码分析

目录 前言 一、Leaflet的特种标绘库 1、特种标绘对象的定义 2、Plot基类定义 3、直线箭头的设计与实现 二、在天地图中进行对象绘制 1、引入天地图资源 2、标绘对象的调用时序 3、实际调用过程 三、总结 前言 在博客中介绍过geoman标绘的具体实现&#xff0c;使用Leaf…

Window Server 2019+ 安装 Docker

刚刚在等待下载的时候&#xff0c;发了篇文&#xff0c;然后发现直接下载docker用不了&#xff0c;看了官网说明发现&#xff1a;Docker 不支持Window Server!!!不要直接下载官网那里的安装包。 那个链接点进去了windows的指南&#xff0c;发现也有问题&#xff0c;给的脚本地…

数据结构:(OJ141)环形列表

给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&#xff08;…

【数据类型】映射map

小明正在备考英语四级考试&#xff0c;但他的词典太厚了&#xff0c;他记不住哪个单词在哪里。 于是他准备开发一个可以直接找某单词在某页的应用。 但是&#xff0c;他不会做&#xff0c;整天十分烦恼。 好啦&#xff0c;进入正题&#xff0c;大家好&#xff0c;我是学霸小羊…

Kubernetes从零到精通(12-Ingress、Gateway API)

Ingress和Gateway API都是Kubernetes中用于管理外部访问集群服务的机制&#xff0c;但它们有不同的设计理念和适用场景。它们的基本原理是通过配置规则&#xff0c;将来自外部的网络流量路由到Kubernetes集群内部的服务上。 Ingress/Gateway API和Service Ingress/Gateway API…

Django后台管理复杂模型

【图书介绍】《Django 5企业级Web应用开发实战&#xff08;视频教学版&#xff09;》_django 5企业级web应用开发实战(视频教学版)-CSDN博客 《Django 5企业级Web应用开发实战&#xff08;视频教学版&#xff09;》(王金柱)【摘要 书评 试读】- 京东图书 (jd.com) Django框架…

ZLMediaKit Windows编译以及使用

1.运行ZLMediaKit 2.通过ffmpeg把视频源推流给ZLMediaKit 执行以下命令&#xff0c;将本地视频通过RTSP协议推流给ZLMediaKit。 ffmpeg -re -stream_loop -1 -i "D:\workplace\armgb\public\1.fileh264" -vcodec h264 -f rtsp rtsp://127.0.0.1/live/test 若想将本…

统信服务器操作系统【d版系统上Ansible工具】配置方法

在统信服务器操作系统d版本上进行安装Ansible工具的方法以及配置方法。 文章目录 准备环境功能描述安装与配置一、 安装ansible工具1. 直接 命令安装2. 验证安装结果3. 配置ssh免密登录二、Ansible使用1. 主机清单配置2. ansible命令3. ansible模块三、 playbook配置文件1. 执行…

Java 发布jar包到maven中央仓库(2024年9月保姆级教程)

文章目录 前言一、账号准备1. 注册登录账号2. 新建命名空间3. 验证命名空间4. 生成令牌5. 为 maven 设置令牌二、GPG准备1. 下载GPG2. 发布证书2.1 新建证书2.2 发布证书到服务器2.3 验证发布三、发布jar包到中央仓库1. 编辑项目pom文件2. 打包上传3. 发布jar包4. 搜索我们的ja…

【机器学习】任务五:葡萄酒和鸢尾花数据集分类任务

目录 1.实验基础知识 1.1 集成学习 &#xff08;1&#xff09;随机森林 &#xff08;2&#xff09;梯度提升决策树&#xff08;GBDT&#xff09; &#xff08;3&#xff09;XGBoost &#xff08;4&#xff09;LightGBM 1.2 参数优化 &#xff08;1&#xff09;网格搜索…

Java面试篇基础部分-Java线程池工作原理

线程池的出现,主要是用来管理一组线程的工作运行状态,这样可以方便JVM更好的利用CPU资源。 Java线程池的工作原理:JVM先根据用户的参数创建一定数量的可运行的线程任务,并且将这些任务放入到队列中,在线程创建之后,启动这些任务。 如果当线程数超过最大线程数,这个线程数…

WIFI路由器的套杆天线简谈

❝本次推文简单介绍下WIFI路由器的套杆天线。 路由器天线 路由器在这个万物互联的时代&#xff0c;想必大家对其都不陌生。随着科技的发展&#xff0c;常用的路由器上的天线也越来越多&#xff0c;那么问题来了&#xff1a;天线越多&#xff0c;信号越好吗&#xff1f;路由器…

视频转文字工具:开启视频内容深度挖掘的钥匙

图片里到文字要提取出来&#xff0c;现在有很多的工具&#xff0c;但是视频里的文字要提取出来&#xff0c;是不是就不那么好操作呢&#xff1f;并不是的&#xff0c;现在也有不少支持视频转文字的工具&#xff0c;这次我们就来介绍一些可以提高我们视频文字提取效率的工具吧。…

【CSS in Depth 2 精译_033】5.4 Grid 网格布局的显示网格与隐式网格(中)

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09; 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位&#xff08;已完结&#xff09; 2.1 相对…

[Redis][环境配置]详细讲解

目录 1.安装 && 简单配置2.文件目录说明3.客户端 1.安装 && 简单配置 Ubuntu下&#xff0c;直接使用sudo apt install redis -y即可支持远程连接&#xff1a;修改/etc/redis/redis.conf 将bind 127.0.0.1改为bing 0.0.0.0作为学习用途&#xff0c;可以将prote…

代码——IMX6UL烧录工具及其使用

一、简介 在此感谢正点原子官方提供的IMX6UL烧录代码&#xff0c;本篇是在正点原子给的代码基础上修改的&#xff0c;增加了些许功能&#xff0c;可根据自己的需求更改。此外代码难免有疏漏之处&#xff0c;还望见谅 二、源代码的使用 1,库和工具的安装 安装库和工具前&#x…

Datawhale X 南瓜书 task01学习笔记

机器学习三观 机器学习工程领先理论 what:什么是机器学习? 机器学习定义&#xff1a;研究关于“学习算法”(一类能从数据中学习出其背后潜在规律的算法)的一门学科PS:深度学习指的是&#xff1a;神经网络那一类学习算法&#xff0c;因此是机器学习的子集把深度学习单列出来…

idea连接docker 自动化部署

进入Linux服务器 vim /lib/systemd/system/docker.service将 ExecStart/usr/bin/dockerd -H fd:// --containerd/run/containerd/containerd.sock 替换为 ExecStart/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock新建文件 Dockerfile配置Dockerfile文…

Linux下rpm方式部署mysql(国产化生产环境无联网服务器部署实操)

请放心观看&#xff0c;已在正式环境部署验证&#xff0c;流程无问题&#xff01; 所用系统为国产化麒麟银河 aarch64系统&#xff0c;部署时间2024年9月份&#xff01; #查看服务器信息 #涉及生产服务器&#xff0c;所以输出信息隐藏了一部分[rootecs-xxxxx hdata]# uname -…