历史上的今天
返回首页

历史上的今天

今天是:2024年11月28日(星期四)

正在发生

2019年11月28日 | avr单片机mega32基于状态机的按键设计

2019-11-28 来源:51hei

以前用延时消抖,比较浪费时间,现在用状态机设计,不占用太多时间,但是需要一个定时器。


1.状态机按键消抖






*****************************************************************
//状态机按键消抖
//CPU:mega32
//编译器:winavr


#include
#include

char key_scan(void);

#define PRESS   ( PIND&(1<<3) ) == 0
#define NOT_PRESS  ( PIND&(1<<3) ) != 0

int main(void)
{
DDRC |= (1 << 7);//PC7置为输出
PORTD |= 1<<3;//按键上拉

TIMSK |= 1<OCR0 = 0X10;//匹配值 大约10ms
TCCR0 |= (1 << WGM01) | (0 << WGM00) | (1 << CS02) | (0 << CS01) | (1 << CS00);//CTC模式,1024分频
sei();//使能全局中断

while(1);
}

SIGNAL(SIG_OUTPUT_COMPARE0)//TIMER0 匹配中断服务程序
{
if ( key_scan() == 1 )
  PORTC ^= 1<<7;//PC7取反
}

char key_scan(void)
{
static char state=0;
switch(state)
{
case 0: if ( PRESS )
   {
    state = 1;
    return 0;
   }
   else
   {
    state = 0;
    return 0;
   }

case 1: if ( PRESS )
   {
    state = 2;
    return 1;
   }
   else
   {
    state = 0;
    return 0;
   }

case 2: if ( PRESS )
   {
    state = 2;
    return 0;
   }
   else
   {
    state = 0;
    return 0;
   }
}
return 0;
}


******************************************************************


2.状态机按键检测连击






*****************************************************************
//状态机按键消抖
//CPU:mega32
//编译器:winavr


#include
#include

char key_scan(void);

#define PRESS   ( PIND&(1<<3) ) == 0
#define NOT_PRESS  ( PIND&(1<<3) ) != 0

int main(void)
{
DDRC |= (1 << 7) | (1 << 6);//PC7 PC6 置为输出
PORTD |= 1<<3;//PD3按键内部上拉

TIMSK |= 1<OCR0 = 0X10;//匹配值 大约10ms
TCCR0 |= (1 << WGM01) | (0 << WGM00) | (1 << CS02) | (0 << CS01) | (1 << CS00);//CTC模式,1024分频
sei();//使能全局中断

while(1);
}

SIGNAL(SIG_OUTPUT_COMPARE0)//TIMER0 匹配中断服务程序
{
char key;
key = key_scan();
if ( key == 1 )
  PORTC ^= 1<<7;//PC7取反
if ( key == 2 ) //连击
  PORTC ^= 1<<6;//PC6取反
}

char key_scan(void)
{
static char state=0;
char times;
switch(state)
{
case 0: if ( PRESS )
   {
    state = 1;
    return 0;
   }
   else
   {
    state = 0;
    return 0;
   }

case 1: if ( PRESS )
   {
    times = 0;
    state = 2;
    return 1;
   }
   else
   {
    state = 0;
    return 0;
   }

case 2: if ( PRESS )
   {
    state = 2;
    times++;
    if (times > 50)//500ms
    {
     times = 0;
     return 2;
    }
    else
     return 0;
   }
   else
   {
    state = 0;
    return 0;
   }
}
return 0;
}

******************************************************************

推荐阅读

史海拾趣

Austek Microsystems公司的发展小趣事

面对行业技术的快速迭代,Austek Microsystems始终保持敏锐的洞察力。公司不断投入研发资金,引进先进的生产设备和技术人才,进行技术升级和产品迭代。通过不断地优化产品性能、提升生产效率,Austek Microsystems逐渐在市场中树立起了技术领先的形象。

General Electric Company公司的发展小趣事
能够承受较高的电源电压,通常远高于普通运算放大器。
艾迈斯(AMASS)公司的发展小趣事

