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
    }
}

最近更新

  1. TCP协议是安全的吗?

    2024-06-10 19:48:06       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-10 19:48:06       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-10 19:48:06       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-10 19:48:06       18 阅读

热门阅读

  1. RAG技术在教育领域的应用

    2024-06-10 19:48:06       10 阅读
  2. 关于使用spring boot自带的jackson解析xml心得

    2024-06-10 19:48:06       9 阅读
  3. 第8天:会话管理与Cookies

    2024-06-10 19:48:06       8 阅读
  4. selenium中,如何使用选择框

    2024-06-10 19:48:06       9 阅读
  5. 1、深度学习-安装

    2024-06-10 19:48:06       9 阅读
  6. 【RFC3665】SIP协议解析

    2024-06-10 19:48:06       6 阅读
  7. 机器学习(一)

    2024-06-10 19:48:06       8 阅读
  8. 设计方案总结

    2024-06-10 19:48:06       8 阅读
  9. 斗地主小游戏

    2024-06-10 19:48:06       10 阅读
  10. 【调度算法】Boltzmann选择

    2024-06-10 19:48:06       7 阅读