51单片机“独立按键”控制静态数码管———显示数字0-9

51单片机“独立按键”控制静态数码管学习总结

  • 一. 按键功能实现总结
    • “独立按键”电路图解析及接线
  • 二. 程序编译与控制静态数码管显示1.2.0——9.的效果展示
  • 三. 按键程序逻辑设计与程序编译
  • 四. 程序烧录与保存

一. 按键功能实现总结

  1. “独立按键”电路图解析及接线

    51单片机“独立按键”控制静态数码管———显示数字0-9_第1张图片

    (1).独立按键模块电路图可以清楚的看到,所有从引脚JP1出来的电流都会接到GND,且当所有按键按下时被执行链接GND。所以,当JP1引脚各端口----识别----到“电流为低电平为0时”,说明按键被按下,否则为高电平按键没有被按下。
    ( 2).按键的原理其是需要我们单片机有检测的步骤,加上结合电路图的分析。当单片机检测到电平为低电平时,说明按键被按下,否则没有按下。
    当按键按下时,如果单机检测按键为0,说明按键按下,程序执行静态数码管的数字显示
    (3). 按键因为是硬件,所以他会在按下时会有电流波动------俗称按键抖动,这是硬件物理结构决定。所以在编程设计时要加上“延时时间进行软件的消抖”,用延时的时间给它规避掉抖动这部分所用的时间(我们只考虑软件方面的处理方式,硬件不在考虑范围内)。
    (4).一个完整的按键事件分为“按键按下”和“按键弹起”两部分组成。

二. 程序编译与控制静态数码管显示1.2.0——9.的效果展示

/*****按键消抖实现每按一下(包括按下事件和弹起事件的完整 整个事件)按键数码管显示加一*******/

#include "reg51.h"

typedef unsigned char u8;
typedef unsigned int u16;

sbit Key1 = P0^0;

//定义全局变量dnumber
u8 dnumber = 0;

//静态数码管数组定义
u8 vol[10] = {0x02, 0x9e, 0x24, 0x0c, 0x98, 0x48, 0x40, 0x1e, 0x00, 0x08};

//延时函数声明
void Delay_10us(u16 time);

//按键处理函数声明
void ADDDisplay();

//主函数主程序
void main(void)
{
	u8 flag = 0;
	while(1)
	{
		if(Key1 == 0)
		{
			Delay_10us(1000);
			if(Key1 == 0)
			{
				if(flag == 0)
				{	
					ADDDisplay();
					flag = 1;
				}			
			}
		}
		else 
		{	
			Delay_10us(1000);
			if(Key1 == 1)
			{
			 	if(flag == 1)
				{
//					ADDDisplay();
					flag = 0;	
				}
			}
		}
	}
	Delay_10us(1000);
}

//定义延时函数
void Delay_10us(u16 time)
{
	while(time--);
}

//定义按键处理函数
void ADDDisplay(void)
{
	dnumber += 1;
	if(dnumber > 9)
	{
		dnumber = 0;
	}
	P2 = vol[dnumber];
}

三. 按键程序逻辑设计与程序编译

*这里需要着重强调的是“按键按下” 和 “弹起"的整个事件程序逻辑应该怎么去设计:
定义一个名为flag的变量用于记录按键周期状态flag,初始周期状态为0。
当按键按下时判断按键Key1是否为低电平,如果为低电平,说明按键被按下。接着判断flag是否为0,如果为0那么执行按键处理函数显示静态数码管显示数字,并且flag记录一次按键周期,flag = 1赋值为1。
当按键弹起时,判断按键Key1是否为高电平,如果为高电平说明按键被弹起。接着判断flag是否为1,如果为1,那么flag = 0,至此整个按键结束。
程序编译如下:

//主函数主程序
void main(void)
{
	u8 flag = 0;
	while(1)
	{
		if(Key1 == 0)
		{
			Delay_10us(1000);
			if(Key1 == 0)
			{
				if(flag == 0)
				{	
					ADDDisplay();
					flag = 1;
				}			
			}
		}
		else 
		{	
			Delay_10us(1000);
			if(Key1 == 1)
			{
			 	if(flag == 1)
				{
//					ADDDisplay();
					flag = 0;	
				}
			}
		}
	}
	Delay_10us(1000);
}

四. 程序烧录与保存

程序编译无报错,烧录显示正常。

你可能感兴趣的:(51单片机,单片机)