## 1801ВП1-014

### Фотографии кристалла высокого разрешения
[1801ВП1-014, 161M](http://www.1801bm1.com/files/retro/1801/images/vp1-014.jpg)

### Условное графическое обозначение
![Symbol](/014/img/014.png)

### Назначение выводов
| Номер       | Название     | Конфигурация   | Назначение
|-------------|--------------|----------------|-----------------------------------------
| 5-1, 41-40  | Y1-Y7        | Вход, Выход ОК | Матрица клавиатуры, в режиме ожидания нажатия работают как входы, при нажатой клавише активируется один из выходов ОК
| 15-6        | nX0-nX9      | Вход           | Матрица клавиатуры
| 16          | nSHIFT       | Вход           | Модификатор нижнего регистра
| 17          | nEC1         | Вход           | Модификатор алфавита РУС/ЛАТ
| 18          | nCTRL        | Вход           | Модификатор управляющего символа УС (Ctrl)
| 19          | nINIT        | Вход           | Аппаратный сброс, приводит микросхему в исходное состояние, бит разрешения прерываний сбрасывается
| 20          | RP1          | Вход, Выход ОК | Времязадающий конденсатор подавления дребезга нажатия клавиш
| 21          | GND          | Питание        | Нулевой потенциал (земля)
| 22          | nRP2         | Вход, Выход ОК | Времязадающий конденсатор подавления дребезга отжатия клавиш
| 23          | nIRQ         | Выход OK       | Запрос на прерывание
| 24          | nIAKO        | Выход          | Выход цепочки подтверждения прерывания
| 25          | nIAKI        | Вход           | Вход цепочки подтверждения прерывания
| 26          | nDIN         | Вход           | Строб чтения данных МПИ
| 27          | nDOUT        | Вход           | Строб записи данных МПИ
| 28          | nRPLY        | Выход ОК       | Строб подтверждения транзакции МПИ
| 29          | nSYNC        | Вход           | Строб адреса МПИ
| 30          | nCS          | Вход           | Выбор внутренних регистров микросхемы (регистр данных и управления), микросхема не декодирует самостоятельно nAD0-nAD7. Данный вход защелкивается по ниспадающему фронту nSYNC, низкий уровень разрешает обмен с внутренними регистрами и формирование nRPLY
| 31          | EC2          | Вход           | Модификатор АР2
| 39          | nAD0         | Вход, Выход-3  | Линия 0 шины данных/адреса МПИ, выдает вектор прерывания и регистры данных и управления при чтении
| 32          | nAD1         | Вход, Выход-3  | Линия 1 шины данных/адреса МПИ, выдает вектор прерывания и регистры данных и управления при чтении
| 37-33, 38   | nAD2-nAD7    | Вход, Выход-3  | Линии 2-7 шины данных/адреса МПИ, выдает вектор прерывания и регистры данных и управления при чтении
| 42          | VCC          | Питание        | Потенциал +5В (источник питания)

### Структурная схема 1801ВП1-014
![Struct](/014/img/struct_014.png)

### Описание
Микросхема 1801ВП1-014 представляет собой контроллер клавиатуры с интерфейсом
МПИ. Из широкоизвестных изделий применялся в домашних компьютерах серии БК-001x.
Особенностью 1801ВП1-014 является отсутствие динамического сканирования матрицы
клавиатуры. Рассмотрим процесс взаимодействия контроллера с матрицей подробнее.

Контроллер имеет набор входов "линейки" - условно называются X0-X9. И набор
входов-выходов "столбцов" - условно называются Y1-Y7. Роль "столбца" Y0 играет
шина "земли". Также имеется две времязадающих схемы, представляющих собой
внешние кондесаторы, подключенные к выводам RP1 и RP2. Конденсаторы могут
независисмо разряжаться на "землю" внутренним ключом контроллера (выводы RP1
и RP2 являются как входами так и выходами по схеме "открытый коллектор"),
заряд конденсторов осуществляется через внешние резисторы от источника питания.
Номиналы RC определяют характерное время, в схеме БК-001х сопротивление R
обычно порядка 200 килоом, емкость С порядка 300 нанофарад и характерное время
составляет примерно 60 миллисекунд. Схема на RP1 отвечает за фильтрацию
дребезга механических контактов при нажатии клавиш, схема на RP2 отвечает
за фильтрацию дребезга при отжатии клавиш.

В исходном состоянии все клавиши отжаты, на входах X0-X9 присутствует высокий
уровень, задаваемый внешними резисторами, в схеме БК-001х используется номинал
22 килоом. При этом на внутренней цепи ~XANY сформирован высокий уровень,
сигнал на внутренней цепи LOCK также имеет высокий уровень. Ключ RP1 открыт
и соответствующий конденсатор разряжен. Ключ RP2 закрыт и его конденсатор
заряжен. Выводы Y1-Y7 в этот момент работают как входы, выходные транзисторы
"открытых коллекторов" закрыты. Через внешние резисторы на входы Y1-Y7 подается
низкий уровень, в схеме БК-001х используется номинал 180 килоом.

При нажатии клавиши в некотором столбце Yi происходит следующее - на
соответствующем входе Yi появляется высокий уровень через делитель 22/180
килоом. На каждом входе Yi имеется отдельный RS-триггер, который сбрасывается
при обнаружении высокого уровня на входе Yi и устанавливается низким уровнем
сигнала LOCK (уже после того как клавиши будут обработаны). При сбросе триггера
соответстующий выход типа "открытый коллектор" переходит в состояние низкого
уровня и вывод Yi начинает работать как выход. Через замкнутую клавишу
генерируемый выходом Yi низкий уровень поступает на соответствующий вход Xj.
Если же клавиша замкнута в столбце Y0 (который виртуальный, вместо выхода Yn
используется "земля") то низкий уровень на вход Xj поступает немедленно,
а ни один из триггеров Yi не переходит в сброшенное состояние. Таким образом
контроллер по номеру сброшенного триггера Yi (или ни одному не сброшенному)
может определеть номер столбца, а по номеру входа Xj может определить номер
линии замкнутой клавиши.

По обнаружению низкого уровня на любом из входов Xj ключ на RP1 закрывается
и конденсатор начинает заряжаться. Простая комбинационная схема формирует код
клавиши в зависимости от номера столбца, линейки и состояния управляющих входов
SHIFT, CTRL, EC2, EC1. Любопытно что формируемый код можно в этот момент
наблюдать в регистре данных, но бит готовности еще не установлен. В момент
окончания заряда конденсатора вычисленный код клавиши фиксируется во внутреннем
регистре и выставляется запрос на векторное прерывание. В зависимости от кода
клавиши при подтверждении прерывания формируется вектор 060 или 274
(восьмеричный). Любопытно что сформированный запрос на прерывание фиксируется
во внутреннем триггере и может быть сброшен только циклом подтверждения
прерывания.

После считывания кода центральным процессором контроллер ожидает отпускания
клавиши - пропадания низкого уровня на входах Xj. Когда клавиша отпущена,
ключ RP2 закрывается и конденсатор начинает заряжаться. До момента окончания
заряда контроллер игнорирует изменения состояний матрицы клавиатуры - таким
нехитрым образом фильтруется дребезг при размыкании контактов.

Базовый адрес внутренних регистров контроллера на шине МПИ формируется внешней
схемой (в БК-001х это чип-компаньон 1801ВП1-037), сам контроллер 1801ВП1-014
анализирует только низкий уровень на входе nCS. Для внутреннего декодирования
адреса, видимо, оказалось недостаточно выводов в стандартном для 1801-ой серии
42-выводном корпусе - банально некуда было завести выводы ненужные собственно
для работы контроллера входы nAD15-nAD8.

Также стоит отметить полное отсутствие тактирования микросхемы - нет никаких
тактовых сигналов. Внутри обнаружился рудиментарный триггер переключателя
регистров РУС-ЛАТ, который явно неработоспособен и в схеме БК-001х применяется
аналогичный внешний триггер. Сложно сказать, это ошибка схемы или по каким-то
соображениям разработчики намерено отказались от этого внутреннего триггера.

Несмотря на то что контроллер 1801ВП1-014 является достаточно простым, 
использует несколько необычный в наши дни алгоритм обработки клавиатурной
матрицы и поддерживает одновременное нажатие только одной клавиши,
основную свою задачу он выполнил - разгрузил и так не очень быстрый
центральный процессор от функций непрерывного сканирования клавиатуры.