查看: 321|回复: 4
打印 上一主题 下一主题

STM32定时器实现按键

[复制链接] qrcode

35

主题

38

帖子

115

积分

注册会员

Rank: 2

积分
115
楼主
跳转到指定楼层
发表于 2016-3-13 02:00 PM | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

源代码:

int main(void)
{
u8 t;
u8 len;
u16 times=0;
long int i;
STM32_Clock_Init(6);    //72MHz
  delay(1000);
CPU_Init();
GPIO_ResetBits(GPIOA, GPIO_Pin_13 );
//KEY_Init();
//LED0_SET(0);
//delay(24000);
//IWDG_init(4,625);
TIM3_Int_Init(50,7199); //10kHz的计数频率,计数到5000为500ms
while(1)
{
   if((KeyPress&0x1)==0)
LED0_SET(0);
// //for(i=0;i<1000000;i++);
else
LED0_SET(1);
// if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15)==0)
// LED1_SET(0);
// else
// LED1_SET(1);
//for(i=0;i<1000000;i++);
}
}

uint8_t GetKeyValue(void)
{
uint8_t temp=0;
if(KEY0_GET()==0)
temp|=1;
else
temp&=0xfe;
if(KEY1_GET()==0)
temp|=2;
else
temp&=0xfd;
return temp;
}
void TIM3_IRQHandler(void)
{
if(TIM3->SR&0X0001)
{
if(!KeyCanChange)
{
TIM3->SR&=~(1<<0);
return; //如果正在处理按键,则不再扫描键盘
}
//开始键盘扫描,保存按键状态到当前按键情况
//KeyCurrent总共有两个位,当某个开关按下时,对应的位为1
KeyCurrent=GetKeyValue(); //读取键值
if(KeyCurrent!=KeyOld) //如果两次值不等,则说明按键情况发生了改变
{
KeyNoChangedTime=0; //按键按下时间为0
KeyOld=KeyCurrent; //保存当前按键情况
TIM3->SR&=~(1<<0);
return;
}
else
{
KeyNoChangedTime++; //按下时间累计
if(KeyNoChangedTime>=1) //如果按下时间足够
{
KeyNoChangedTime=1;
KeyPress=KeyOld; //保存按键
KeyDown|=(~KeyLast)&(KeyPress); //求出新按下的键
KeyUp|=KeyLast&(~KeyPress); //求出新释放的键
KeyLast=KeyPress; //保存当前按键情况
}
}
// if(flag2==0)
// {
// flag2=1;
// LED1_SET(0);
// }
// else
// {
// flag2=0;
// LED1_SET(1);
// }
}
TIM3->SR&=~(1<<0);
}


原理图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

0

主题

77

帖子

4

积分

新手上路

Rank: 1

积分
4
沙发
发表于 2016-3-13 06:22 PM | 只看该作者
亲,至少加个图,代码格式化下吧,
回复 支持 反对

使用道具 举报

21

主题

288

帖子

437

积分

中级会员

Rank: 3Rank: 3

积分
437
板凳
发表于 2016-3-13 06:24 PM | 只看该作者
原理图有啊,你没看见吗
回复 支持 反对

使用道具 举报

1

主题

109

帖子

21

积分

新手上路

Rank: 1

积分
21
地板
发表于 2016-3-14 12:20 PM | 只看该作者

说到按键,给你看看下面的

unsigned char Trg;
unsigned char Cont;
void KeyRead( void )
{
    unsigned char ReadData = PINB^0xff;   // 1
    Trg = ReadData & (ReadData ^ Cont);      // 2
    Cont = ReadData;                                // 3
}
完了。有没有一种不可思议的感觉?当然,没有想懂之前会那样,想懂之后就会惊叹于这算法的精妙!!
下面是程序解释:
Trg(triger) 代表的是触发,Cont(continue)代表的是连续按下。
1:读PORTB的端口数据,取反,然后送到ReadData 临时变量里面保存起来。
2:算法1,用来计算触发变量的。一个位与操作,一个异或操作,我想学过C语言都应该懂吧?Trg为全局变量,其它程序可以直接引用。
3:算法2,用来计算连续变量。

回复 支持 反对

使用道具 举报

6

主题

188

帖子

192

积分

注册会员

Rank: 2

积分
192
5#
发表于 2016-3-14 04:04 PM | 只看该作者
你这个没有消抖吧
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表