funpack-7-DM164137 PIC Curiosity LPC开发板
通过按键扩展功能,分为按键点击,短按长按用来控制板上LED显示。同时用串口模块打印信息
标签
嵌入式系统
Funpack参赛
大熊Bear
更新2021-04-22
1033

任务要求:

通过按键扩展功能,分为按键点击(快速点击),短按(大于1秒),长按(大于5秒)用来控制板上LED显示。同时外接串口模块打印信息(包括按键信息,电位计信息)。

本期Funpack板卡:Microchip DM164137 PIC Curiosity LPC开发板。

设计思路:

初始化一个1ms定时器中断,主程序的while(1)中进行空循环,

在定时器中断中,读取按键的电平,按键按下后进入按键事件的判断。设立一个全局变量对按键长度进行计时。

外设配置

设置时钟为高速内部晶振,分频系数为1,这样系统主时钟就为32MHz

Fv6bgvI4gVI3SOxztTm9eYmwzYIp

 

启用低压编程功能

FlCsRnMEozPIh0yo3UZJJ2i4b4Fk

 

设置内部定时器0,MCC的功能很强大,选择好分频系数,自动计算定时范围,设置好定时器时长如下

Fmj7wyxsAe42TMjDE80zlgVoYdu7

 

串口模块,设置波特率为115200,重定向至printf函数

FmkvjVy3mh2lwhFWlK_jI4I3zSh2

 

代码部分

void main(void)
{
    // initialize the device
    SYSTEM_Initialize();

    // Enable the Global Interrupts
    INTERRUPT_GlobalInterruptEnable();

    // Enable the Peripheral Interrupts
    INTERRUPT_PeripheralInterruptEnable();

    TMR0_SetInterruptHandler(TMR0ISR);

 
    while (1)
    {
    }
}
void TMR0ISR()
{
    if(S1_GetValue() == 0)
    {
        Button0Touch = 1;
    }
    else
    {
        Button0Touch = 0;
    }
    button_check(0);
}
#define SHORT_PUSH_CNT 1000
#define LONG_PUSH_CNT 4000
#define WAIT_DOUBLE_CNT 200

BTN_STATE Button0_state[MTOUCH_BUTTONS];
uint16_t Button0_cnt;


BTN_STATE button_check(enum mtouch_button_names button)
{
    switch(Button0_state[button])
    {
        case BTN_RELEASE:
        {
            if(Button0Touch)
            {
                
                Button0_state[button] = BTN_TOUCH;
            }
            break;
        }
        case BTN_TOUCH:
        {
            if(Button0Touch)
            {
                if(Button0_cnt>SHORT_PUSH_CNT)
                {
                    Button0_state[button] = SHORT_PUSH;
                    Button0_cnt = 0;
                }
                Button0_cnt++;
            }
            else
            {
                Button0_state[button] = CLICK;
                Button0_cnt = 0;
            }
            break;
        }
        case CLICK:
        {
            if(!Button0Touch)
            {
                LED_D5_Toggle();
                        //Get the top 4 MSBs and display it on the LEDs

                
                Button0_state[button] = WAIT_DOUBLE;
                Button0_cnt = 0;
            }
            break;
        }
        case DOUBLE_CLICK:
        {
            if(!Button0Touch)
            {
                Button0_state[button] = BTN_RELEASE;
                Button0_cnt = 0;
            }
            break;
        }
        case SHORT_PUSH:
        {
            if(Button0Touch)
            {
                if(Button0_cnt>LONG_PUSH_CNT)
                {
                    Button0_state[button] = LONG_PUSH;
                    LED_D7_Toggle();
                }
                Button0_cnt++;
            }
            if(!Button0Touch)
            {
                LED_D4_Toggle();
                Button0_state[button] = BTN_RELEASE;
                Button0_cnt = 0;
            }
            break;
        }
        case LONG_PUSH:
        {
            if(!Button0Touch)
            {
                Button0_state[button] = BTN_RELEASE;
                Button0_cnt = 0;
            }
            break;
        }
        case WAIT_DOUBLE:
        {
            if(Button0Touch)
            {
                LED_D6_Toggle();
                Button0_state[button] = DOUBLE_CLICK;
            }
            else
            {
                if(Button0_cnt>WAIT_DOUBLE_CNT)
                {
                    Button0_state[button] = BTN_RELEASE;
                    Button0_cnt = 0;
                }
                Button0_cnt++;
            }
            break;
        }
        default:break;
    }
}

 

心得体会:

参加这个活动,能学到有趣的开发板,解决不了的问题,可以在群里交流分享讨论。

团队介绍
团队成员
大熊Bear
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号