使用51单片机实现独立按键控制静态数码管显示数字0-9

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

  • 一. 按键功能实现总结
  • “独立按键”电路图解析及接线
  • 二. 程序编译与控制静态数码管显示1.2.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);
    }
    

    四. 程序烧录与保存

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

    物联沃分享整理
    物联沃-IOTWORD物联网 » 使用51单片机实现独立按键控制静态数码管显示数字0-9

    发表评论