相关推荐recommended
51单片机“独立按键”控制静态数码管———显示数字0-9
作者:mmseoamin日期:2024-01-19

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);
      }
      

      四. 程序烧录与保存

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