目录
实验内容
基于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);
}
优化说明
- 函数封装:将
flag
的更新和显示逻辑封装在Flag_Display
函数中,减少了重复代码。将按键的扫描封装起来,利于模块化编程。 - 边界条件处理:使用
(flag + increment + 10) % 10
来处理flag
的边界条件,确保flag
始终在 0 到 9 之间循环。 - 等待按键释放:在更新
flag
和显示之后,添加了一个while
循环来等待按键释放,防止因按键抖动或快速释放而导致的多次触发。 - 代码可读性:通过添加注释和函数封装,提高了代码的可读性和可维护性。
优化后代码
/*******************************************************************************
* 文件名称:独立按键控制数码管加减实验
* 作者:林帆在努力
* 日期版本: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);
}
}
}