PIC32MZ tutorial -- Key Debounce

发布者:钱币之歌最新更新时间:2017-01-20 来源: eefocus关键字:PIC32MZ  tutorial  Key  Debounce 手机看文章 扫描二维码
随时随地手机看文章

  Today I accomplish a application on PIC32MZ EC Starter Kit. The feature of application is to light up LED when key released and put out LED when key pressed. LED is  the Starter Kit LED1 connecting to RH0. Key is the Starter Kit push button SW1 connecting to RB12. I also use the Timer1 Interrupt. In my application, I just design the software with three modules -- LED module, KEY module and TIMER1 module and the final is the main function and interrupt service routine.


  LED module let LED1 on when "LedState" variable is 1, and off when "LedState" variable is 0. Below is its implementation.



#define LED_IOCTL()       TRISHCLR = (1<<0)

#define LED_SETON()       LATHSET = (1<<0)

#define LED_SETOFF()      LATHCLR = (1<<0)

#define LED_ONOFF()       LATHINV = (1<<0)

#define LED_OPEN()        ANSELH &= 0xFFFFFFFE


typedef enum _LED_STATE_t

{

    OFF = 0,

    ON = 1

} LED_STATE_t;

    

LED_STATE_t PreLedState, LedState;


void Led_Init(void)

{

    LED_OPEN();

    LED_IOCTL();

    LED_SETON();

    LedState = ON;

    PreLedState = LedState;

}


void Led_Scheduler(void)

{

    if (LedState != PreLedState)

    {

        LED_ONOFF();

        PreLedState = LedState;

    }

}


  The "LedState" variable is determined by KEY module. The key press validated, the "LedState" is 1. The key release validated, the "LedState" is 0. Since the key (push button) does not have any debounce circuitry. I enable the internal resistor pull-up and use a debounce algorithm to remove random or spurious transistings of a digital signal read as an input by PIC32MZ. The following example illustrates how this algorithm works. The sequence labeled, corrupted, has significant random transitions added to the real signal. The sequence labled, integrator, represents the algorithm integrator which is constrained to be between 0 and 3. The sequence labeled, output, only makes a transition when the integrator reaches either 0 or 3. Note that the output signal lags the input signal by the integration time but is free of spurious transitions.


real signal  0000111111110000000111111100000000011111111110000000000111111100000


corrupted   0100111011011001000011011010001001011100101111000100010111011100010


integrator    0100123233233212100012123232101001012321212333210100010123233321010


output    0000001111111111100000001111100000000111111111110000000001111111000


  The algotithm has been around for many many years but does not seem to be widely known. It is notable that the algotithm uses integration as opposed to edge logic. It is the integration that makes this algotithm so robust in the presence of noise. In the implementation of KEY module, I use "DEBOUNCE_TimeFlag" variable to control debounce start.


#define DEBOUNCE_Input          (PORTB & 0x1000)

#define DEBOUNCE_Open()         ANSELB = 0xFFFFEFFF

#define DEBOUNCE_IOCtl()        CNPUBSET = 0x1000

#define DEBOUNCE_Output         LedState

#define DEBOUNCE_ThreholdLow    0

#define DEBOUNCE_ThreholdHigh   100


unsigned long DEBOUNCE_PreInput;

unsigned char DEBOUNCE_EventStart;

unsigned int DEBOUNCE_Integrator;

volatile unsigned char DEBOUNCE_TimeFlag;


    void Key_Init(void)

    {

        DEBOUNCE_EventStart = 0;

        DEBOUNCE_Integrator = DEBOUNCE_ThreholdHigh / 2;

        DEBOUNCE_TimeFlag = 0;

        

        DEBOUNCE_Open();

        DEBOUNCE_IOCtl();

        DEBOUNCE_PreInput = DEBOUNCE_Input;

    }


    void Key_Scheduler(void)

    {

        if (DEBOUNCE_TimeFlag)

        {

            if (DEBOUNCE_EventStart)

            {

                if (DEBOUNCE_Input == 0)

                {

                    if (DEBOUNCE_Integrator-- == DEBOUNCE_ThreholdLow)

                    {

                        DEBOUNCE_Output = 0;

                        DEBOUNCE_PreInput = DEBOUNCE_Input;

                        DEBOUNCE_EventStart = 0;

                        DEBOUNCE_Integrator = DEBOUNCE_ThreholdHigh / 2;

                    }

                }

                else                   //if (DEBOUNCE_Input == 1)

                {

                    if (DEBOUNCE_Integrator++ == DEBOUNCE_ThreholdHigh)

                    {

                        DEBOUNCE_Output = 1;

                        DEBOUNCE_PreInput = DEBOUNCE_Input;

                        DEBOUNCE_EventStart = 0;

                        DEBOUNCE_Integrator = DEBOUNCE_ThreholdHigh / 2;

                    }

                }

            }

            else if (DEBOUNCE_PreInput != DEBOUNCE_Input)

            {

                DEBOUNCE_EventStart = 1;

            }

            DEBOUNCE_TimeFlag = 0;

        }

    }


  TIMER module uses timer1 to generate interrupt per millisecond. and set "DEBOUNCE_TimeFlag" logic 1 in the timer1 interrupt service routine.



