LinkedIn YouTube Facebook
Szukaj

Wstecz
Artykuły

Implementacja obsługi klawiatur pojemnościowych w LPC17xx firmy NXP

 

Listing 1. Fragment pliku config.h

/* in this file user has to define the different keypads used */
/* each needs to be mapped to a separated ADC channel */

/*-----------------------------------------*/
/* Keypad 1 */
/*-----------------------------------------*/
#define USE_KBD1 0
#if(USE_KBD1 == 1)
    #define KBD1_ASSIGNED_CHANNEL   (x)
    #define CH7_ASSIGNED_KBD        (y)
#endif

/*-----------------------------------------*/
/* Keypad 2 */
/*-----------------------------------------*/
#define USE_KBD2 0
#if(USE_KBD2 == 1)
    #define KBD2_ASSIGNED_CHANNEL   (CH7)
    #define CH7_ASSIGNED_KBD        (KBD2)
#endif

/*-----------------------------------------*/
/* Keypad 3 */
/*-----------------------------------------*/
#define USE_KBD3 0
#if(USE_KBD3 == 1)
    #define KBD3_ASSIGNED_CHANNEL   (CH6)
    #define CH6_ASSIGNED_KBD        (KBD3)
#endif

/*-----------------------------------------*/
/* Keypad 4 */
/*-----------------------------------------*/
#define USE_KBD4 0
#if(USE_KBD4 == 1)
    #define KBD4_ASSIGNED_CHANNEL   (x)
    #define CH7_ASSIGNED_KBD        (y)
#endif

/*-----------------------------------------*/
/* Keypad 5 */
/*-----------------------------------------*/
#define USE_KBD5 1
#if(USE_KBD5 == 1)
    #define KBD5_ASSIGNED_CHANNEL   (CH2)
    #define CH2_ASSIGNED_KBD        (KBD5)
#endif

/*-----------------------------------------*/
/* Keypad 6 */
/*-----------------------------------------*/
#define USE_KBD6 0
#if(USE_KBD6 == 1)
    #define KBD6_ASSIGNED_CHANNEL   (CH3)
    #define CH3_ASSIGNED_KBD        (KBD6)
#endif

/*-----------------------------------------*/
/* Keypad 7 */
/*-----------------------------------------*/
#define USE_KBD7 0
#if(USE_KBD7 == 1)
    #define KBD7_ASSIGNED_CHANNEL   (x)
    #define CH7_ASSIGNED_KBD        (y)
#endif

/*-----------------------------------------*/
/* Keypad 8 */
/*-----------------------------------------*/
#define USE_KBD8 0
#if(USE_KBD8 == 1)
    #define KBD8_ASSIGNED_CHANNEL   (CH4)
    #define CH4_ASSIGNED_KBD        (KBD8)
#endif

Działanie programu rozpoczyna się od skonfigurowania mikrokontrolera. W kontekście algorytmu dla interfejsu użytkownika pierwszą wywoływaną funkcją jest initAdc(SystemFrequency) z pliku adc.c. Wewnątrz tej funkcji wykonywana jest konfiguracja wyprowadzeń i kanałów przetwornika A/C zgodnie z ustawieniami w pliku config.h (listing 2).

 

Listing 2. Ciało funkcji initADC()

void initAdc(uint32_t cpuFreq)
{ 
//    uint8_t chIdx;
       
    /* peripheral clock has been already enabled in SystemIn */
    _powerOnAdc();

    /* configure the ADC clock as close to 13 MHz as possible */
    _setAdcDivider(cpuFreq);           

    /* disable adc interrupts */
    _disableAllAdcInterrupts();

    /* configure all used adc /GPIO pins to the default value */
    /* configure GPIO mode output */
    if (UNUSED_KPAD != Ch2KpadMap[CH0])
    { 
        _setCh0GpioDirOut();
        _setCh0GpioPullup();
        _setCh0GpioCharge();
        _setCh0GpioMode();
    }

    if (UNUSED_KPAD != Ch2KpadMap[CH1])
    {     
        _setCh1GpioDirOut();
        _setCh1GpioPullup();
        _setCh1GpioCharge();
        _setCh1GpioMode();
    }

    if (UNUSED_KPAD != Ch2KpadMap[CH2])
    {     
        _setCh2GpioDirOut();
        _setCh2GpioPullup();
        _setCh2GpioCharge();
        _setCh2GpioMode();
    }

    if (UNUSED_KPAD != Ch2KpadMap[CH3])
    {     
        _setCh3GpioDirOut();
        _setCh3GpioPullup();
        _setCh3GpioCharge();
        _setCh3GpioMode();
    }

    if (UNUSED_KPAD != Ch2KpadMap[CH4])
    {     
        _setCh4GpioDirOut();
        _setCh4GpioPullup();
        _setCh4GpioCharge();
        _setCh4GpioMode();
    }

    if (UNUSED_KPAD != Ch2KpadMap[CH5])
    {     
        _setCh5GpioDirOut();
        _setCh5GpioPullup();
        _setCh5GpioCharge();
        _setCh5GpioMode();
    }

    if (UNUSED_KPAD != Ch2KpadMap[CH6])
    {     
        _setCh6GpioDirOut();
        _setCh6GpioPullup();
        _setCh6GpioCharge();
        _setCh6GpioMode();
    }

    if (UNUSED_KPAD != Ch2KpadMap[CH7])
    {     
        _setCh7GpioDirOut();
        _setCh7GpioPullup();
        _setCh7GpioCharge();
        _setCh7GpioMode();
    }
}
SZYMON PANECKI urodził się 17 lutego 1985 roku w Milanówku. Tytuł inżyniera Elektroniki i Telekomunikacji, a następnie magistra inżyniera na Wydziale Elektroniki Politechniki Wrocławskiej uzyskał kolejno w roku 2008 i 2010. Ponadto tytuł inżyniera Informatyki na Wydziale Elektroniki Politechniki Wrocławskiej uzyskał w roku 2011. Szymon Panecki jest doświadczonym elektronikiem-konstruktorem, który w trakcie swojej zawodowej kariery koncentruje się na definiowaniu i projektowaniu (zarówno w warstwie sprzętowej jak i programowej) systemów wbudowanych opartych na mikrokontrolerach z rdzeniem ARM od różnych producentów, w tym przede wszystkim Infineon Technologies (rodzina XMC1000 i XMC4000), STMicroelectronics (STM32 i STR7), Freescale Semiconductor (Kinetis L) oraz Silicon Labs (EFM32 i Precision32). Obszarem jego szczególnego zainteresowania są systemy wykorzystujące czujniki środowiskowe (wilgotności, ciśnienia, temperatury) oraz przemysłowe i motoryzacyjne interfejsy komunikacyjne, głównie CAN. Szymon Panecki od wielu lat współpracuje z czasopismem "Elektronika Praktyczna" oraz portalem Mikrokontroler.pl, na łamach których publikuje liczne artykuły dotyczące swoich projektów, jak również nowości produktowych firm z branży półprzewodnikowej.