MCUXpresso_MIMXRT1052xxxxB/boards/evkbimxrt1050/driver_examples/kpp/kpp.c
2022-04-08 22:46:35 +08:00

135 lines
4.8 KiB
C

/*
* Copyright 2017 NXP
* All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <stdlib.h>
#include "fsl_debug_console.h"
#include "fsl_kpp.h"
#include "pin_mux.h"
#include "clock_config.h"
#include "board.h"
/*******************************************************************************
* Definitions
******************************************************************************/
#define EXAMPLE_KPP_ACTIVE_COLUMROWS (0xF0)
#define EXAMPLE_KPP_MATRX_NUM (4)
#define EXAMPLE_KPP_COLROW_START_INDX (4)
#define EXAMPLE_KPP KPP
#define EXAMPLE_KPP_KEYPRESS_LONG_NUM (0xFFF)
/*******************************************************************************
* Prototypes
******************************************************************************/
/*******************************************************************************
* Variables
******************************************************************************/
char *keyMap[EXAMPLE_KPP_MATRX_NUM][EXAMPLE_KPP_MATRX_NUM] = {
/* COL0 COL1 COL2 COL3 */
{"SW1", "SW2", "SW3", "SW4"}, /* ROW0 */
{"SW5", "SW6", "SW7", "SW8"}, /* ROW1 */
{"SW9", "SW10", "SW11", "SW12"}, /* ROW2 */
{"SW13", "SW14", "SW15", "SW16"}, /* ROW3 */
};
kpp_config_t kppConfig;
uint8_t read_keys[KPP_KEYPAD_COLUMNNUM_MAX] = {0};
extern char *keyMap[EXAMPLE_KPP_MATRX_NUM][EXAMPLE_KPP_MATRX_NUM];
volatile bool g_keypress = false;
volatile bool g_keyrelease = false;
/*******************************************************************************
* Code
******************************************************************************/
void KPP_IRQHandler(void)
{
uint16_t status = KPP_GetStatusFlag(EXAMPLE_KPP);
if (status & kKPP_keyDepressInterrupt)
{
/* Disable interrupts. */
KPP_DisableInterrupts(EXAMPLE_KPP, kKPP_keyDepressInterrupt);
/* Scanning. */
KPP_keyPressScanning(EXAMPLE_KPP, &read_keys[0], CLOCK_GetFreq(kCLOCK_CpuClk));
/* Clear status. */
KPP_ClearStatusFlag(EXAMPLE_KPP, kKPP_keyDepressInterrupt);
KPP_SetSynchronizeChain(EXAMPLE_KPP, kKPP_ClearKeyDepressSyncChain);
/* Enable interrupts. */
KPP_EnableInterrupts(EXAMPLE_KPP, kKPP_keyDepressInterrupt);
g_keypress = true;
}
else if (status & kKPP_keyReleaseInterrupt)
{
/* Disable interrupts. */
KPP_DisableInterrupts(EXAMPLE_KPP, kKPP_keyReleaseInterrupt);
/* Clear status. */
KPP_ClearStatusFlag(EXAMPLE_KPP, kKPP_keyReleaseInterrupt);
KPP_SetSynchronizeChain(EXAMPLE_KPP, kKPP_SetKeyReleasesSyncChain);
g_keyrelease = true;
}
SDK_ISR_EXIT_BARRIER;
}
int main(void)
{
kpp_config_t kppConfig;
uint8_t rowOld = 0xFF;
uint8_t colOld = 0xFF;
uint32_t index = 0;
BOARD_ConfigMPU();
BOARD_InitBootPins();
BOARD_InitBootClocks();
BOARD_InitDebugConsole();
PRINTF("\r\n KPP Driver Example Start.\r\n");
kppConfig.activeColumn = kppConfig.activeRow = EXAMPLE_KPP_ACTIVE_COLUMROWS;
kppConfig.interrupt = (kKPP_keyDepressInterrupt | kKPP_keyReleaseInterrupt);
KPP_Init(EXAMPLE_KPP, &kppConfig);
while (1)
{
if (g_keypress)
{
/* Scanning and print the triggered key log out.*/
for (uint32_t col = 0; col < EXAMPLE_KPP_MATRX_NUM; col++)
{
if ((read_keys[col + EXAMPLE_KPP_COLROW_START_INDX] & EXAMPLE_KPP_ACTIVE_COLUMROWS) != 0x00)
{
for (uint8_t row = 0; row < EXAMPLE_KPP_MATRX_NUM; row++)
{
if ((read_keys[col + EXAMPLE_KPP_COLROW_START_INDX] &
(1 << (row + EXAMPLE_KPP_COLROW_START_INDX))) != 0)
{
if (((rowOld != row) || (colOld != col)) && g_keypress)
{
rowOld = row;
colOld = col;
PRINTF("\r\n Key %s was pressed.\r\n", keyMap[rowOld][colOld]);
}
else
{
index++;
if (index > EXAMPLE_KPP_KEYPRESS_LONG_NUM)
{
index = 0;
PRINTF("\r\n This was a long press.\r\n");
}
}
}
}
}
}
KPP_EnableInterrupts(EXAMPLE_KPP, kKPP_keyReleaseInterrupt);
g_keypress = false;
}
else if (g_keyrelease)
{
rowOld = 0xFF;
colOld = 0xFF;
index = 0;
g_keyrelease = false;
}
}
}