51单片机单击按键,数码管显示学号;双击按键,数码管显示全8

2024-06-10 09:52

本文主要是介绍51单片机单击按键,数码管显示学号;双击按键,数码管显示全8,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、功能描述

单击按键,数码管显示学号;双击按键,数码管显示全8

2、实验原理

按键输入检测:通过检测按键的电平变化来识别按键是否被按下。当按键被按下时,电平从高变低,单片机通过外部中断或轮询方式检测这一变化。

数码管显示控制:数码管是一种七段显示器,通过控制每个段的亮灭来显示数字或字符。C51单片机通过输出不同的编码来控制数码管显示相应的数字。

3、编程思路

初始化:定义相关的宏、变量和数码管显示数字的编码。

显示控制:通过一个循环来控制8位数码管的显示,根据按键的状态切换显示模式。

按键处理:使用延时和状态变化来区分单击和双击事件,并根据结果切换显示模式。

4、代码

#include <REGX52.h>  // 包含C51单片机的寄存器定义头文件#define uchar unsigned char  // 定义简化数据类型
#define uint unsigned int    // 定义简化数据类型sbit LED = P2 ^ 0;  // 定义LED灯接口,连接到P2端口的第0位
sbit KEY = P3 ^ 1;  // 定义按键接口,连接到P3端口的第1位uchar code table1[] = { 0x5B,0x5B,0x5B,0x06,0x3F,0x3F,0x4F,0x3F };  // 定义数码管显示数字的编码数组void Delay(int x)  // 定义延时函数
{while (x--);  // 递减x直到0,实现延时
}void main()  // 主函数
{uchar k, model = 0, latter = 0, former = 0, o = 0, flag = 1;  // 定义变量while (1)  // 主循环{for (k = 0; k <= 7; k++)  // 循环控制8位数码管{P0 = model ? table1[8] : table1[k];  // 根据model的值选择显示全8或预设数字序列// 根据k的值设置位选信号,选择当前的数码管switch (k){case 0: P2_4 = 1; P2_3 = 1; P2_2 = 1; break;  // 选择第1位数码管case 1: P2_4 = 1; P2_3 = 1; P2_2 = 0; break;  // 选择第2位数码管case 2:P2_4 = 1;  P2_3 = 0; P2_2 = 1; break;case 3:P2_4 = 1;  P2_3 = 0; P2_2 = 0; break;case 4:P2_4 = 0;  P2_3 = 1; P2_2 = 1; break;case 5:P2_4 = 0;  P2_3 = 1; P2_2 = 0; break;case 6:P2_4 = 0;  P2_3 = 0; P2_2 = 1; break;case 7: P2_4 = 0; P2_3 = 0; P2_2 = 0; break;  // 选择第8位数码管}// 检测按键状态if (!KEY){Delay(200);  // 延时去抖动latter = !KEY ? 1 : 0;  // 检测按键是否被按下}else{Delay(200);  // 延时去抖动latter = 0;  // 按键未被按下}// 根据按键状态变化判断是否发生了单击或双击if (latter == 0 && former == 1 && o != 0)flag = 2;  // 双击if (latter == 0 && former == 1 && o == 0){flag = 1;  // 单击o = 500;  // 设置延时计数}former = latter;  // 更新按键状态if (o > 0) o--;  // 递减延时计数}// 根据flag的值切换显示模式if (o == 0 && flag == 1)model = 0;  // 显示预设数字序列if (flag == 2)model = 1;  // 显示全8}
}

这篇关于51单片机单击按键,数码管显示学号;双击按键,数码管显示全8的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1047838

相关文章

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

lvgl8.3.6 控件垂直布局 label控件在image控件的下方显示

在使用 LVGL 8.3.6 创建一个垂直布局,其中 label 控件位于 image 控件下方,你可以使用 lv_obj_set_flex_flow 来设置布局为垂直,并确保 label 控件在 image 控件后添加。这里是如何步骤性地实现它的一个基本示例: 创建父容器:首先创建一个容器对象,该对象将作为布局的基础。设置容器为垂直布局:使用 lv_obj_set_flex_flow 设置容器

单片机毕业设计基于单片机的智能门禁系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍程序代码部分参考 设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订

C# dateTimePicker 显示年月日,时分秒

dateTimePicker默认只显示日期,如果需要显示年月日,时分秒,只需要以下两步: 1.dateTimePicker1.Format = DateTimePickerFormat.Time 2.dateTimePicker1.CustomFormat = yyyy-MM-dd HH:mm:ss Tips:  a. dateTimePicker1.ShowUpDown = t

小程序button控件上下边框的显示和隐藏

问题 想使用button自带的loading图标功能,但又不需要button显示边框线 button控件有一条淡灰色的边框,在控件上了样式 border:none; 无法让button边框隐藏 代码如下: <button class="btn">.btn{border:none; /*一般使用这个就是可以去掉边框了*/} 解决方案 发现button控件有一个伪元素(::after

MFC中Spin Control控件使用,同时数据在Edit Control中显示

实现mfc spin control 上下滚动,只需捕捉spin control 的 UDN_DELTAPOD 消息,如下:  OnDeltaposSpin1(NMHDR *pNMHDR, LRESULT *pResult) {  LPNMUPDOWN pNMUpDown = reinterpret_cast(pNMHDR);  // TODO: 在此添加控件通知处理程序代码    if