本文主要是介绍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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!