В ходе поиска материалов для заготовок корпуса очередного "изделия" ;) наткнулся на пакетик с двумя дисплеями (уже не помню от чего)...
Один - 10", второй 7", но с отдельной R-TouchPad панелью...
Вот эта панель меня и заинтересовала, т.к. попытки привести дисплеи в чувство ни к чему не привели...

На развитие идеи подтолкнула вот эта тема - http://avrproject.ru/publ/kak_podkljuch … m/2-1-0-45

Суть в использовании резистивной сенсорной панели в качестве интерфейса взамен кнопок и т.п.
Эта панель прозрачная, что позволяет видеть (использовать) дисплеи, светодиоды и пр. приборы, не имеющие "контактной" обратной связи.

В качеcтве примера была разработана графическая модель лицевой панели с применением LCD 20х4
http://s3.uploads.ru/t/iw3SB.jpg

Т.н. "кнопки" определены квадратами 15х15мм (справа немного другие ;) )
В конечном варианте эти "кнопки" можно просто нарисовать в нужных местах...

Числа указывают значение позиции, которое рассчитывается в программе, исходя из определяемых координат касания сенсорной панели.
Таким образом получаем однозначное понимание, какая "кнопка" была нажата.

Указанные на картинке и в программе "кнопки" могут быть избыточными, на каких-то местах могут быть расположены другие элементы (индикация, напр.)
Соответственно, реакция конечной программы должна соответствовать задействованным позициям.

Тестовая программа:

Код:
$Regfile="m16adef.dat"
$Crystal=8000000
$hwstack=40
$swstack=40
$framesize=32

'====================================================================
Config Lcd = 20 * 4
Config Lcdpin = Pin , Db4 = PortC.4 , Db5 = PortC.5 , Db6 = PortC.6 , Db7 = PortC.7 , Rs = PortC.3 , E = PortC.2
InitLcd
Cursor Off
Cls

'====================================================================
'                           Используемые переменные
Dim x As Word                                               ' координата X
Dim y As Word                                               ' координата Y

Dim pozx As Byte                                          ' позиция по оси X
Dim pozy As Byte                                          ' позиция по оси Y
Dim poz As Byte                                            ' окончательная позиция

'====================================================================
'                           Конфигурация АЦП
Config Adc = Single, Prescaler = Auto, Reference = AVCC
Start Adc

'====================================================================
Waitms 150                                                      ' Задержка для "устаканивания" процессов

'====================================================================
Do

Gosub Touchscreen                                       ' Считывание нажатий

Gosub koordinata                                            ' Расчет позиции

Locate 1, 1
Lcd "X: "; x; "   "                                                ' Выводим значение позиции X
Locate 2, 1
Lcd "Y: "; y; "   "                                                ' Выводим значение позиции Y
Locate 3, 1
Lcd "Poz: "; poz; "   "                                       ' Выводим пересчитанное значение позиции

Loop

End
'====================================================================
Touchscreen:

'  для координаты X
Config Porta.1 = Output                             ' Порты на выход
Config Porta.3 = Output                             ' к ним подключены электроды с первой пленки
Reset Porta.1                                               ' Устанавливаем электрод на "землю"
Set Porta.3                                                   ' Устанавливаем на электроде напряжение питания
Ddra.0 = 0                                                      ' Порты как вход
Ddra.2 = 0                                                      ' Пин для считывания показания с АЦП

Waitms 50                                                        ' Ждем утихания переходных процессов

x = Getadc(0)                                                   ' Читаем координату X
x = 1023 - x                                                       ' Приводим в удобный вид

'   для координаты Y
Config Porta.0 = Output
Config Porta.2 = Output
Reset Porta.0
Set Porta.2
Ddra.1 = 0
Ddra.3 = 0

Waitms 50

y = Getadc(1)
y = 1023 - y

Waitms 100

Return
'====================================================================
'                                                                    Пересчет полученных координат X и Y в позицию
koordinata:

If  x < 74 Then pozx = 0                                ' Кодирование позиции по координате X
If x > 74 And x < 156 Then pozx = 1
If x > 164 And x < 246 Then pozx = 2
If x > 254 And x < 336 Then pozx = 3
If x > 344 And x < 426 Then pozx = 4
If x > 434 And x < 516 Then pozx = 5
If x > 524 And x < 606 Then pozx = 6
If x > 634 And x < 696 Then pozx = 7
If x > 704 And x < 786 Then pozx = 8
If x > 794 And x < 946 Then pozx = 9

If  y < 106 Then pozy = 0                              ' Кодирование позиции по координате Y
If y > 106 And y < 214 Then pozy = 1
If y > 226 And y < 356 Then pozy = 2
If y > 369 And y < 502 Then pozy = 3
If y > 507 And y < 638 Then pozy = 4
If y > 646 And y < 780 Then pozy = 5

Rotate pozx, Left, 4                                     ' Сдвигаем координату X в старший ниббл
'     0000 0001 - для X = 1
'     0001 0000 - после сдвига
poz = pozy + pozx                                         ' Формируем числовое значение позиции
'     0000 0001 (для Y = 1) + 0001 0000 (см. выше)
'     Получаем 17 (DEC) = 0001 0001 - позиция нижней левой "кнопки"

Return
'====================================================================

Отредактировано Nord (2019-04-01 14:30:13)