51单片机按键控制数码管显示0-9

本文介绍了一个简单的51单片机程序设计案例,通过两个独立按键控制数码管显示0-9。利用P0口输出共阴数码管段码,P3_0和P3_1作为减加按键输入。程序包括延时、按键检测及消抖等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实验题目:使用51单片机设计两个按键控制数码管显示0-9,当K1按下减1,当K2按下加1.

理解程序可参考我的另外两个文章;

51单片机数码管显示0-9_学习笔记吧的博客-CSDN博客

51单片机独立按键控制合集_学习笔记吧的博客-CSDN博客

两个文章一结合就是一个新的产物,所以51单片机玩来玩去就是各种简单程序的相加。他套他,再套他,加个数码管加按键,加各种东西,重点是要理解,怎么让他们结合起来不会报错。

实验程序:

#include<REGX52.H>

unsigned char code Tab[]=     //共阴数码管段码表0-9
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void Delay1ms(unsigned int xms)  //延时1ms函数
{
unsigned char i,j;
while(xms)
{
i = 2 ;
j = 239 ;
do
{
while (--j);
}
while (--i);
xms--;
}
}

	void main ()    //主函数
	{
		unsigned char rge		= 0 ;   //局部变量计位数rge是段码表的位置
		P0= 0x3f;    //定义初始值显示0
		while(1)
		{

			if(P3_1 ==0)		//判断按键是否按下
			{
				Delay1ms(20);    //消抖
				while(P3_1 ==0);  //再次判断
				Delay1ms(20);     //消抖
				
				rge++;   //数字加1
				if(rge>=10)  //控制加的位数别超出段码表了
				{
					rge = 0 ;   //如果超出就让他回0去
				}
				 P0=Tab[rge];  //把第rge的段码赋值给P0口
			   Delay1ms(500);  //延时500ms
				}
				
				
				if(P3_0 ==0)		//判断按键是否按下
			{
				Delay1ms(20);    //消抖
				while(P3_0 ==0);  //再次判断
				Delay1ms(20);     //消抖
				
			if(rge==0)   //因为我们定义的变量led是无符号型,如果直接减减不可能减为负数
				rge = 9 ;  //所以判断如果减到0就重新给他赋值
			else
				rge--;   //如果没减到0就继续减减
			
				P0=Tab[rge];  //把第reg的段码赋值给P0口
			  Delay1ms(500);  //延时500ms
				}
			}
		}

实验原理图:

 

C51单片机是一种基于Intel 8051控制器架构的单片机,广泛应用于嵌入式系统的开发。在使用C51单片机进行按键控制数码管显示0-9的过程中,通常需要以下步骤: 1. 初始化配置:首先,需要对单片机的I/O端口进行初始化,设置按键输入端口和数码管显示端口。比如,可以使用P1口连接按键,P0口连接数码管。 2. 按键扫描:编写一个函数来扫描按键的状态。按键扫描通常涉及读取按键端口的状态,并且可能需要消抖处理来确保按键的稳定性。 3. 数码管显示控制:当检测到按键动作时,根据按键的输入值,选择相应的数字来控制数码管显示。这通常涉及到一个数码管的编码表,比如0-9对应的显示编码。 4. 循环检测:在一个主循环中,不断调用按键扫描函数和数码管显示控制函数,从而实现按键控制数码管实时显示数字09。 下面是一个简化的伪代码示例,用于说明这一过程: ```c // 初始化I/O端口 void init() { // 配置数码管端口为输出 // 配置按键端口为输入 } // 按键扫描函数 int scanKey() { // 读取按键端口状态 // 如果检测到按键按下,返回按键值 // 可能包含消抖处理逻辑 return 0; // 返回按键值,0表示没有按键按下 } // 显示函数 void display(int number) { // 根据传入的number值,选择数码管编码表中对应的编码 // 输出到数码管显示端口 } // 主函数 void main() { int key = 0; init(); // 初始化端口 while(1) { key = scanKey(); // 扫描按键 if(key != 0) { // 如果有按键按下 display(key); // 显示按键对应的数字 } } } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值