单片机——独立按键控制

1.基本定义与初始化

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int

根据实际连接定义端口
在这里插入图片描述

sbit key1=P3^2;
sbit key2=P3^3;
sbit key3=P3^4;
sbit key4=P3^5;

在这里插入图片描述

sbit duan=P2^6;		//段选信号的锁存器控制
sbit wei=P2^7;		//位选信号的锁存器控制

定义相关变量和数码管的码表显示

uchar d;			//段选
uchar sumaguan;	   //用于 位选
uchar code table[]={
    
    0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
                        0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
						//0-F的码表

2.延时部分

void delay_ms(uint k)
{
    
    
	uint i,j;
	for(i=0;i<k;i++)
		for(j=0;j<113;j++)
		{
    
    
		;
		}


		 
}

3.按键选择与数码管位选部分
这里四个按键的程序是一样的,选择按键1程序部分进行说明。
下列代码主要实现的是一个按键检测功能,如果检测到按键1被按下,则执行相应的操作。

具体的实现流程如下:

检测按键1是否被按下,如果被按下则执行以下步骤。

延时10ms,防止按键抖动导致误操作。

再次检测按键1是否被按下,如果确认按键1被按下,则执行以下步骤。

进入while循环,等待按键1松开。

设置变量d的值为1,表示按键1被按下了。

设置变量sumaguan的值为0xfe,其中sumaguan是一个用于控制数码管显示的变量。0xfe是一个二进制数。

这里设置sumaguan的值为0xfe是为了在数码管上显示数字1,因为数字1只需要点亮数码管的第一个段。当其他数字需要在数码管上显示时,需要根据具体的显示需求来设置sumaguan的值。
就是完成位选。
在这里插入图片描述

if(key1==0)	     //按键1
   {
    
    
    delay_ms(10);//确保不是按键抖动


	if(key1==0)		
	 {
    
    
	  while(!key1);
	  d=1;
	  sumaguan=0xfe;
	  }
   }

4.显示部分
这段代码主要实现了将变量d对应的数码段码显示在数码管上。具体来说:

首先通过 P0=table[d] 将变量d所对应的数码段码送入P0口,然后通过 duan=1;duan=0; 的操作将数码管的段位打开和关闭,使得数码段码在数码管上显示出来。
然后通过 P0=sumaguan;wei=1;wei=0; 的操作选择需要显示的数码管。其中 P0=sumaguan 将 sumaguan 变量的值送入P0口,wei=1;wei=0; 将所需显示的数码管选择打开和关闭,使得该数码管可以显示数码段码。
最后通过 delay_ms(5); 延时5ms,使得显示的数码能够被人眼识别出来,然后该函数就结束了。
```javascript

display_culi()
{
P0=table[d]; //送段码显示
duan=1; //段位开
duan=0; //段位关
P0=sumaguan; //选择数码管
wei=1; //选择数码管开启
wei=0; //选择数码管关闭
delay_ms(5);//延时
}


**5.主函数**
    变量d在该代码中用于保存是哪一个按键按下,在key_process()函数中根据按下的不同按键赋值不同的值,然后在display_culi()函数中根据这个值选择显示的数字。
    主程序中,将段选和位选的数字都初始化为0。之后进入一个循环,就调用按键处理和数码管显示对应的数字的模块。    ```javascript
void main()
{
	sumaguan=0xff;
	d=0xff;
	while(1)
	{
	 key_process();	  //按键处理。
	 display_culi();  //显示处理。		
	}
}

完整程序:

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int

sbit duan=P2^6;		//段选信号的锁存器控制
sbit wei=P2^7;		//位选信号的锁存器控制
sbit key1=P3^2;
sbit key2=P3^3;
sbit key3=P3^4;
sbit key4=P3^5;
uchar d;			//段选
uchar sumaguan;	   //用于 位选
uchar code table[]={
    
    0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
                        0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
						//0-F的码表
void delay_ms(uint k)
{
    
    
	uint i,j;
	for(i=0;i<k;i++)
		for(j=0;j<113;j++)
		{
    
    
		;
		}


		 
}
key_process()
 {
    
    


  if(key1==0)	     //按键1
   {
    
    
    delay_ms(10);


	if(key1==0)		
	 {
    
    
	  while(!key1);
	  d=1;
	  sumaguan=0xfe;
	  }
   }



   if(key2==0)		 //按键2
   {
    
    
    delay_ms(10);
	if(key2==0)
	 {
    
    
	  while(!key2);
	  d=2;
	  sumaguan=0xfd;
	  }
   }
  if(key3==0)		  //按键3
   {
    
    
    delay_ms(10);
	if(key3==0)
	 {
    
    
	  while(!key3);
	  d=3;
	  sumaguan=0xfb;
	  }
    }
   if(key4==0)		  //按键4
   {
    
    
    delay_ms(10);
	if(key4==0)
	 {
    
    
	  while(!key4);
	  d=4;
	  sumaguan=0xf7;
	  }
   }



 }

display_culi()
 {
    
    
  P0=table[d]; //送段码显示
	 duan=1;	  //段位开
	 duan=0;	  //段位关
	 P0=sumaguan;	  //选择数码管 
	 wei=1;		  //选择数码管开启
	 wei=0;		  //选择数码管关闭
	 delay_ms(5);//延时
  }

void main()
{
    
    
	sumaguan=0xff;
	d=0xff;
	while(1)
	{
    
    
	 key_process();	  //按键处理。
	 display_culi();  //显示处理。		
	}
}

运行结果:
在这里插入图片描述
在程序里面,会延时10s,再次判断按键是否被按下。之后松开按键,给d赋值1。判断按键被按下,之后进行数码管的位选。
所以在proteus仿真中,按下按键之后再松开按键。数码管才会显示。

猜你喜欢

转载自blog.csdn.net/m0_46155417/article/details/129370858