Команды и директивы компилятора PROTON InKey
Листинг программы inkey3x4.bas
…
;---Настройки подключения ЖКИ---
Declare LCDTYPE TOSHIBA ; Тип ЖКИ - на контроллере Toshiba - T6963
Declare LCDDTPORT PORTD ; Порт данных
Declare LCDWRPIN PORTE.2 ; Цепь управления WR
Declare LCDRDPIN PORTE.1 ; Цепь управления RD
Declare LCDCDPIN PORTA.1 ; Цепь управления CD
Declare LCDCEPIN PORTE.0 ; Цепь управления CE
Declare LCDRSTPIN PORTA.2 ; Цепь управления RST
Declare LCDXRES 240 ; Количество пикселей по горизонтали у используемого монитора
Declare LCDYRES 128 ; Количество пикселей по вертикали у используемого монитора
Declare LCDFONTWIDTH 6 ; Использовать шрифт 6 пикселей в ширину и 8 пикселей в высоту
;Настройки портов
Declare PORTBPULLUPS = On ; Включить подтягивающие резисторы на PORTB
Declare ALLDIGITAL = On ; Сделать все порты цифровыми входами/выходами
В определениях пропущены нижние пробелы:
;Настройки подключения ЖКИ----
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 ;Установить все порты цифровыми входами/выходами
------ //////////////////// ////////////////////////////
;Главная программа
main: ; Метка начала главной программы
VAR1 = InKey ; Сканировать клавиатуру и присвоить код нажатой клавиши
;переменной VAR1
------- /////////////////// /////////////////////// -
InKey нужно выделить жирным шрифтом.
If KEY = 35 Then Print At 6, 1, "KEY = * " ; Если KEY = 35, то отобразить на ЖКИ
надпись "KEY = # "
Нужно звездочку (*) заменить на решетку (#) - "KEY = # "
;---Заставка---
Print At 2, 1, "Example commands INKEY" ; Отобразить на дисплее надпись "Example
;commands INKEY"
Print At 2, 1, "KEYPAD 3x4" ; Отобразить на дисплее надпись "KEYPAD 3x4"
Вторую строку нужно исправить: Print At 3, 1, "KEYPAD 3x4", иначе исчезнет надпись "Example commands INKEY"
----- ////////////////////////// ----- //////////////////////
Print At 6, 1, "Key = ", Dec VAR1, " " ; Отобразить на дисплее значение Key в
;десятичном виде
В комментарии написано о переменной KEY, а программа отображает переменную VAR1. Исправляем:
Print At 6, 1, "Key = ", Dec KEY, " "
----- ////////////////////////// ------ //////////////////////
Print At 9, 1, "Key = ", BIN8 VAR1, " " ; Отобразить на дисплее значение Key в двоичном виде
Опять в комментарии про Key, а в программе VAR1. Исправляем:
Print At 9, 1, "Key = ", BIN8 KEY, " "
----- ///////////////////////// ///////////////////////// ----
В процессе изучения этой команды я немного изменил Вашу программу. Изменения следующие:
Когда не нажата ни одна кнопка на индикаторе вместо KEY=0 отображается KEY=NO
Когда нажата кнопка «0», на индикаторе отображается KEY=0
После отпускания кнопки десятичное значение KEY изменяется в соответствии с InKey
Текст прилагаю ниже.
;Общие настройки
Device = 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
Dim KEY As 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 ; включить антидребезговую защиту на 100 мсек
KEY = LookUp VAR1, [1,2,3,0,4,5,6,0,7,8,9,0,"*",0,"#",0,"NO"] ; Конвертировать содержимое 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 = # "
If KEY = 78 Then Print At 6, 1, "Key = NO " ; Если KEY = 78, то отобразить на ЖКИ надпись
;"KEY = NO "
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 = NO " ; Если KEY = 16, то отобразить на ЖКИ
;надпись "KEY = NO"
GoTo main ; Повторить программу
Замечание.
При прогоне этой программы в Протеусе обнаружился такой нюанс – время от времени в строках, отображающих десятичное и двоичное значение переменной KEY, появляется мигание этих значений. При чем это мигание появляется, когда идет индикация *, #, NO. Как-будто есть пауза между выводом значения KEY на индикацию и проверкой условий нажатия на клавиши * , # и не нажатия на клавиши. Может это просто некорректная симуляция??? Ответа пока не нашёл. Может Вы сталкивались с такой ситуацией? Тогда прошу просветить.
Что бы избавиться от этого эффекта я еще немного изменил программу. Теперь мигания никакого нет, но программа стала посложнее. Текст этого варианта представлен ниже. В ней добавлена строка Button, показывающая нажатую клавишу, а в строке Key – десятичное значение кода нажатой клавиши.
;Общие настройки
Device = 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
Dim KEY As 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 ; Включить антидребезговую защиту на 100 мсек
KEY = LookUp VAR1, [1,2,3,0,4,5,6,0,7,8,9,0,"*",0,"#",0,"NO"] ; Конвертировать содержимое VAR1
Print At 5, 1, "InKey = ", Dec VAR1, " " ; Отобразить на дисплее значение InKey в десятичном виде
Print At 6, 1, "Key = ", Dec KEY, " " ; Отобразить на дисплее значение Key в десятичном виде
If KEY = 42 Then KEY_42 ; Если KEY = 42, то идти на метку KEY_42
If KEY = 35 Then KEY_35 ; Если KEY = 35, то идти на метку KEY_35
If KEY = 78 Then KEY_78 ; Если KEY = 78, то идти на метку KEY_78
Print At 7, 1, "Button = ", Dec KEY, " " ; Отобразить на дисплее нажатую клавишу
main_1: ; Метка main_1
Print At 9, 1, "InKey = ", Bin8 VAR1, " " ; Отобразить на дисплее значение InKey в двоичном виде
Print At 10, 1, "Key = ", Bin8 KEY, " " ; Отобразить на дисплее значение Key в двоичном виде
GoTo main ; Повторить программу
KEY_42: ; Метка KEY_42
Print At 7, 1, "Button = * " ; Отобразить на дисплее нажатую клавишу "*"
GoTo main_1 ; Возврат на метку main_1
KEY_35: ; Метка KEY_35
Print At 7, 1, "Button = # " ; Отобразить на дисплее нажатую клавишу "#"
GoTo main_1 ; Возврат на метку main_1
KEY_78: ; Метка KEY_78
Print At 7, 1, "Button = NO " ; Отобразить на дисплее, что нажатых клавиш нет
GoTo main_1 ; Возврат на метку main_1
End
Кстати
Выложенная Вами в архиве модель inkey3x4.DSN для Протеуса у меня не пошла. При попытке запуска её мне было сообщено, что у меня устаревшая версия Протеуса (Proteus 7.2 SP2 сборка 4602) и она не поддерживает данную модель inkey3x4.DSN. Хотелось бы узнать на какую версию нужно перейти.


