目的:实现矩阵键盘的多位数据输入
这里以两位数据为例
//引脚初始化PC0-PC7
void Key_Config()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0| GPIO_Pin_1| GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
//按键扫描函数
int KeyScan(void)
{
u8 KeyVal;
GPIO_Write(GPIOC, (GPIOC->ODR & 0xfff0 | 0x000f));
if((GPIOC->IDR & 0x00f0)==0x0000)
return -1;
else
{
if((GPIOC->IDR & 0x00f0)==0x0000)
return -1;
}
GPIO_Write(GPIOC,(GPIOC->ODR & 0xfff0 | 0x0001));
switch(GPIOC->IDR & 0x00f0)
{
case 0x0010: KeyVal=1; break;
case 0x0020: KeyVal=2;break;
case 0x0040: KeyVal=3;break;
case 0x0080: KeyVal=10;break;
}
while((GPIOC->IDR & 0x00f0) > 0);
GPIO_Write(GPIOC,(GPIOC->ODR & 0xfff0 | 0x0002));
switch(GPIOC->IDR & 0x00f0)
{
case 0x0010: KeyVal=4;break;
case 0x0020: KeyVal=5;break;
case 0x0040: KeyVal=6;break;
case 0x0080: KeyVal=11;break;
}
while((GPIOC->IDR & 0x00f0) > 0);
GPIO_Write(GPIOC,(GPIOC->ODR & 0xfff0 | 0x0004));
switch(GPIOC->IDR & 0x00f0)
{
case 0x0010: KeyVal=7;break;
case 0x0020: KeyVal=8;break;
case 0x0040: KeyVal=9;break;
case 0x0080: KeyVal=12;break;
}
while((GPIOC->IDR & 0x00f0) > 0);
GPIO_Write(GPIOC,(GPIOC->ODR & 0xfff0 | 0x0008));
switch(GPIOC->IDR & 0x00f0)
{
case 0x0010: KeyVal=13;break;
case 0x0020: KeyVal=0;break;
case 0x0040: KeyVal=15;break;
case 0x0080: KeyVal=16;break;
}
while((GPIOC->IDR & 0x00f0) > 0);
return KeyVal;
}
//轮询检测是否有按键按下,有则返回键值
u8 key_input(void)
{
while(1)
{
if( GPIOC->IDR!= 0xff0f)
{
return KeyScan();
}
}
}
//幂函数运算
static u16 MYS(int a)
{
int aa=1;
for(;a>0;a--)
{ aa=aa*10; }
return aa;
}
//循环输入数据,实现数据结合并返回
u16 key_Input()
{
int key[2];
u16 dd=0;
int bb=1,j,i;
for(i=0;i<2;i++)
{
key[i]=key_input();
while(key[i]==KeyScan()){;}
}
for(j=0;j<2;j++)
{
dd=dd+key[j]*MYS(bb);
bb--;
}
return dd;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)