void Timer1_Init(void)

{

    T1CON = 0x8010;

    PR1 = 0x30D3;

    IPC1SET = 0x5;

    TMR1 = 0;

    IEC0SET = 0x10;

    IFS0CLR = 0x10;

}

void Timer1_Write(unsigned int value)

{

    TMR1 = value & 0xFFFF;

}

unsigned int Timer1_Read(void)

{

    return (TMR1 & 0xFFFF);

}


  Since interrupt will be used, the following sentence is enable interrupt with multi-vector mode.


#define Mvec_Interrupt() INTCONSET = 0x1000; asm volatile("ei")

  The final is the implementation of main function and interrupt service and routine.



#include

#include "Led.h"

#include "Key.h"

#include "Timer.h"

#include "Interrupt.h"

#include

#include "ConfigurationBits.h"


void __ISR(_TIMER_1_VECTOR,ipl1AUTO) Timer1_Handler(void)

{

    DEBOUNCE_TimeFlag = 1;

    Timer1_Write(0);

    IFS0CLR = 0x10; // Clear flag

 }


void main(void) 

{

    Led_Init();

    Key_Init();

    Timer1_Init();

    Mvec_Interrupt();

    

    while (1)

    {

        Key_Scheduler();

        Led_Scheduler();

    }

}


   The coding thing is done so far. we only need to compile and build it, then download it to PIC32MZ EC Starter Kit. You will get SW1 presse or release followed LED1 off or on. I bet it would run perfectly since the wonderful debounce algorithm.


关键字:PIC32MZ  tutorial  Key  Debounce 引用地址:PIC32MZ tutorial -- Key Debounce

上一篇:PIC32MZ tutorial -- Change Notification
下一篇:PIC32MZ tutorial -- Timer Interrupt

推荐阅读最新更新时间:2024-03-16 15:31

Bantam Tools 桌面 PCB 铣床通过 Digi-Key 面向全球即时供货
    美国明尼苏达州锡夫里弗福尔斯市——全球电子元器件分销商 Digi-Key Electronics 近日与 Bantam Tools 公司签订新的独家代理协议,为其在全球分销 Bantam Tools 桌面 PCB 铣床。Bantam Tools 桌面 PCB 铣床以实惠的价格实现了专业级的可靠性和精度。   Bantam Tools 桌面 PCB 铣床直接从 Gerber 文件铣削,可轻松处理具有 6 密耳印制线和空间的双面 PCB。利用该铣床,即可在内部快速完成原型迭代,而无需等待 PCB 晶圆厂交付产品。   “Bantam Tools 一直在设法为依赖 Bantam Tools 桌面 PCB 铣床制作电
