Команды и директивы компилятора PROTON
InKey
Синтаксис:
Variable = InKey
Этот оператор предназначен для работы с матричными клавиатурами размерами 4 х 4 или 3 х 4 клавиши. Он сканирует состояние клавиш клавиатуры, и полученное значение возвращает в переменную.
Variable - определенная пользователем переменная, которая может быть типа Bit, Byte или Word.
При нажатии клавиши оператор InKey возвращает значения между 0 и 15. Если никакая клавиша не нажата, то возвращенное значение равно 16.
Пример
Dim VAR1 As Byte | ' Создать переменную VAR1 типа Byte |
VAR1 = InKey | ' Cканировать клавиатуру |
DelayMs 50 | ' Пауза 50 мсек для противодребезговой защиты |
Print At 1, 1, Dec VAR1, " " | ' Отобразить на дисплее значение VAR1 |
На рисунке 1 приведена типовая схема подключения 12-кнопочной клавиатуры к микроконтроллеру PIC16F84. Если используется клавиатура с 16 кнопками, то 4-й столбец необходимо соединить с PORTB.7 (RB7).
Рис. 1. Типовая схема подключения клавиатуры к микроконтроллеру.
Порядок подключения выводов клавиатуры к микроконтроллеру может быть выбран произвольно с учетом топологии клавиатуры и желанием упростить рисунок соединения печатных проводников связывающих микроконтроллер и клавиатуру. Используя совместно с командой InKey команду LookUp, возвращаемые значения могут быть нужным образом преобразованы и cопоставлены надписям на клавиатуре, например:
VAR1 = InKey | |
KEY = LookUp VAR1, [1,2,3,0,4,5,6,0,7,8,9,0,"*",%00001010,"#",0] |
Переопределения для команды INKEY.
Подключить клавиатуру можно к любому порту. Однако цепи клавиатуры требуют подключения подтягивающих резисторов. Поэтому, лучшим портом микроконтроллера для этих целей является PORTB, который имеет в своем составе внутренние подтягивающие резисторы. Чтобы включить внутренние подтягивающие резистора порта PORTB необходимо в список определений включить следующую запись:
Declare PORTBPULLUPS = On
При подключении клавиатуры к другому порту необходимо использовать директиву:
Declare KEYPADPORT PORTn
где n может быть А, С, D
Если директива DeclareKEYPADPORT PORTn не было использована в программе, то по умолчанию используется PORTB.
На рисунке 2 приведена действующая модель inkey3x4.DSN демонстрирующая работу команды InKey c 12-кнопочной матричной клавиатурой. Модель работает под управлением программы inkey3x4.bas. В программе используются определениe включающее внутренние подтягивающие резисторы входящие в состав PORTB и определения обеспечиваюшие работу графического ЖКИ на основе контроллера Toshiba T6963.
Листинг программы inkey3x4.bas
'-----------------------------------------------Общие настройки------------------------------------------------- | |
Device = 16F877A | ' Произвести программный код для 16F877A |
XTAL = 20 | ' Частота осциллятора 20 МГц |
'-----------------------------------------Настройки подключения ЖКИ------------------------------------------ | |
Declare LCD_Type Toshiba | ' Тип ЖКИ - на контроллере Toshiba - T6963 |
Declare LCD_DTPort PORTD | ' Порт данных |
Declare LCD_WRPin PORTE.2 | ' Цепь управления WR |
Declare LCD_RDPin PORTE.1 | ' Цепь управления RD |
Declare LCD_CDPin PORTA.1 | ' Цепь управления CD |
Declare LCD_CEPin PORTE.0 | ' Цепь управления CE |
Declare LCD_RSTPin PORTA.2 | ' Цепь управления RST |
Declare LCD_X_Res 240 | ' Количество пикселей по горизонтали у ' используемого монитора |
Declare LCD_Y_Res 128 | ' Количество пикселей по вертикали у ' используемого монитора |
Declare LCD_Font_Width 6 | ' Использовать шрифт 6 пикселей в ширину и ' 8 пикселей в высоту |
'------------------------------------------------Настройки портов------------------------------------------------ | |
Declare PortB_Pullups = On | ' Включить подтягивающие резисторы на PORTB |
Declare All_Digital = On | ' Сделать все порты цифровыми ' входами/выходами |
'--------------------------------------------Объявления переменных--------------------------------------------- | |
Dim VAR1 As Byte | ' Создать переменную VAR1 типа Byte |
Dim KEY As Byte | ' Создать переменную KEY типа Byte |
'---------------------------------------------------Заставка--------------------------------------------------------- | |
Print At 2, 1, "Example commands INKEY" | ' Отобразить на дисплее надпись ' "Example commands INKEY" |
Print At 3, 1, "KEYPAD 3x4" | ' Отобразить на дисплее надпись "KEYPAD 3x4" |
DelayMS 1000 | ' Пауза 1 сек |
'----------------------------------------------Главная программа------------------------------------------------- | |
main: | ' Метка начала главной программы |
VAR1 = InKey | ' Сканировать клавиатуру и присвоить код ' нажатой клавиши переменной VAR1 |
DelayMS 100 | ' Bключить антидребезговую защиту на 100 мсек |
KEY = LookUp VAR1,[1,2,3,0,4,5,6,0,7,8,9,0,"*",_ %00001010,"#",0] |
' Конвертировать содержимое VAR1 |
Print At 5, 1, "InKey = ", Dec VAR1, " " | ' Отобразить на дисплее значение InKey в десятичном 'виде |
Print At 6, 1, "Key = ", Dec KEY, " " | ' Отобразить на дисплее значение Key в ' десятичном виде |
If KEY = 42 Then Print At 6, 1, "KEY = * " | ' Если KEY = 42, то отобразить на ЖКИ надпись ' "KEY = * " |
If KEY = 35 Then Print At 6, 1, "KEY = # " | ' Если KEY = 35, то отобразить на ЖКИ надпись ' "KEY = # " |
Print At 8, 1, "InKey = ", BIN8 VAR1, " " | ' Отобразить на дисплее значение InKey в 'двоичном виде |
Print At 9, 1, "Key = ", BIN8 KEY " " | ' Отобразить на дисплее значение Key в 'двоичном виде |
If VAR1 = 16 Then Print At 9, 1, "KEY = 00000000" | ' Если KEY = 16, то отобразить на ЖКИ надпись ' "KEY = 00000000" |
GoTo main | ' Повторить программу |