用51单片机矩阵键盘输出0~F到静态数码管

/*******************************************************************************
*  标题:                  矩阵键盘显示数字到静态数码管                         *
*  时间                      2018年7月17日00:45:03					           *
*																			   *
*  实验说明:用矩阵键盘上的16个按键,分别为0、1、3、4、5、6、7、8、9、a、b、c  *
d、e、f显示到静态数码管上				   *                                   *
********************************************************************************
* 实验心得:															       *
1.测试行(row)的时候就是线是竖着的的那一列为1,测试列(col)的时候就是		   *
线是横着的那几行为1															   *
2.调用函数void KeyScan(void);时,调用的时候只需要写KeyScan就行,不然调试不成功 *
********************************************************************************/


#include <reg52.h>

#define GPIO_KEY P1
#define GPIO_SHOW P2

unsigned char code DIG_CODE[16]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,
                                 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71};
void KeyScan(void);
void Delay10ms(unsigned int c);
unsigned int KeyValue=-1;
void main()
{

   while(1)
  {
     
    KeyScan();
	switch(KeyValue)
	{
		 case(0):
		 P2=~DIG_CODE[0];
		 break;	
		 case(1):
		 P2=~DIG_CODE[1];
		 break;
		 case(2):
		 P2=~DIG_CODE[2];
		 break;	
		 case(3):
		 P2=~DIG_CODE[3];
		 break;	
		 case(4):
		 P2=~DIG_CODE[4];
		 break;	
		 case(5):
		 P2=~DIG_CODE[5];
		 break;	
		 case(6):
		 P2=~DIG_CODE[6];
		 break;	
		 case(7):
		 P2=~DIG_CODE[7];
		 break;	
		 case(8):
		 P2=~DIG_CODE[8];
		 break;	
		 case(9):
		 P2=~DIG_CODE[9];
		 break;	
		 case(10):
		 P2=~DIG_CODE[10];
		 break;	
		 case(11):
		 P2=~DIG_CODE[11];
		 break;	
		 case(12):
		 P2=~DIG_CODE[12];
		 break;	
		 case(13):
		 P2=~DIG_CODE[13];
		 break;	
		 case(14):
		 P2=~DIG_CODE[14];
		 break;	
		 case(15):
		 P2=~DIG_CODE[15];
		 break;	
		 default:
		 P2=~DIG_CODE[1];
		 break;
	}

    


	/******************************************************
	*******************************************************
	if语句的算法
	 if(KeyValue==0)
	 P2=~DIG_CODE[0];
	 if(KeyValue==1)
	 P2=~DIG_CODE[1];
	 if(KeyValue==2)
	 P2=~DIG_CODE[2];
	 if(KeyValue==3)
	 P2=~DIG_CODE[3];
	 if(KeyValue==4)
	 P2=~DIG_CODE[4];
	 if(KeyValue==5)
	 P2=~DIG_CODE[5];
	 if(KeyValue==6)
	 P2=~DIG_CODE[6];
	 if(KeyValue==7)
	 P2=~DIG_CODE[7];
	 if(KeyValue==8)
	 P2=~DIG_CODE[8];
	 if(KeyValue==9)
	 P2=~DIG_CODE[9];
	 if(KeyValue==10)
	 P2=~DIG_CODE[10];
	 if(KeyValue==11)
	 P2=~DIG_CODE[11];
	 if(KeyValue==12)
	 P2=~DIG_CODE[12];
	 if(KeyValue==13)
	 P2=~DIG_CODE[13];
	 if(KeyValue==14)
	 P2=~DIG_CODE[14];
	 if(KeyValue==15)
	 P2=~DIG_CODE[15];
	*************************************************/
   }
}

 void KeyScan(void)	  //测试行(row)的时候就是线是竖着的的那一列为1,测试列(col)的时候就是线是横着的那几行为1 
{
	char a = 0;
	GPIO_KEY=0x0f;
	if(GPIO_KEY!=0x0f)//读取按键是否按下
	{
		Delay10ms(1);//延时10ms进行消抖
		if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
		{
			
			//测试列
			GPIO_KEY=0X0F;
			switch(GPIO_KEY)
			{
				case(0X07):	KeyValue=0;break;
				case(0X0b):	KeyValue=4;break;
				case(0X0d): KeyValue=8;break;
				case(0X0e):	KeyValue=12;break;
			}
			//测试行
			GPIO_KEY=0XF0;
			switch(GPIO_KEY)
			{
				case(0X70):	KeyValue=KeyValue+3;break;
				case(0Xb0):	KeyValue=KeyValue+2;break;
				case(0Xd0): KeyValue=KeyValue+1;break;
				case(0Xe0):	KeyValue=KeyValue;break;
			}
			while((a<50) && (GPIO_KEY!=0xf0))	 //检测按键松手检测
			{
				Delay10ms(1);
				a++;
			}
		}
	}
}

/*******************************************************************************
* 函 数 名         : Delay10ms
* 函数功能		   : 延时函数,延时10ms
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

void Delay10ms(unsigned int c)   //误差 0us
{
    unsigned char a, b;

	//--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//
    for (;c>0;c--)
	{
		for (b=38;b>0;b--)
		{
			for (a=130;a>0;a--);
		}          
	}       
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值