说明: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的初始化配置就省啦,相信大家都会拉
---------------------------------
状态机嘛。马潮老师的书有说过
{do something}
else if((KEY_Trg & KEY11))
{do something}
else if((KEY_Trg & KEY12))
{do something}
当这个时候刚刚有一个脉冲(干扰脉冲)来的话,会不会误动作!那怎么解决?我想了很久。。。。
---------------------------------
测试下先!
一周热门 更多>