/*******************************************************************************
* 标题: 矩阵键盘显示数字到静态数码管 *
* 时间 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--);
}
}
}