Команды и директивы компилятора 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. Хотелось бы узнать на какую версию нужно перейти.