中级会员
 
- 积分
- 492
- 金钱
- 492
- 注册时间
- 2013-2-2
- 在线时间
- 0 小时
|
发表于 2013-8-14 10:38:54
|
显示全部楼层
回复【8楼】xouou_53320:
---------------------------------
我写的键盘程序,不知道为什么键盘要按好几次才有反应,而且有时候不知道为什么,两次按下去显示的键值是不一样的,能帮我看看错在哪了吗?
void InitKeyBoard(void) //初始化矩阵键盘要使用的GPIO口。
{
GPIO_InitTypeDef GPIOStru;
GPIOStru.GPIO_Mode = GPIO_Mode_Out_PP; //定义PA0到PA3为推挽输出。
GPIOStru.GPIO_Speed = GPIO_Speed_50MHz;
GPIOStru.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_Init(GPIOA,&GPIOStru);
GPIOStru.GPIO_Mode = GPIO_Mode_IPD; //定义PA4到PA7为下拉输入。
GPIOStru.GPIO_Speed = GPIO_Speed_50MHz;
GPIOStru.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
//因为上面定义引脚为输出时,已经打开整个GPIOA的时钟了,所以此处不再需要函数RCC_APB2PeriphClockCmd()来打开时钟了。
GPIO_Init(GPIOA,&GPIOStru);
}
int keyBoard(void) //实现矩阵键盘。返回值为,各按键的键值,此键值由用户自己定义。
{
int KeyVal=0; //keyVal为最后返回的键值。
GPIO_Write(GPIOA,(GPIOA->ODR & 0xfff0 | 0xf)); //先让PA0到PA3全部输出高。
if((GPIOA->IDR & 0x00f0)==0x0000) //如果,PA4到PA7全为0,则,没有键按下。此时,返回值为-1.
return -1;
else
{
Delay(10000); //延时5ms去抖动。
if((GPIOA->IDR & 0x00f0)==0x0000) //如果,延时5ms后,PA4到PA7又全为0,则,刚才引脚的电位变化是抖动产生的.
return -1;
}
GPIO_Write(GPIOA,(GPIOA->ODR & 0xfff0 | 0x1)); //让PA3到PA0输出二进制的0001.
switch(GPIOA->IDR & 0x00f0) //对PA4到PA7的值进行判断,以输出不同的键值。
{
case 0x0010:
{
Delay(10000);
if((GPIOA->IDR & 0x00f0)==0x0010)
{
while((GPIOA->IDR & 0x00f0)==0x0010);
KeyVal=1;
}
}break;
case 0x0020:
{
Delay(10000);
if((GPIOA->IDR & 0x00f0)==0x0020)
{
while((GPIOA->IDR & 0x00f0)==0x0020);
KeyVal=2;
}
}break;
case 0x0040: {
Delay(10000);
if((GPIOA->IDR & 0x00f0)==0x0040)
{
while((GPIOA->IDR & 0x00f0)==0x0040);
KeyVal=3;
}
}break;
case 0x0080: {
Delay(10000);
if((GPIOA->IDR & 0x00f0)==0x0080)
{
while((GPIOA->IDR & 0x00f0)==0x0080);
KeyVal=4;
}
}break;
}
GPIO_Write(GPIOA,(GPIOA->ODR & 0xfff0 | 0x2)); //让PA3到PA0输出二进制的0010.
switch(GPIOA->IDR & 0x00f0) //对PA4到PA7的值进行判断,以输出不同的键值。
{
case 0x0010: {
Delay(10000);
if((GPIOA->IDR & 0x00f0)==0x0010)
{
while((GPIOA->IDR & 0x00f0)==0x0010);
KeyVal=5;
}
}break;
case 0x0020: {
Delay(10000);
if((GPIOA->IDR & 0x00f0)==0x0020)
{
while((GPIOA->IDR & 0x00f0)==0x0020);
KeyVal=6;
}
}break;
case 0x0040: {
Delay(10000);
if((GPIOA->IDR & 0x00f0)==0x0040)
{
while((GPIOA->IDR & 0x00f0)==0x0040);
KeyVal=7;
}
}break;
case 0x0080: {
Delay(10000);
if((GPIOA->IDR & 0x00f0)==0x0080)
{
while((GPIOA->IDR & 0x00f0)==0x0080);
KeyVal=8;
}
}break;
}
GPIO_Write(GPIOA,(GPIOA->ODR & 0xfff0 | 0x4)); //让PA3到PA0输出二进制的0100.
switch(GPIOA->IDR & 0x00f0) //对PA4到PA7的值进行判断,以输出不同的键值。
{
case 0x0010: {
Delay(10000);
if((GPIOA->IDR & 0x00f0)==0x0010)
{
while((GPIOA->IDR & 0x00f0)==0x0010);
KeyVal=9;
}
}break;
case 0x0020: {
Delay(10000);
if((GPIOA->IDR & 0x00f0)==0x0020)
{
while((GPIOA->IDR & 0x00f0)==0x0020);
KeyVal=10;
}
}break;
case 0x0040: {
Delay(10000);
if((GPIOA->IDR & 0x00f0)==0x0040)
{
while((GPIOA->IDR & 0x00f0)==0x0040);
KeyVal=11;
}
}break;
case 0x0080: {
Delay(10000);
if((GPIOA->IDR & 0x00f0)==0x0080)
{
while((GPIOA->IDR & 0x00f0)==0x0080);
KeyVal=12;
}
} break;
}
GPIO_Write(GPIOA,(GPIOA->ODR & 0xfff0 | 0x8)); //让PA3到PA0输出二进制的1000.
switch(GPIOA->IDR & 0x00f0) //对PA4到PA7的值进行判断,以输出不同的键值。
{
case 0x0010: {
Delay(10000);
if((GPIOA->IDR & 0x00f0)==0x0010)
{
while((GPIOA->IDR & 0x00f0)==0x0010);
KeyVal=13;
}
}break;
case 0x0020: {
Delay(10000);
if((GPIOA->IDR & 0x00f0)==0x0020)
{
while((GPIOA->IDR & 0x00f0)==0x0020);
KeyVal=14;
}
}break;
case 0x0040: {
Delay(10000);
if((GPIOA->IDR & 0x00f0)==0x0040)
{
while((GPIOA->IDR & 0x00f0)==0x0040);
KeyVal=15;
}
}break;
case 0x0080: {
Delay(10000);
if((GPIOA->IDR & 0x00f0)==0x0080)
{
while((GPIOA->IDR & 0x00f0)==0x0080);
KeyVal=16;
}
}break;
}
return KeyVal;
}
int main(void)
{
u8 Number;
InitKeyBoard();
SystemInit();
delay_init(72); //延时初始化
NVIC_Configuration();
LCD5110_GPIOInit();
LCD5110Clear();
while(1)
{
Number=keyBoard();
switch(Number)
{
case 1: delay_ms(10);LCD5110WriteEnStr(0,2,"A");delay_ms(10);break;
case 2: delay_ms(10);LCD5110WriteEnStr(0,2,"B");delay_ms(10);break;
case 3: delay_ms(10);LCD5110WriteEnStr(0,2,"C");delay_ms(10);break;
case 4: delay_ms(10);LCD5110WriteEnStr(0,2,"D");delay_ms(10);break;
case 5: delay_ms(10);LCD5110WriteEnStr(0,2,"E");delay_ms(10);break;
case 6: delay_ms(10);LCD5110WriteEnStr(0,2,"F");delay_ms(10);break;
case 7: delay_ms(10);LCD5110WriteEnStr(0,2,"G");delay_ms(10);break;
case 8: delay_ms(10);LCD5110WriteEnStr(0,2,"H");delay_ms(10);break;
case 9: delay_ms(10);LCD5110WriteEnStr(0,2,"I");delay_ms(10);break;
case 10: delay_ms(10);LCD5110WriteEnStr(0,2,"J");delay_ms(10);break;
case 11: delay_ms(10);LCD5110WriteEnStr(0,2,"K");delay_ms(10);break;
case 12: delay_ms(10);LCD5110WriteEnStr(0,2,"L");delay_ms(10);break;
case 13: delay_ms(10);LCD5110WriteEnStr(0,2,"M");delay_ms(10);break;
case 14: delay_ms(10);LCD5110WriteEnStr(0,2,"N");delay_ms(10);break;
case 15: delay_ms(10);LCD5110WriteEnStr(0,2,"O");delay_ms(10);break;
}
}
} |
|