历史上的今天
今天是:2024年11月28日(星期四)
2019年11月28日 | avr单片机mega32基于状态机的按键设计
2019-11-28 来源:51hei
以前用延时消抖,比较浪费时间,现在用状态机设计,不占用太多时间,但是需要一个定时器。
1.状态机按键消抖

*****************************************************************
//状态机按键消抖
//CPU:mega32
//编译器:winavr
char key_scan(void); #define PRESS ( PIND&(1<<3) ) == 0 int main(void) TIMSK |= 1< SIGNAL(SIG_OUTPUT_COMPARE0)//TIMER0 匹配中断服务程序 char key_scan(void) case 1: if ( PRESS ) case 2: if ( PRESS ) 2.状态机按键检测连击 #include char key_scan(void); #define PRESS ( PIND&(1<<3) ) == 0 int main(void) TIMSK |= 1< SIGNAL(SIG_OUTPUT_COMPARE0)//TIMER0 匹配中断服务程序 char key_scan(void) case 1: if ( PRESS ) case 2: if ( PRESS ) ******************************************************************
#include
#include
#define NOT_PRESS ( PIND&(1<<3) ) != 0
{
DDRC |= (1 << 7);//PC7置为输出
PORTD |= 1<<3;//按键上拉
TCCR0 |= (1 << WGM01) | (0 << WGM00) | (1 << CS02) | (0 << CS01) | (1 << CS00);//CTC模式,1024分频
sei();//使能全局中断
while(1);
}
{
if ( key_scan() == 1 )
PORTC ^= 1<<7;//PC7取反
}
{
static char state=0;
switch(state)
{
case 0: if ( PRESS )
{
state = 1;
return 0;
}
else
{
state = 0;
return 0;
}
{
state = 2;
return 1;
}
else
{
state = 0;
return 0;
}
{
state = 2;
return 0;
}
else
{
state = 0;
return 0;
}
}
return 0;
}
******************************************************************
*****************************************************************
//状态机按键消抖
//CPU:mega32
//编译器:winavr
#include
#define NOT_PRESS ( PIND&(1<<3) ) != 0
{
DDRC |= (1 << 7) | (1 << 6);//PC7 PC6 置为输出
PORTD |= 1<<3;//PD3按键内部上拉
TCCR0 |= (1 << WGM01) | (0 << WGM00) | (1 << CS02) | (0 << CS01) | (1 << CS00);//CTC模式,1024分频
sei();//使能全局中断
while(1);
}
{
char key;
key = key_scan();
if ( key == 1 )
PORTC ^= 1<<7;//PC7取反
if ( key == 2 ) //连击
PORTC ^= 1<<6;//PC6取反
}
{
static char state=0;
char times;
switch(state)
{
case 0: if ( PRESS )
{
state = 1;
return 0;
}
else
{
state = 0;
return 0;
}
{
times = 0;
state = 2;
return 1;
}
else
{
state = 0;
return 0;
}
{
state = 2;
times++;
if (times > 50)//500ms
{
times = 0;
return 2;
}
else
return 0;
}
else
{
state = 0;
return 0;
}
}
return 0;
}
上一篇:ATmega32单片机定时器程序
下一篇:avr单片机USART程序详解
史海拾趣
|
众所周知.磁敏式位置传感器以其体积小、记录线性好、所需主放大电路结构简单等优点已经逐渐替代了电磁式的位置传感器。由于磁敏式位置传感器的故障导致心电图机单偏而不能正常使用的情况比较普遍,下面介绍本人在维修这方面故障的一些维修体会,与 ...… 查看全部问答> |
|
吉时利2510-AT自动调谐算法[1]中,对于PID值集合的使用及PID系数集合的管理及调整有一系列的要求,在这个章节和大家一起探讨。 在多个设定点使用一个PID值集合 如果在一个以上的温度设定点使用单一PID值集合,那么应对自动调谐停止温度 ...… 查看全部问答> |
|
大家好,我有个问题一直解决不了,请教下各位大牛。 我之前在IAR EW430 5.52版本下编辑的程序,但是后面买来的仿真器固件是5.20版本,并且一升级固件的话就崩溃,无法识别JTAG。 所以,我想在想把5.52版本的程序移植成5.20的版本。 移植步骤就是 ...… 查看全部问答> |




