代码如下,Read_KeyValue()函数里面那个等待按键松开的while完全不理我。。就是不管我按键按没按,读取到的值都是最初使设置的值,求助各位大佬们帮我看看呗
#include "stm32f10x.h"
#include "key.h"
#include "sys.h"
#include "delay.h"
#include "usart.h"
//}
//u8 KEY_Scan(u8 mode)
//{
// static u8 key_up=1;//按键按松开标志
// if(mode)key_up=1; //支持连按
// if(key_up&&(KEY0==0 || KEY1==0 || KEY2==0 || KEY3==0 || KEY4==0 || KEY5==0 || KEY6==0))
// {
// delay_ms(10);//去抖动
// key_up=0;
// if(KEY0==KEY3)return 0;
// else if(KEY1==0)return 1;
// else if(KEY2==0)return 2;
// else if(KEY3==0)return 3;
// else if(KEY4==0)return 4;
// else if(KEY5==0)return 5;
// else if(KEY6==0)return 6;
// }else if(KEY0==1&&KEY1==1&&KEY2==0&&KEY3==0&&KEY4==0&&KEY5==0&&KEY6==0)key_up=1;
// return 0;// 无按键按下
//}
//#include <stm32f10x.h>
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOD, ENABLE);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;//4行
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;//行推挽输出
GPIO_Init(GPIOD,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;//4列
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPD;//列下拉输入
GPIO_Init(GPIOD,&GPIO_InitStruct);
GPIO_SetBits(GPIOD,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);//将行置为高电平
GPIO_ResetBits(GPIOD,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);//将列置为低电平
}
u8 KeyDown(void)
{
if((GPIO_ReadInputData(GPIOD)&0xff)!=0x0f)
{
return 1;
}
else return 0;
}
u8 Read_KeyValue(void)
{
u8 KeyValue=0;
u8 temp;
GPIO_SetBits(GPIOD,GPIO_Pin_0);//将第一行推挽输出为高电平
GPIO_ResetBits(GPIOD,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);//其他行为低电平
switch(GPIO_ReadInputData(GPIOD)&0xff)
{
case 0x11:KeyValue='1';break;
case 0x21:KeyValue='2';break;
case 0x41:KeyValue='3';break;
case 0x81:KeyValue='4';break;
default: break;
}
GPIO_SetBits(GPIOD,GPIO_Pin_1);
GPIO_ResetBits(GPIOD,GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3);
switch(GPIO_ReadInputData(GPIOD)&0xff)
{
case 0x12:KeyValue='5';break;
case 0x22:KeyValue='6';break;
case 0x42:KeyValue='7';break;
case 0x82:KeyValue='8';break;
default: break;
}
GPIO_SetBits(GPIOD,GPIO_Pin_2);
GPIO_ResetBits(GPIOD,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_3);
switch(GPIO_ReadInputData(GPIOD)&0xff)
{
case 0x14:KeyValue='9';break;
case 0x24:KeyValue='A';break;
case 0x44:KeyValue='B';break;
case 0x84:KeyValue='C';break;
default: break;
}
GPIO_SetBits(GPIOD,GPIO_Pin_3);
GPIO_ResetBits(GPIOD,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2);
switch(GPIO_ReadInputData(GPIOD)&0xff)
{
case 0x18:KeyValue='D';break;
case 0x28:KeyValue='E';break;
case 0x48:KeyValue='F';break;
case 0x88:KeyValue='G';break;
default: break;
}
GPIO_SetBits(GPIOD,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);
GPIO_ResetBits(GPIOD,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);
// while((GPIO_ReadInputData(GPIOA)&0xff)!=0x0f);
while(KeyValue!=0)
{
printf("%c",KeyValue);
//while( KEY4==0 || KEY5==0 || KEY6==0)
}
return KeyValue;
}
int ScanKeyBoard(void)
{
if(KeyDown())
{
delay_ms(10);
if(KeyDown())
{
printf("the key is down!
");
return Read_KeyValue();
}
else
{
printf("nothing");
}
}
return 0;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
用我的吧http://www.openedv.com/forum.php?mod=viewthread&tid=277263
一周热门 更多>