烽火社区

标题: STM32定时器实现按键 [打印本页]

作者: 住山兆永    时间: 2016-3-13 02:00 PM
标题: STM32定时器实现按键

源代码:

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);
}


原理图

[attach]32245[/attach]


作者: 豆豆笑笑    时间: 2016-3-13 06:22 PM
亲,至少加个图,代码格式化下吧,
作者: ql_smbj    时间: 2016-3-13 06:24 PM
原理图有啊,你没看见吗
作者: Monchouchou    时间: 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,用来计算连续变量。


作者: 汉淮南王    时间: 2016-3-14 04:04 PM
你这个没有消抖吧




欢迎光临 烽火社区 (http://bbs.cnecport.com/) Powered by Discuz! X3.2