51单片机——独立按键控制单个数码管加减显示0~9

目录

实验内容

Protues电路连接

所需原件

电路原理图

keil代码

优化前代码

优化说明

优化后代码


实验内容

基于protues8.13仿真软件,在51单片机上使用两个独立按键实现数字的加减并且在单个数码管上显示。.

Protues电路连接

所需原件

自上而下分别是7位共阴数码管(不带小数点的)、51单片机、按键、晶振、电解电容、电阻、电容、排阻。(对于如何查找元器件可看上一篇流水灯中有提到)

电路原理图

在完成最小系统的基础上,在P0口上连接数码管,在p3.4\p3,5上等边连接两个按键,需要注意的是,在本次实验中将数码管接在P0io上,由于P0口在内部结构上的特殊,需要在P0口做上拉电阻,否则P0口输出的电平不稳定,具体原因可查询相关文件。

keil代码

本次代码分为基础版代码和优化代码,第一次学习的宝宝想了解一下独立按键和静态数码管显示的基础原理(点击跳转独立按键,静态数码管原理)。

优化前代码
/*******************************************************************************  
* 文件名称:独立按键控制数码管加减实验
* 作者:林帆在努力
* 日期版本:2024.09.13
*******************************************************************************/
#include<reg51.h> 
#define uchar unsigned char
#define uint unsigned int 

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66, //共阴型段码表
					         0x6d,0x7d,0x07,0x7f,0x6f};

sbit K1=P3^4;
sbit K2=P3^5;
void delay10ms();	//延时函数的声明									 
uint flag=0;								 
void main()
{
	P0=table[0];
	
	while(1)
	{
		if(K1 == 0)
		{
			delay10ms();
			if(K1 == 0)
			{
				
			  flag++;
				if(flag > 9)//只显示0~9,故到9 就归零
				{
					flag =0;
				}
				while(K1 == 0);//保持对K1的判断,松开才执行下一句
				P0 = table[flag];
			}
			
		}
		if(K2 == 0)
		{
			delay10ms();
			if(K2 == 0)
			{
				while(K2 == 0);
			  flag--;
				if(flag <0)//让0~9不论是加还是减都能循环
				{
					flag =9;
				}
				while(K2 == 0);
				P0 = table[flag];
			}
			
		}
	}

}	
									 
void Delay10ms()		//@11.0592MHz
{
	unsigned char i, j;

	i = 18;
	j = 235;
	do
	{
		while (--j);
	} while (--i);
}									 



优化说明
  1. 函数封装:将 flag 的更新和显示逻辑封装在Flag_Display 函数中,减少了重复代码。将按键的扫描封装起来,利于模块化编程。
  2. 边界条件处理:使用 (flag + increment + 10) % 10 来处理 flag 的边界条件,确保 flag 始终在 0 到 9 之间循环。
  3. 等待按键释放:在更新 flag 和显示之后,添加了一个 while 循环来等待按键释放,防止因按键抖动或快速释放而导致的多次触发。
  4. 代码可读性:通过添加注释和函数封装,提高了代码的可读性和可维护性。
优化后代码
/*******************************************************************************  
* 文件名称:独立按键控制数码管加减实验
* 作者:林帆在努力
* 日期版本:2024.09.14
*******************************************************************************/
#include <reg51.h>  
  
#define uchar unsigned char  
#define uint unsigned int  
//共阴数码管段码
uchar code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};  
  
sbit K1 = P3^4; // 加号按键  
sbit K2 = P3^5; // 减号按键  
  
void delay10ms(void); // 延时函数的声明  
void Flag_Display(int increment); //flag函数声明
void Key_Scanning();
uint flag = 0;  
  
void main(void)  
{  
    P0 = table[flag];  
      
    while (1)  
    {  
        Key_Scanning();
    }  
}  
  
void delay10ms(void)  
{  
    unsigned char i, j;  
    i = 18;  
    j = 235;  
    do  
    {  
        while (--j);  
    } while (--i);  
}  
  
void Flag_Display(int increment)  
{  
    flag = (flag + increment + 10) % 10; // flag在0-9之间循环  
    while (K1 == 0 || K2 == 0); // 等待按键释放  
    P0 = table[flag];  
}

void Key_Scanning()//按键扫描函数
{
	if (K1 == 0)  
        {  
            delay10ms();  
            if (K1 == 0)  
            {  
                Flag_Display(1);  
            }  
        }  
          
        if (K2 == 0)  
        {  
            delay10ms();  
            if (K2 == 0)  
            {  
                Flag_Display(-1);  
            }  
        }  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值