cursada_mc2
Base de control de temperatura para EDU-CIAA-NXP
Loading...
Searching...
No Matches
keyboard_driver.c
Go to the documentation of this file.
1
12#include "keyboard_driver.h"
13
14#include <string.h>
15
16
17#define KEYBOARD_MAX_ROWS 4
18#define KEYBOARD_MAX_COLUMNS 3
19
20#define FILA0_IRQ_HANDLER GPIO4_IRQHandler
21#define FILA1_IRQ_HANDLER GPIO5_IRQHandler
22#define FILA2_IRQ_HANDLER GPIO6_IRQHandler
23#define FILA3_IRQ_HANDLER GPIO7_IRQHandler
24
26
27uint8_t last_char = 0xFF;
28
29
31{
32 // Inputs
33 Chip_GPIO_Init(LPC_GPIO_PORT);
34 Chip_SCU_PinMux(4, 0, MD_PDN | MD_EZI, FUNC0); //< Fila0
35 Chip_SCU_PinMux(4, 1, MD_PDN | MD_EZI, FUNC0); //< Fila1
36 Chip_SCU_PinMux(4, 2, MD_PDN | MD_EZI, FUNC0); //< Fila2
37 Chip_SCU_PinMux(4, 3, MD_PDN | MD_EZI, FUNC0); //< Fila3
38
39 Chip_GPIO_SetDir(LPC_GPIO_PORT, 2, (1 << 0), 0); //< Fila0
40 Chip_GPIO_SetDir(LPC_GPIO_PORT, 2, (1 << 1), 0); //< Fila1
41 Chip_GPIO_SetDir(LPC_GPIO_PORT, 2, (1 << 2), 0); //< Fila2
42 Chip_GPIO_SetDir(LPC_GPIO_PORT, 2, (1 << 3), 0); //< Fila3
43
44 // Outputs
45 Chip_SCU_PinMux(1, 5, MD_PLN, FUNC0); //< Col0
46 Chip_SCU_PinMux(7, 4, MD_PLN, FUNC0); //< Col1
47 Chip_SCU_PinMux(7, 5, MD_PLN, FUNC0); //< Col2
48
49 Chip_GPIO_SetDir(LPC_GPIO_PORT, 1, (1 << 8), 1); //< Col0
50 Chip_GPIO_SetDir(LPC_GPIO_PORT, 3, (1 << 12), 1); //< Col1
51 Chip_GPIO_SetDir(LPC_GPIO_PORT, 3, (1 << 13), 1); //< Col2
52
53 // Set outputs to high
54 Chip_GPIO_SetPinOutHigh(LPC_GPIO_PORT, 1, 8);
55 Chip_GPIO_SetPinOutHigh(LPC_GPIO_PORT, 3, 12);
56 Chip_GPIO_SetPinOutHigh(LPC_GPIO_PORT, 3, 13);
57}
58
59
61{
62 Chip_SCU_GPIOIntPinSel(4, 2, 0);
63 Chip_PININT_EnableIntLow(LPC_GPIO_PIN_INT, PININTCH4);
64 Chip_PININT_SetPinModeEdge(LPC_GPIO_PIN_INT, PININTCH4);
65 Chip_PININT_ClearIntStatus(LPC_GPIO_PIN_INT, PININTCH4);
66 NVIC_ClearPendingIRQ(PIN_INT4_IRQn);
67 NVIC_EnableIRQ(PIN_INT4_IRQn);
68
69 Chip_SCU_GPIOIntPinSel(5, 2, 1);
70 Chip_PININT_ClearIntStatus(LPC_GPIO_PIN_INT, PININTCH5);
71 Chip_PININT_EnableIntLow(LPC_GPIO_PIN_INT, PININTCH5);
72 Chip_PININT_SetPinModeEdge(LPC_GPIO_PIN_INT, PININTCH5);
73 NVIC_ClearPendingIRQ(PIN_INT5_IRQn);
74 NVIC_EnableIRQ(PIN_INT5_IRQn);
75
76 Chip_SCU_GPIOIntPinSel(6, 2, 2);
77 Chip_PININT_EnableIntLow(LPC_GPIO_PIN_INT, PININTCH6);
78 Chip_PININT_SetPinModeEdge(LPC_GPIO_PIN_INT, PININTCH6);
79 Chip_PININT_ClearIntStatus(LPC_GPIO_PIN_INT, PININTCH6);
80 NVIC_ClearPendingIRQ(PIN_INT6_IRQn);
81 NVIC_EnableIRQ(PIN_INT6_IRQn);
82
83 Chip_SCU_GPIOIntPinSel(7, 2, 3);
84 Chip_PININT_EnableIntLow(LPC_GPIO_PIN_INT, PININTCH7);
85 Chip_PININT_SetPinModeEdge(LPC_GPIO_PIN_INT, PININTCH7);
86 Chip_PININT_ClearIntStatus(LPC_GPIO_PIN_INT, PININTCH7);
87 NVIC_ClearPendingIRQ(PIN_INT7_IRQn);
88 NVIC_EnableIRQ(PIN_INT7_IRQn);
89}
90
91
92int board_keyboard_read_cell(uint8_t fila, uint8_t columna) { return state_matrix[fila][columna]; }
93
94
96{
97 memcpy((char*) matrix_p, (char*) state_matrix, sizeof(uint8_t) * KEYBOARD_MAX_COLUMNS * KEYBOARD_MAX_ROWS);
98 for (int row = 0; row < KEYBOARD_MAX_ROWS; row++) {
99 for (int col = 0; col < KEYBOARD_MAX_COLUMNS; col++) { state_matrix[row][col] = 0; }
100 }
101}
102
103
105{
106 uint8_t lchar = last_char;
107 last_char = 0xFF;
108 return lchar;
109}
110
111
112void read_row(uint8_t row)
113{
114 uint8_t col = 0;
115 Chip_GPIO_SetPinOutLow(LPC_GPIO_PORT, 3, 12);
116 Chip_GPIO_SetPinOutLow(LPC_GPIO_PORT, 3, 13);
117 if (Chip_GPIO_GetPinState(LPC_GPIO_PORT, 2, row)) {
118 col = 0;
119 state_matrix[row][0] = 1;
120 }
121 Chip_GPIO_SetPinOutLow(LPC_GPIO_PORT, 1, 8);
122
123 Chip_GPIO_SetPinOutHigh(LPC_GPIO_PORT, 3, 12);
124 if (Chip_GPIO_GetPinState(LPC_GPIO_PORT, 2, row)) {
125 col = 1;
126 state_matrix[row][1] = 1;
127 }
128 Chip_GPIO_SetPinOutLow(LPC_GPIO_PORT, 3, 12);
129
130 Chip_GPIO_SetPinOutHigh(LPC_GPIO_PORT, 3, 13);
131 if (Chip_GPIO_GetPinState(LPC_GPIO_PORT, 2, row)) {
132 col = 2;
133 state_matrix[row][2] = 1;
134 }
135
136 Chip_GPIO_SetPinOutHigh(LPC_GPIO_PORT, 1, 8);
137 Chip_GPIO_SetPinOutHigh(LPC_GPIO_PORT, 3, 12);
138
139 last_char = (uint8_t) (row * 10 + col);
140}
141
142
144{
145 Chip_PININT_ClearRiseStates(LPC_GPIO_PIN_INT, 4);
146 NVIC_ClearPendingIRQ(PIN_INT4_IRQn);
147 read_row(0);
148 Chip_PININT_ClearIntStatus(LPC_GPIO_PIN_INT, PININTCH4);
149}
150
151
153{
154 Chip_PININT_ClearRiseStates(LPC_GPIO_PIN_INT, 5);
155 NVIC_ClearPendingIRQ(PIN_INT5_IRQn);
156 read_row(1);
157 Chip_PININT_ClearIntStatus(LPC_GPIO_PIN_INT, PININTCH5);
158}
159
160
162{
163 Chip_PININT_ClearRiseStates(LPC_GPIO_PIN_INT, 6);
164 NVIC_ClearPendingIRQ(PIN_INT6_IRQn);
165 read_row(2);
166 Chip_PININT_ClearIntStatus(LPC_GPIO_PIN_INT, PININTCH6);
167}
168
169
171{
172 Chip_PININT_ClearRiseStates(LPC_GPIO_PIN_INT, 7);
173 NVIC_ClearPendingIRQ(PIN_INT7_IRQn);
174 read_row(3);
175 Chip_PININT_ClearIntStatus(LPC_GPIO_PIN_INT, PININTCH7);
176}
void board_keyboard_read_matrix(uint8_t *matrix_p[KEYBOARD_MAX_COLUMNS])
Lee el estado completo de la matriz de teclado.
#define FILA1_IRQ_HANDLER
void board_keyboard_init(void)
Inicializa los pines del teclado matricial.
#define KEYBOARD_MAX_COLUMNS
void read_row(uint8_t row)
#define FILA3_IRQ_HANDLER
#define KEYBOARD_MAX_ROWS
char board_keyboard_get_last_char()
Devuelve el ultimo caracter detectado por el teclado.
void board_keyboard_int_enable(void)
Habilita las interrupciones asociadas al teclado matricial.
#define FILA0_IRQ_HANDLER
int board_keyboard_read_cell(uint8_t fila, uint8_t columna)
Lee el estado de una celda puntual de la matriz.
uint8_t last_char
#define FILA2_IRQ_HANDLER
uint8_t state_matrix[KEYBOARD_MAX_ROWS][KEYBOARD_MAX_COLUMNS]
Interfaz del driver de teclado matricial.