Есть такая плата. Решил с ней разобраться. Плату подключил к микроконтроллеру SM8952AC, это с очень небольшими отличиями 8051- совместимый МК. С индикацией разобрался быстро и без проблем, а вот прочитать кнопки ну никак не удается.
Для начала написал подпрограмму чтения:
1. выводы DIO, CLK в высоком состоянии (входы, активный уровень МК - лог.0).
2. опускаю сигнал CLK
3. Жду 5 мкс.
4. Поднимаю сигнал CLK
5. Копирую состояние DIO в бит переноса МК.
6. Сдвигаю вправо регистр-аккумулятор вместе с битом переноса.
9. делаю так 8 раз, возвращаясь к пункту 2.
10. сдвигаю аккумулятор еще раз вправо.
11. копирую аккумулятор в ячейку памяти, выхожу из подпрограммы.
В даташите указано, чтоб прочитать кнопки, надо опустить STB, отправить микрухе команду 0x42, после чего, не поднимая сигнал STB, 4 раза произвести чтение. Так и делаю:
1. Опускаю STB.
2. выдерживаю паузу
3. Передаю код 0x42.
4. Выдерживаю паузу
5. Вызываю подпрограмму чтения, описанную выше.
6. Возвращаемое значение ложу в первую ячейку памяти.
7. И так 4 раза, пока заполнятся 4 ячейки памяти.
8. Поднимаю сигнал STB
9. Вызываю подпрограмму отображения принятых данных. Так как я не знаю в какой из 4-х ячеек данные, то по очереди с секундной задержкой отображаю их все, а еще 4-мя светодиодами отображаю номер ячейки. Принятые данные отображаются 8-разрядной светодиодной полоской на порте 2.
10. возвращаюсь к п.1 и так циклически. Пробовал возвращатся к п.4, но разницы никакой.
И ничего не работает. Хотя некое шевеление присутствует, при нажатии кнопок загорается 5-й и 0-й разряд индикатора на P2. Хотя в даташите все достаточно просто.
Пробовал по всякому - менял фазу, менял полярность тактовых импульсов в подпрограмме чтения, пробовал менять момент фиксации состояния вывода DIO - по фронту, по полке, по спаду, сдвигал влево, сдвигал вправо, менял команду чтения - 0x41 вместо 0x42, пробовал стробировать отправку команды 0x42 (так отправляется инструкция 0x44 для индикации )- чего только не делал - не работает никак.
Исходный код программы: