说明:3个独立按键分别接stm32的PB10,
PB11和
PB12
具体原理请参照:
http://www.amobbs.com/thread-4308630-1-1.html
下面是自己移植的,不足之处,希望各位指点:
#define KEY12 0x10 //安照八位单片机来算,对独立按键的信号端进行宏定义 ,方便后面检测用(PB10, 
B11和 
B12就按PB2, 
B3和 
B4来定义)
#define KEY11 0x08 //也可以按照实际来定义,但KeyRead(void) 函数需要做适当修改
#define KEY10 0x04
unsigned char KEY_Trg; //扫描按键用(单击一次用) 全局变量
unsigned char KEY_Count;//扫描按键(长按用)用全局变量
unsigned char ms;//毫秒计数器
全局变量
unsigned char t;// 表示长按按键的时间 =t*扫描时间?这里有个疑问,这个变量应该申明位全局还是局部?测试了一下都可以
void KeyRead(void) //按键扫描函数
{
unsigned char ReadData ;
unsigned int temp;
//若按键接的是IO口的高8位,需要定义一个缓冲区
//ReadData=((GPIOB->IDR^0xff));
//若按键接的是低8位的话,用这一句话就行,下面3句不需要
temp=GPIOB->IDR&0xff00;//
若按键接的是IO口的高8位 使用 ;GPIOB->IDR不能写,需要定义一个缓冲区
temp>>=8; //
若按键接的是IO口的高8位 使用
ReadData=temp^0xff;
// 若按键接的是IO口的高8位高8位用
KEY_Trg = ReadData & (ReadData ^ KEY_Count); // 2
KEY_Count = ReadData; // 3
}
void KeyProcess(void)
{
if((KEY_Trg & KEY10))//短按
{do something}
else if((KEY_Trg & KEY11))
{do something}
else if((KEY_Trg & KEY12))
{do something}
if((
KEY_Count & KEY10))//长按
{
t++;
if(t>30) //根据需要修改长安时间
{
t=0;
{do something}
}
}
}
void main(void)
{
if(ms>80)//主程序每隔80ms去扫描一次按键
{
ms =0;
KeyRead() ;
KeyProcess() ;
}
else {do something}
}
stm32的初始化配置就省啦,相信大家都会拉
---------------------------------
你好 在吗?
{
static u8 keytemp=0;
static u16 key_count=0;
if(KEY0==0||KEY1==0)
{
if(key_count<200)
{
if(KEY0==0) keytemp=1;
if(KEY1==0) keytemp=2;
}
else if(key_count==200)
{
if(KEY0==0) keynum=3;
if(KEY1==0) keynum=4;
keytemp=3;
}
key_count++;
}
else if(KEY0==1&&KEY1==1)
{
if(key_count>1)
{
if(keytemp!=3) keynum=keytemp;
key_count=0;
}
}
}
一样的原理~,如果加其他功能 长按,同时按,真的很方便
---------------------------------
1秒以上 每100毫秒连发一次 一秒发10次 ,是个什么意思,不太明白,望您说的再详细一点,正好在测试菜单结构,用到按键,顺便再测试一下你这个“游戏手柄”玩意
一周热门 更多>