...продолжение.
Цитата из билайновской рекламы про робота - "ой, а разговоров-то было !".
Все оказалось в разы проще. Дольше всего пришлось МГТФ зачищать.
Нижу привожу гайд по борьбе в клавиатурной матрицей для домохозяек и других аналогичных мне неучей.
Итак, клавиатура от Asus X200, макетка с atmega32 и кварцем, arduino IDE с модулями MightyCore для поддержки atmega32.
С атмеги32 подключены только SPI (PB4-PB7) на CPLD и UART (PD0, PD1) для дебага через USB-UART. Остальные портовые ноги PD2-PD7, PC0-PC7, PA0-PA7, PB0-PB3 свободны для подключения к разъему клавиатурной матрицы.

Для дебага/обратной связи с МК нужен USB-TTL-UART навроде такого, но у меня его нет, а садиться и ехать за ним куда-то не позволяет новогоднее состояние настроение. Поэтому вместо него используется ардуинка с залепленным дулом на землю ресетом.

Модуль для atmega32 (и других контроллеров, не нативных для плат Ардуино) удобен тем, что мы можем удобно ссылаться на удобно описанные ноги портов соответствующего контролера, а также задав в настройках IDE частоту кварца не заботиться о правильности частоты UART для нужной скорости.
Пакет модулей берется по ссылке https://mcudude.github.io/MightyCore...ore_index.json
Как его добавить в IDE и сделать доступным из менеджера плат, есть картинки тут.
Код, написанный при помощи топора - сразу же после hello world:
Код:
//описание алиасов для пинов
#define PINS_MAX 26
#define PIN0 PIN_PD2
#define PIN1 PIN_PD3
#define PIN2 PIN_PD4
#define PIN3 PIN_PD5
#define PIN4 PIN_PD6
#define PIN5 PIN_PD7
#define PIN6 PIN_PC0
#define PIN7 PIN_PC1
#define PIN8 PIN_PC2
#define PIN9 PIN_PC3
#define PIN10 PIN_PC4
#define PIN11 PIN_PC5
#define PIN12 PIN_PC6
#define PIN13 PIN_PC7
#define PIN14 PIN_PA7
#define PIN15 PIN_PA6
#define PIN16 PIN_PA5
#define PIN17 PIN_PA4
#define PIN18 PIN_PA3
#define PIN19 PIN_PA2
#define PIN20 PIN_PA1
#define PIN21 PIN_PA0
#define PIN22 PIN_PB0
#define PIN23 PIN_PB1
#define PIN24 PIN_PB2
#define PIN25 PIN_PB3
//массив номеров пинов для перебора клавиатуры
const uint8_t pins[PINS_MAX] =
{
PIN0, PIN1, PIN2, PIN3, PIN4, PIN5, PIN6, PIN7, PIN8, PIN9,
PIN10, PIN11, PIN12, PIN13, PIN14, PIN15, PIN16, PIN17, PIN18, PIN19,
PIN20, PIN21, PIN22, PIN23, PIN24, PIN25
};
// initial setup
void setup()
{
//все клавиатурные ноги ставим в режим входа с пуллапом
for (uint8_t i=0; i<PINS_MAX; i++) pinMode (pins[i], INPUT_PULLUP);
//и инициализируем вывод по UART для получения данных о клавишах в "мониторе порта"
Serial.begin(115200);
Serial.flush();
Serial.println(F("Unikeyboard matrix explorer v1.0"));
}
// main loop
void loop()
{
uint8_t colcount, rowcount;
//перебираем все потенциальные столбцы
for (colcount=0; colcount<PINS_MAX; colcount++)
{
//при опросе очередного столбца переключаем все линии "как бы строк" в режим входа, чтоб не получить конфликт уровней на выходах
for (rowcount=0; rowcount<PINS_MAX; rowcount++) pinMode (pins[rowcount], INPUT_PULLUP);
//один пин потенциального столбца включаем в режим выхода, даем уровень 0
pinMode (pins[colcount], OUTPUT);
digitalWrite (pins[colcount], LOW);
//перебираем все пины строки, пропуская пин столбца
for (rowcount=0; rowcount<PINS_MAX; rowcount++)
// если на входе строки находим 0 (нажата клавиша на пересечении текущих COL/ROW) - выводим ее в консоль
// в виде двух индексов пинов (меньший+1, больший+1). Плюс единица, т к индексы нумеруются с 0, а контакты на разъеме с 1.
if ( (rowcount != colcount) and !digitalRead(pins[rowcount]) )
{
Serial.println ("Pressed key ("+String((colcount<rowcount?colcount:rowcount)+1)+", "+String((colcount<rowcount?rowcount:colcount)+1)+")");
delay (300);
}
}
}
Этот скетч компиляем, экспортируем и заливаем в атмегу любым удобным способом (avrdude, khazama, и т п), фьюзы у меня на нем LOW=0x0e, HIGH=0xD7, EXT=0xFD, но из них важен по сути только внешний источник CKSEL=1110, а задержки включения SUT и генераторный CKOPT не принципиальны (впрочем, внутренний генератор тоже можно использовать, не забыв в настройке IDE это указать, чтоб частота UART пересчиталась).
Подключаем клавиатуру к атмеге, подключаем USB-UART к компу и запускаем IDE в режиме монитора порта (или любой другой терминал на соответствующем компорте), давим по порядку клавиши, видим вывод следующего характера:

Я записал соответствующие сочетания линий для каждой клавиши прямо на самой клавиатуре:

Дальше, если верить легенде о 8 столбцах в любой клавиатуре, то надо выделить эти самые 8 столбцовых линий.
Рекомендуют это делать по линиям modifier keys, в моем случае они такие:
LCTRL 4 12
RCTRL 4 6
LALT 2 7
RALT 2 9
LSHIFT 5 11
RSHIFT 5 8
GUI(WIN) 3 13
Fn 1 6
MENU 1 9
В парах "близнецовых" клавиш видим непересекающиеся линии 6,7,8,9,11,12. И у GUI есть линия 13. Это в сумме 7 линий.
Дальше лотерея - надо восьмую линию подобрать как-то наугад, долго глядя в клавиатуру. Я просто предположил, что эта клава имеет столбцовые линии в одной подряд идущей группе, и в ряду 6,7,8,9,11,12,13 пропущена линия 10. Если это не так - далее при построении таблицы вылезет какой-то несходняк и эту итерацию надо будет повторить.
Итак имеем столбцовые линии 6,7,8,9,10,11,12,13. Остальные строковые.
Строим таблицу:

Цветом выделены мастхэв-клавиши для спектрума, ненужные строки можно исключить целиком (в целом это означает, что если у клавиатуры больше 26 линий, то не используя некоторые можно ее заюзать с той же атмегой, где их <=26).
Тайна клавиатуры раскрыта.
Если есть идеи, как автоматизировать поиск столбцовых линий - кидайте идеи, я не смог придумать.
Мапить эту клавиатуру в регистр клавиш в CPLD буду немного позже. Но тоже скоро.