Funpack第七期-DM164137板卡-按键状态控制LED
Funpack第七期-DM164137板卡-按键状态控制LED 串口打印电位器和按键信息
标签
嵌入式系统
接口
Snapdragon
更新2021-04-27
671

一、自我介绍:

      我是来自山东的嵌入式工程师陈海,目前主做嵌入式编程。

二、实现的功能:

      主要实现的功能是按键控制LED显示,串口实时显示电位器的模拟采样值和按键状态。代码主要参考综合例程。下面描述下具体实现:

   1、按键状态

#define NO_PRESS     0 // Button Release
#define QUICK_PRESS  1 // 快速点击 < 1s
#define SHORT_PRESS  2 // 短按 > 1s & <5s
#define LONG_PRESS   3 // 长按 > 5s

const char *buttonStatusStr[] = {"No Press", "Quick Press", "Short Press", "Long Press"};

2、初始化开发板

void SYSTEM_Initialize(void)
{
    PMD_Initialize();
    PIN_MANAGER_Initialize();
    OSCILLATOR_Initialize();
    WWDT_Initialize();
    PWM1_Initialize();
    ADCC_Initialize();
    TMR2_Initialize();
    TMR1_Initialize();
    TMR0_Initialize();
    EUSART1_Initialize();
}

3、获取按键状态(在main函数里面每隔10ms调用一次)

static uint8_t buttonDown = 0;
static uint16_t buttonCnt = 0;
uint8_t buttonGetStatus() {
    uint8_t buttonStatus = NO_PRESS;
    
    // printf("%u\r\n", buttonCnt);
    if (LOW == SWITCH_S1_PORT) {
        // printf("key down\r\n");
        if (0 == buttonDown) {
            buttonDown = 1;
        } else {
            buttonCnt++;
        }
    } else if (HIGH == SWITCH_S1_PORT) {
        // printf("key up\r\n");
        if (1 == buttonDown) {   
            if (buttonCnt < 5) {
                buttonStatus = NO_PRESS;
            } else if (buttonCnt < 80) {
                buttonStatus = QUICK_PRESS;
            } else if (buttonCnt < 360) {
                buttonStatus = SHORT_PRESS;
            } else if (buttonCnt >= 360) {
                buttonStatus = LONG_PRESS;
            }
            
            buttonDown = 0;
            buttonCnt = 0;
        }
    }
    
    return buttonStatus;
}

4、主(main)函数()

     获取按键状态,如果按键标志位被按下,则串口打印按键状态,并更改LED的显示状态。每隔3秒钟ADC获取电位器的电压原始状态值,并根据值更改LED4的状态,打印读取到的值。

    printf("Board Init Finshed\r\n");
    
    while (1) {
        delayCnt++;
        if (NO_PRESS != (buttonStatus = buttonGetStatus())) {
            printf("button status = %s\r\n", buttonStatusStr[buttonStatus]);
            if (QUICK_PRESS == buttonStatus) {
                LED_D4_LAT = LED_D4_LAT; LED_D5_LAT = 0; LED_D6_LAT = 0; LED_D7_LAT = 1;
            } if (SHORT_PRESS == buttonStatus) {
                LED_D4_LAT = LED_D4_LAT; LED_D5_LAT = 0; LED_D6_LAT = 1; LED_D7_LAT = 1;
            } if (LONG_PRESS == buttonStatus) {
                LED_D4_LAT = LED_D4_LAT; LED_D5_LAT = 1; LED_D6_LAT = 1; LED_D7_LAT = 1;
            }
        }
        
        if (delayCnt % 300 == 0) {
            adcResult = ADCC_GetSingleConversion(POT_CHANNEL) >> 4;
            printf("adc result = %u\r\n", adcResult);
            if (adcResult >= 2048) {
                LED_D4_LAT = 1;
            } else {
                LED_D4_LAT = 0;
            }
        }
        
        __delay_ms(10);
    }

三、感想

      用了挺长时间的32,再用回8位机,虽然感觉性能方面确实和32差距挺大,但是外设齐全,做一些对性能需求不是很大的应用,比如这次任务,还是很足够的。对于一些成本敏感的应用,这款芯片还是很适合的。

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