Составление "карты" клавиатурных матриц.

     В данной статье предлагаю ознакомиться с моим способом составления «карты» таких клавиатурных матриц.
     Для начала нам понадобиться специальный тестер на основе микроконтроллера, который затем можно перепрограммировать в контроллер клавиатуры. Подойдет практически любой микроконтроллер с достаточным количеством выводов, я взял cypres CY8C4245AXI-483 семейства PSoC4. Далее просто в цикле «прозваниваем» каждую линию клавиатуры с каждой, для этого настраиваем один GPIO на вывод, а все остальные на ввод с подтяжкой, либо на вывод с резистивной подтяжкой к питанию, как я сделал на PsoC. Подаем на выходную линию 0, например и считываем значения с входных GPIO и так пробегаем по всем выводам клавиатурной матрицы. Если процесс сканирования отделен от процесса вывода результата, следует ввести некоторую задержку, иначе высокая взаимная емкость линий матрицы будет давать ложные нажатия. Результат сканирования выводится через UART. В результате работы такой программы в терминале формируется подобное изображение.

Моя матрица имеет 25 линий. Для управления цветом и перемещения курсора используются стандартные ANSI escape-последовательности, поддерживаемые в любом терминале любой UNIX-подобной ОС.
Далее начинается самая нудная часть — составление карты. Нажимаем клавиши и заносим их координаты в какой-нибудь табличный процессор, например LibreOffice Calc, причем каждую клавишу нужно занести два раза, по координатам (X,Y) и (Y,X).

После того, как все клавиши будут занесены в таблицу, нужно назначить какие линии будут строками, а какие столбцами.

Очевидно, что если линия является строкой, то она не может быть столбцом. Так, назначаем линию 1 строкой и скрываем, соответственно, первый столбец и так далее.

Мой пример не очень показательный, тут линии 1-8 строки, а 9-25 столбцы, однако встречаются более сложные матрицы, где на глазок очень трудно разглядеть строки и столбцы.

Код тривиальный, если кому интересно:
#include "project.h"
#include "stdio.h"
#define LINES 25
typedef void(*write_pin_ptr)(uint8);
typedef uint8(*read_pin_ptr)(void);
write_pin_ptr write_pin[LINES]={&Pin_1_Write,&Pin_2_Write,&Pin_3_Write,&Pin_4_Write,&Pin_5_Write,&Pin_6_Write,&Pin_7_Write,&Pin_8_Write,&Pin_9_Write,&Pin_10_Write,&Pin_11_Write,&Pin_12_Write,&Pin_13_Write,&Pin_14_Write,&Pin_15_Write,&Pin_16_Write,&Pin_17_Write,&Pin_18_Write,&Pin_19_Write,&Pin_20_Write,&Pin_21_Write,&Pin_22_Write,&Pin_23_Write,&Pin_24_Write,&Pin_25_Write};
read_pin_ptr read_pin[LINES]={&Pin_1_Read,&Pin_2_Read,&Pin_3_Read,&Pin_4_Read,&Pin_5_Read,&Pin_6_Read,&Pin_7_Read,&Pin_8_Read,&Pin_9_Read,&Pin_10_Read,&Pin_11_Read,&Pin_12_Read,&Pin_13_Read,&Pin_14_Read,&Pin_15_Read,&Pin_16_Read,&Pin_17_Read,&Pin_18_Read,&Pin_19_Read,&Pin_20_Read,&Pin_21_Read,&Pin_22_Read,&Pin_23_Read,&Pin_24_Read,&Pin_25_Read};
void print_header(void)
{
char s[32];
uint8_t i;
UART_1_UartPutString("\033[H\033[1m\033[?25l |");
for(i=1;i<LINES+1;i++)
{
if(i & 0x01) UART_1_UartPutString("\033[44m");
else UART_1_UartPutString("\033[40m");
snprintf(s,32,"%02d",i);
UART_1_UartPutString(s);
}
UART_1_UartPutString("\033[40m\r\n--+");
for(i=0;i<LINES;i++) UART_1_UartPutString("--");
UART_1_UartPutString("\r\n");
}
int main(void)
{
CyGlobalIntEnable; /* Enable global interrupts. */
/* Place your initialization/startup code here (e.g. MyInst_Start()) */
uint8_t i,j,p;
char s[32];
UART_1_Start();
UART_1_UartPutString("\033[H\033[2J\033[1;1H\033[?25l");
for(;;)
{
/* Place your application code here. */
print_header();
for(i=0;i<LINES;i++)
{
snprintf(s,32,"%02d",i+1);
UART_1_UartPutString("\033[32;1m");
UART_1_UartPutString(s);
UART_1_UartPutString("\033[37m|");
for(j=0;j<LINES;j++) write_pin[j](1);
write_pin[i](0);
CyDelayUs(100);
for(j=0;j<LINES;j++)
{
p=read_pin[j]();
if(p) UART_1_UartPutString("\033[37;40;22m. ");
else UART_1_UartPutString("\033[47;30m \033[37;40m ");
}
UART_1_UartPutString("\r\n");
}
}
}
- +4
- 31 августа 2017, 23:18
- Jarik65535
Комментарии (4)
RSS свернуть / развернуть