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

     Уверен, многие страдают синдромом Плюшкина в той или иной степени и хранят ЖК матрицы и тачскрины от планшетов и телефонов, а также прочие трудно применимые не по назначению запчасти. Среди этого хлама попадаются и клавиатурные матрицы от ноутбуков и нетбуков, не содержащие контроллеров. В принципе, применить их для своих прототипов и самоделок не сложно, однако очень проблематично найти схему такой матрицы, особенно если это китайский noname.
     В данной статье предлагаю ознакомиться с моим способом составления «карты» таких клавиатурных матриц.

     Для начала нам понадобиться специальный тестер на основе микроконтроллера, который затем можно перепрограммировать в контроллер клавиатуры. Подойдет практически любой микроконтроллер с достаточным количеством выводов, я взял 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");
           
        }
    }
}

Комментарии (3)

RSS свернуть / развернуть
однако встречаются более сложные матрицы, где на глазок очень трудно разглядеть строки и столбцы
Можно нагуглить схему на ноут и подсмотреть там.
0
  • avatar
  • Vga
  • 01 сентября 2017, 17:09
Но ведь в той схеме не будет схемы матрицы?
0
Не будет, но можно определить где столбцы, а где строки.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.