随着电子行业的快速发展,艾迈斯(AMASS)公司意识到只有不断创新才能保持领先地位。为此,公司加大了对研发的投入,引进了一批高素质的研发人才,并建立了完善的研发体系。经过多年的努力,艾迈斯成功研发出了多款具有创新性的连接器产品,其中包括高性能、高安全性的智能设备动力连接器。这些产品的推出不仅提升了公司的技术实力和市场竞争力,也为整个行业的发展带来了积极的影响。

Fairchild Imaging公司的发展小趣事

Fairchild Imaging公司的历史可以追溯到1950年成立的Fairchild Camera & Instrument Company。这家公司自创立以来,就凭借其创新的技术和优质的产品,在许多重大的政府、国防项目中发挥了关键作用。随着公司业务的不断拓展,Fairchild Camera & Instrument Company逐渐将业务重心转向半导体和集成电路领域,并在此领域取得了显著成就。最终,Fairchild Imaging从Fairchild Camera & Instrument Company中独立出来,专注于高端成像技术的研发和应用。

Excelight Communications Inc公司的发展小趣事

随着5G技术的兴起,光通信行业迎来了新的发展机遇。Excelight紧跟时代步伐,投入大量资源进行技术研发。在李明和团队的共同努力下,公司成功研发出了一款具有自主知识产权的高速光通信芯片,这一成果不仅填补了国内空白,还使Excelight在国际市场上占据了有利地位。

技术突破后,Excelight的产品性能得到了显著提升,同时也带动了整个产业链的升级。公司开始与更多的国内外企业建立合作关系,共同推动光通信行业的发展。

Advanced Technology Corp公司的发展小趣事

ATC公司深知质量管理对于企业发展的重要性。因此,公司建立了严格的质量管理体系,从原材料的采购到产品的生产、检测、包装等环节都进行严格控制。此外,ATC公司还注重员工的培训和教育,提升员工的质量意识和技能水平。这些措施确保了ATC公司产品的稳定性和可靠性,赢得了客户的信任和好评。

问答坊 | AI 解惑

磁敏式位置传感器的原理和维修

众所周知.磁敏式位置传感器以其体积小、记录线性好、所需主放大电路结构简单等优点已经逐渐替代了电磁式的位置传感器。由于磁敏式位置传感器的故障导致心电图机单偏而不能正常使用的情况比较普遍,下面介绍本人在维修这方面故障的一些维修体会,与 ...…

查看全部问答>

重建职场新守则

以职位、收入来定义成功的“杜拉拉”们,需要静下心来思考自己的职场人生。从“江湖”到“人生”,职场智慧需要更宽阔的视角和更高的境界。而在新技术潮流下,重建职场守则,也意味着更多新的职场观念。   中国人的江湖情结,或许是职场话题风靡 ...…

查看全部问答>

基于C++的Windows CE文件IO处理技术.pdf

基于C++的Windows CE文件IO处理技术.pdf…

查看全部问答>

带usb或spi或iic的单片机有哪些?51系列的有吗?那些比较便宜?急!!!!!!!!

带usb或spi或iic的单片机有哪些?51系列的有吗?那些比较便宜?急!!!!!!!!…

查看全部问答>

PID设定及管理大集合

吉时利2510-AT自动调谐算法[1]中,对于PID值集合的使用及PID系数集合的管理及调整有一系列的要求,在这个章节和大家一起探讨。   在多个设定点使用一个PID值集合 如果在一个以上的温度设定点使用单一PID值集合,那么应对自动调谐停止温度 ...…

查看全部问答>

出一些开发板板DEMO板

如图;具体信息需要上网寻找!…

查看全部问答>

MSP430程序问题

大家好,我有个问题一直解决不了,请教下各位大牛。 我之前在IAR EW430 5.52版本下编辑的程序,但是后面买来的仿真器固件是5.20版本,并且一升级固件的话就崩溃,无法识别JTAG。 所以,我想在想把5.52版本的程序移植成5.20的版本。 移植步骤就是 ...…

查看全部问答>