[工业控制]
STM8L151C8学习笔记2:KEY驱动
实现功能:用按键来实现LED灯的亮灭。 按键是外部电路来决定高低电平的,若按键未按下时,默认为高电平;若按键按下时,为低电平。 按键检测主要是根据按键对应I/0口的电平状态,来生成按键信号。 硬件电路 KEY: 按键程序编写 1.读取I/O口函数 从stm8l15x_gpio.c中的GPIO_ReadInputDataBit()函数来看,该函数返回值是通过GPIO的IDR寄存器读取I/O口状态,然后&上相应的GPIO_Pin_x,最后再将结果强制转换为BitStatus。 STM8的写法返回值可能出现大于1的数,其原因在于原类型的数强制转换成BitStatus后,返回的结果仍为0或1以外的值(可能为0x02,0x0
[单片机]
STM8L151C8学习笔记2:<font color='red'>KEY</font>驱动
电容式Touch Key实现便携产品省电轻薄的设计
随着近年来触摸技术在各个不同市场的普及,各种触摸技术迅速发展,其中尤以电容式触摸应用发展最快。A1semi继电阻式触摸控制芯片在手机市场的广泛应用后,又推出了电容感应式触摸按键芯片。相比较传统的机械式按键和电阻式触摸按键,电容式触摸手感流畅、触摸屏透光性、面板强固耐受、防尘、防水及防电磁,不受强光信号干扰、成本低等特点。 A1semi的电容式触摸方案AS9048基于RC采样原理,如下图,电容值(C)由两部分组成:固定电容(电极电容)和感应电容(当人手接触或者靠近电极时,由人手带来的电容)。电极电容应该尽可能的小,以保证检测到人手触摸。通过测量触摸电极电容的微小变化,来感知人体对电容式触摸感应器(按键、滚轮或者滑条)的触摸。
[手机便携]
电容式Touch <font color='red'>Key</font>实现便携产品省电轻薄的设计
Digi-Key推进分销来自 Renesas 和 Dialog 的致胜产品组合
随着公司合并的完成,Digi-Key Electronics 推进分销来自 Renesas 和 Dialog 的致胜产品组合 Digi-Key Electronics 拥有全球品类极为丰富的现货电子元件库,并且能够立即发货。 日前表示,随着 Renesas Electronics 和 Dialog Semiconductor 两家公司于 2021 年 8 月 31 日宣布完成合并之后,Digi-Key Electronics 将继续大力支持这两家公司的产品组合。 Digi-Key 推进分销来自 Renesas 和 Dialog 的强大产品组合。 作为完成合并的直接受益方, Digi-Key 宣布了来自 Rene
[物联网]
Digi-<font color='red'>Key</font>推进分销来自 Renesas 和 Dialog 的致胜产品组合
Digi-Key与APEM签订全球分销协议 提供开关产品目录
Digi-Key Corporation与APEM Components日前共同宣布,双方已签订全球分销协议。Digi-Key是全球增长速度最快的电子元件分销商之一,当前向140多个国家发运产品。 APEM Components是全球专业开关及开关柜的最大制造商之一,其在北美、欧洲及亚洲均设有制造机构。APEM 面向电子、工业自动化、电信、支线公路系统、军事、海运、汽车、仪表及医疗等活跃市场中的客户设计、制造及销售专业开关产品。 Digi-Key库存的APEM产品包括按钮开关、摇头开关、翘板开关及摇杆开关,以及针对各种电路类型、端子选择及额定电流的其它开关。这些产品已列入Digi-Key的印刷及在线目录中,客户可直接从Dig
[焦点新闻]
Digi-Key与PI合作推出聚焦电源活动给用户更高的电源转换效率
Digi-Key Electronics 与 Power Integrations 合作推出聚焦电源活动,协作给用户带来了更高的电源转换效率 全球供应品类最丰富、发货最快速的现货电子元器件分销商 Digi-Key Electronics 日前宣布与高压电源转换半导体技术的领先创新者 Power Integrations 合作,供应其采用 PowiGaN™ 技术的 InnoSwitch™3 IC 系列。 该技术可降低能耗且具有高抗冲击性能,同时适合要求严苛的消费和工业应用。 作为聚焦电源活动的一部分,Digi-Key Electronics 与 Power Integrations 达成合作,推出其 InnoSwi
[电源管理]
Digi-<font color='red'>Key</font>与PI合作推出聚焦电源活动给用户更高的电源转换效率
全物理键盘设计保留 黑莓KEY2本周五发布
摘要:在直板触屏手机大行其道的今天,黑莓KEY2使用触屏加全物理键盘的设计,想必是一股清流。 下一代黑莓KEY系列的名字已经确定了,叫做KEY2,并将于本周五(6月8日)上午9:30在北京达美中心1号馆举行新品发布会。 从入网工信部的照片看,KEY2延续了 KEYone 的设计风格,还是触屏加物理全键盘的设计,新机的正面跟 KEYone 没有太大区别,或者新机的屏占比会比之前再大一点,背面是横排双摄+闪光灯的组合,黑莓引以为豪的logo也放置在背面。 可能是觉得工信部的照片有些朴素,爆料大神都看不下去了,于是放出了KEY2的真机渲染图,方正有型、硬朗的外观,外加上全物理键盘的设计,想必会让不少商务男士为之心动。
[手机便携]
Marktech Optoelectronics 和 Digi-Key 合作推出 定制型光电探测器
Marktech Optoelectronics 与全球电子元器件分销商 Digi-Key Electronics 展开合作,按照客户规格要求供应经专门设计和优化的定制型光电探测器。下面就随电源管理小编一起来了解一下相关内容吧。 Marktech Optoelectronics 和 Digi-Key 合作推出 定制型光电探测器 定制探测器覆盖以下任一 Marktech 产品线:硅光伏或光敏光电二极管、雪崩光电二极管、光电晶体管或 InGaAs PIN 光电二极管。此外,还提供定制器件封装,包括符合客户规格要求的或由 Marktech 推荐的最适合客户应用的封装。 Marktech Optoelectronics 首席执行官
[电源管理]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved