Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: ivan_fd  
Форум Picbasic.ru » Программирование МК » PicBasicPro » Реализация меню на LCD (Pic16f877 + LCD 2x16)
Реализация меню на LCD
chiper Дата: Вт, 20.07.2010, 00:22  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 108
Репутация: 4   ±
Замечания:   ±
На сайте с 14.07.2010

Статус: Offline

Добрый день! подскажите как лучше всего реализовать программно меню на ЖКИ

Мне надо меню с управлением от 3х кнопок

1 - <<< (porte 0)
2 - ok/menu (porte 1)
3 - >>> (porte 2)

алгоритм такой:

Выходит надпись

Code

   lcdout $FE,1,  " Сhoose a mode. "
   LCDOUT $FE,192,"-------ok-------"

[/code]

и дальше идёт цикл на проверку кнопки "ок"

когда кнопка будет нажата будет переход в меню.

в меню 4 пункта :
Генератор

Code

   LCDOUT $FE, 1,      "   Generator.   "
   LCDOUT $FE,192, "<<<----ok---->>>"

Автоматика

Code
                     
   LCDOUT $FE, 1,     "        Auto        "
   LCDOUT $FE,192, "<<<----ok---->>>"

Свет

Code
                     
   LCDOUT $FE, 1,     "        Light        "
   LCDOUT $FE,192, "<<<----ok---->>>"

выключение.

Code
                     
   LCDOUT $FE, 1,     "     Shutdown    "    
   LCDOUT $FE,192, "<<<----ok---->>>"

переход между этими пунктами выполняется кнопками <<< и >>>, подтверждение выбранного пункта кнопка ок.

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

Code

   LCDOUT $FE, 1,      "   Generator.   "
   LCDOUT $FE,192, "------menu------"

Code
                     
   LCDOUT $FE, 1,     "        Auto        "
   LCDOUT $FE,192, "------menu------"

Code
                     
   LCDOUT $FE, 1,     "        Light        "
   LCDOUT $FE,192, "------menu------"

Code
                     
   LCDOUT $FE, 1,     "    Shutdown     "    
   LCDOUT $FE,192, "------menu------"

ну и разумеется как вы уже догадались при нажатие кнопки menu должно происходить возвращение в меню с выбором режима.

Вот я пытался делать наброски....  но работает почему то криво =((  и по этой причине не стал доделовать до конца дабы не запутаться ещё больше....

Подскажите  хоть как надо вообще это правильно реализовывать..  может у меня подход не правильный...  

Code


     
   lcdout $FE,1,  " Сhoose a mode. "
    LCDOUT $FE,192, "-------ok-------"
     
   start:   
   if porte.1 = 0 then    
    LCDOUT $FE, 1   
    pause 400
   goto menu
   endif
   goto start
     
   menu:
   LCDOUT $FE, 1,  "   Generator.   "
   LCDOUT $FE,192, "<<-----ok----->>"
   if tmp1 = 1 then tmp1 = 2
   if tmp1 = 2 then menu0
    goto menu0
   menu0:
   if tmp1 = 1 then goto generatormenu
    if porte.1 = 0 then
   LCDOUT $FE, 1,  "   Generator.   "
   LCDOUT $FE,192, "------menu------"
   pause 400    
   goto generatorok
    goto begin
   endif
   goto menu0
     
   generatormenu:
   if porte.1 = 0 then   
    pause 100
   goto menu
   endif
    goto generatormenu
     
     
   generatorok:
   portd.2 = 1
   tmp1 = 1
   goto menu0


[/code]

Добавлено (20.07.2010, 00.22.16)
---------------------------------------------
Ребята такое ощущение что до меня это ни кто не пробывал реализовывать)))

я не прошу за меня написать, просто объясните основные тонкости которых я пока ещё не знаю smile
Просто я реально забросил на данном этапе прогу, т.к. не хочу сделать тёмный лес и километровый листинг.....


Как бы ты хорошо не паял, твой девайс на микроконтроллере без прошивки будет просто куском железа.
Сообщение отредактировал chiper - Вс, 18.07.2010, 13:23
ЯНДЕКС Дата: 20.07.2010
DAlexV Дата: Вт, 20.07.2010, 00:28  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Посмотри здесь. Хоть и заточен под Рыбу, но при желании можно и под PBP переделать.
http://www.sfcompiler.co.uk/wiki....uModule
Если очень страшно, то посмотри прилагаемый к посту код. lvitat достаточно наглядно сделал пример реализации меню.
http://www.picbasic.ru/forum/28-384-4145-16-1269344653


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
Matrix252005 Дата: Чт, 22.07.2010, 14:01  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 636
Репутация: 43   ±
Замечания:   ±
На сайте с 12.10.2007

Статус: Offline

chiper, по ходу, у Вас есть проект. Вы бы не смогли бы его скинуть? Я попробую покопаться. Задумки есть!!!

THE TRUTH IS OUT THERE.

С уважением, Николай.
chiper Дата: Чт, 22.07.2010, 15:26  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 108
Репутация: 4   ±
Замечания:   ±
На сайте с 14.07.2010

Статус: Offline

Это дело чести))) какой он тогда проект если всё сделают за меня ?))

Как бы ты хорошо не паял, твой девайс на микроконтроллере без прошивки будет просто куском железа.
Matrix252005 Дата: Чт, 22.07.2010, 15:45  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 636
Репутация: 43   ±
Замечания:   ±
На сайте с 12.10.2007

Статус: Offline

Все равно выложите... wink

THE TRUTH IS OUT THERE.

С уважением, Николай.
chiper Дата: Вс, 07.11.2010, 22:37  |                                                                                                                Сообщение # 6
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 108
Репутация: 4   ±
Замечания:   ±
На сайте с 14.07.2010

Статус: Offline

Привет ребята! Пару месяцев назад я просил помощь с программой :)
Так вот... уже прошло достаточно времени... по тихоньку в свободное от учёбы время делал проект... Уже всё железо сострогал :) программу вообще написал спустя 4 дня после обращения за помощью :)

Ну так вот.... Протестил на реальном железе, работает даже лучще чем на эмуляторе! я программой доволен! НУ почти доволен..
Единственый баг, это в режимах "Solbat" и в режиме "Auto" Баг заключается в не правильном выполнении куска программы "Гелиостат".

Суть заключается в том, что после сравнения межд собой сопротивлений, мотор продолжает вращаться до тех пор, пока сопротивления не сравняются тютелька в тютельку... а мне такое не надо.... мне надо что бы моторы начинали своё вращение в лишь в том случае, когда разница между датчиками будет большой. а так получается эфект "залипания".. вот я не знаю даже что делать, может переменные b0, b1, b00, b11 сбрасывать перед каждом новом "считывание" команды pot ?
И ещё одно, иногда (редко) при пролистывании менюшки "<<< >>> " бывает проскакивает раз через раз, своего рода меняется последовательность пунктов. Как это исправить?

Ну вообщем вот исходник на picbasicPRO и сам проджект в протеусе.
Подскажите пожалуйста мне начинающему в чём конкретно мои косяки... может за одно подскажете где лучще лишнии "goto" по убирать от греха по дальше.

Буду оочень чисто по человечески благодарен!

З.Ы. после компиляции выдаёт в логах два "306 замечания/сообщения". Это сильно фигово?

Прикрепления: project_chiper.zip (194.5 Kb)


Как бы ты хорошо не паял, твой девайс на микроконтроллере без прошивки будет просто куском железа.
Сообщение отредактировал chiper - Вс, 07.11.2010, 23:10
DAlexV Дата: Вт, 09.11.2010, 00:41  |                                                                                                                Сообщение # 7
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Quote (chiper)
Пару месяцев назад я просил помощь с программой
Да, помним. Было такое. Проект действительно интересный. Как дела с поворотным механизмом. Фотки для просмотра PLEASE.
Начнем пожалуй с горчичников
Quote (chiper)
З.Ы. после компиляции выдаёт в логах два "306 замечания/сообщения". Это сильно фигово?
Да не сильно хорошо. Если ругается на ADC, то скорее всего Шпротеус считает что время на обработку АЦП преобразования слишком мало и не гарантирует правильный результат преобразования. Если на LCD, то скорее всего на задержки по записи/чтению. Причем на реальном устройстве это может и не отражаться. Но желательно учитывать.
Достаточно просто увеличить время и частоту преобразования АЦП
DEFINE ADC_CLOCK 100
DEFINE ADC_SAMPLEUS 10
Для LCD
DEFINE LCD_COMMANDUS 2000 ' Определяем время задержки между командами на ЖКИ.
DEFINE LCD_DATAUS 50 ' Определяем время задержки между посылками данных.
После этого может остаться только один горчичник (REAL TIME (если компутер не успевает работать в режиме реального времени)). На него можно не обращать внимания.


По схемотехнике. Ветку про ADC (http://www.picbasic.ru/forum/9-441-1) пропустил напрочь. Из ветки:
Quote (chiper)
Сразу возникает вопрос почему я не использую для этой цели АЦП - отвечаю.... в pic16f877 4 канала АЦП, а таких таких гелиостатов мне надо 2 - следовательно надо 4 канала АЦП

Что в 877, что в 877А 8 каналов АЦП, так что использовать для данного проекта POT (RC цепочку), а ADC каналы отдать кнопкам, только усложнять сложное. Вариант схемы выложу завтра, сегодня уже поздно.


Теперь про глюки и баги.
Quote (chiper)
ожет переменные b0, b1, b00, b11 сбрасывать перед каждом новом "считывание" команды pot ?
Это не требуется. После выполнения команды POT они все равно обновляются.
Непонятна строчка task = ~ task - инверсия предполагаю.
чуть измененный кусок программы:
Code
IF task = 0 and on_geleostat = 1 THEN  

         pot 5,255,b0                    ' замеряем значения напряжения и переносим в B0 и B1
         pot 4,255,b1   
         if b0 = b1 then ifbuttonmenu                   ' если одинаковы, то в меню

         if b0 > b1 then                    ' если B0 больше  B1
           c0 = b0 - b1                    ' получаем разницу в С0
             if c0 > 60 then left                    ' если больше 60   
                portc.4 = 1                    ' крутим движок по часовой
                portc.5 = 0    
             else
                portc.4 = 0                    ' иначе, стоим
                portc.5 = 0
             end if
         end if
         goto ifbuttonmenu  
' то же самое если B1 больше  B0

         if b0 < b1 then   
             c0 = b1 - b0    
             if c0 > 60 then
               portc.5 = 1    
               portc.4 = 0  
             else
               portc.4 = 0
               portc.5 = 0
             end if   
         goto ifbuttonmenu   

endif

точно такой же кусок получиться по условию IF task = 1 and on_geleostat = 1 THEN . Если при прохождении блока "Гелеостат" переменные task и on_geleostat гарантированно не меняются, то goto ifbuttonmenu из блоков сравнения то же можно исключить, оставив только самое последнее

ENDIF

goto ifbuttonmenu

'******************** конец куска "Гелеостат"

Это все что можно порезать с goto. chiper, если не трудно, расставь пожалуйста комменты, а с утра гляну на свежую голову.


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
DAlexV Дата: Вт, 09.11.2010, 09:19  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Продолжаем банкет. Дополнение по горчичникам. Вывод сбороса /mclr не подключен через R на питание.
Выложил свой вариант схемотехники. Все измерения через АЦП. +3 канала в запасе(E0-E3). Кнопки на B4-B6 если захочется заморочиться с прерываниями. LCD отдал порту D. Порт С полностью свободен для последующего расширения (SPI, I2C, Usart). На то что проц. 18F452, а не 16F877A не обращай внимания. По ногам он полностью совпадает. Схема специально нарисована с соединителями что бы легче было сменить проц. Просто удаляешь 452, и вклеиваешь вместо него 877. Прогу переведу в Рыбу и посмотрю глюки вечером. Сейчас работа.

Успехов wink

Прикрепления: _DAlexV.dsn (186.6 Kb)


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
chiper Дата: Вт, 09.11.2010, 11:05  |                                                                                                                Сообщение # 9
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 108
Репутация: 4   ±
Замечания:   ±
На сайте с 14.07.2010

Статус: Offline

Quote (DAlexV)
Выложил свой вариант схемотехники

Вау)) как я не рационально протеус использовал biggrin
Конечно большой респект! не ожидал!!!
Чёто я сильно намудрил... Не зря говорится "Первый блин комом", но нечё, буду учиться! Больше халтуры не будет!

Но есть одно но.... не хочу уже сопли разводить на схеме, а на переделку как всегда времени нет... мне в 20х числах ноября уже проект вести на окружную конференцию.... так что ту халтуру что я имею на данный момент лучще оставить в покое =) Да и пока накладки у меня с лазерным принтером в добавок.... Тонер кончается... Последнюю плату для лицевой понели уже чуток маркером наводил angry

Конечно здорово что можно это всю чисто на АЦП замутить... но блин уже весь девайс намутил под текущую схему... печально =(
Ну ладно, перейду от лирического отступления ближе к делу =)

Quote (DAlexV)
ожет переменные b0, b1, b00, b11 сбрасывать перед каждом новом "считывание" команды pot ?Это не требуется. После выполнения команды POT они все равно обновляются. Непонятна строчка task = ~ task - инверсия предполагаю. чуть измененный кусок программы:

Спасибо) вечером попробую! про task =~ task написано всё тут http://www.picbasic.ru/forum/9-441-1

Теперь долгожданные фотки smile

Вот в разных ракурсах сама установка :), Думаю я ещё пожалею что сделал всё так масивно.... 5.4Кг вместе с аккумялятором....

в следующем сообщении фотографии механики, платы и более подробное описание....

Прикрепления: 5807366.jpg (298.5 Kb) · 4436792.jpg (302.5 Kb) · 0241380.jpg (312.8 Kb) · 1688619.jpg (281.6 Kb) · 6828918.jpg (247.5 Kb)


Как бы ты хорошо не паял, твой девайс на микроконтроллере без прошивки будет просто куском железа.
Сообщение отредактировал chiper - Вт, 09.11.2010, 11:41
Matrix252005 Дата: Вт, 09.11.2010, 11:19  |                                                                                                                Сообщение # 10
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 636
Репутация: 43   ±
Замечания:   ±
На сайте с 12.10.2007

Статус: Offline

Приятного времени суток.
chiper, applause молодец. Круто получилось!!!


THE TRUTH IS OUT THERE.

С уважением, Николай.
chiper Дата: Вт, 09.11.2010, 17:09  |                                                                                                                Сообщение # 11
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 108
Репутация: 4   ±
Замечания:   ±
На сайте с 14.07.2010

Статус: Offline

Верхняя часть установки скорее всего ещё будет краситься... а то как то не солидно фанера и ламинат смотрятся на коробке из оргстекла )))
Теперь подробнее о механике.

За поворотную основу я взял головку от видеомагнитофона, и прилично доработал её на токарном станке в школе.
В результате, по серединке (на месте стыков двух половинок головки) убрал 10мм на станке, как раз по толщине фанеры, и ещё маленько "облегчил" головку... уж больно она массивная была....

Получилось по моему хорошо, всю верхнюю часть конструкции сделал съёмной, достаточно лишь снять стопорную втулку на которой закреплена шестернь, и всё небольшим физическим усилием верхняя часть всей установки снимается вместе с солнечной батареей

Саму механику для раскрутки основания снял с принтера Canon оочень древней модели.

А вот с поворотом солнечной батареи я сильно обложился. Не рассчитал что моторчик не сможет через таую ременную передачу повернуть батарею.... Полюбому надо будет от куда то тырить механику и переделывать..... Тем более на пасике нет устойчивости у батареи, её просто напросто под действием mg наклоняет либо влево либо в право..

Вот та самая схема на переделку которой у меня уже нет ни времени, не желания.... По моему и так сойдёт.

Всё это делаю где то с конца августа. Потихоньку в свободное от учёбы в школе время... Очень много сделал на работе у одного знакомого радиомеханика, пока с ним не поругался.... В итоге у него на работе только "генератор" собрали и коробку склеили... Всё остальное уже в домашних условиях "на коленках" делал. В том числе и плату. Думаю закончить окончательно через пару недель... И хоть в комнате приберу... а то вся комната в стружке из оргстекла:D Но пока всё упереться в косяк с механикой, и в глюченный кусок программы... Вечером буду смотреть и устранять косяки на которые Вы мне уже указали....

Добавлено (09.11.2010, 17.09.57)
---------------------------------------------
DAlexV по побывал Ваш кусок кода...... чёто компилятор ругается......

не нравится ему расстановка IF и endif...... где то у Вас ошибочка....

Прикрепления: 5213288.jpg (260.9 Kb) · 0416602.jpg (278.4 Kb) · 2740519.jpg (277.5 Kb) · 5073721.jpg (40.1 Kb) · 4276443.jpg (40.2 Kb)


Как бы ты хорошо не паял, твой девайс на микроконтроллере без прошивки будет просто куском железа.
Сообщение отредактировал chiper - Вт, 09.11.2010, 13:35
ЯНДЕКС Дата: 09.11.2010
Matrix252005 Дата: Вт, 09.11.2010, 17:20  |                                                                                                                Сообщение # 12
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 636
Репутация: 43   ±
Замечания:   ±
На сайте с 12.10.2007

Статус: Offline

chiper, Уберите: "left"
if c0 > 60 then left ' если больше 60
portc.4 = 1 ' крутим движок по часовой
portc.5 = 0

Он ругается на ENDIF - говорит что он типа лишний.


THE TRUTH IS OUT THERE.

С уважением, Николай.

Сообщение отредактировал Matrix252005 - Вт, 09.11.2010, 17:51
chiper Дата: Вт, 09.11.2010, 21:38  |                                                                                                                Сообщение # 13
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 108
Репутация: 4   ±
Замечания:   ±
На сайте с 14.07.2010

Статус: Offline

C:\USERS\CHIPER\DESKTOP\Ïðîåêò 2010\KOSTYU~1.PBP ERROR Line 194: IF without a matching ENDIF.
C:\USERS\CHIPER\DESKTOP\Ïðîåêò 2010\KOSTYU~1.PBP ERROR Line 200: IF without a matching ENDIF.
C:\USERS\CHIPER\DESKTOP\Ïðîåêò 2010\KOSTYU~1.PBP ERROR Line 202: ELSE without a matching ENDIF.
C:\USERS\CHIPER\DESKTOP\Ïðîåêò 2010\KOSTYU~1.PBP ERROR Line 208: Syntax error.
C:\USERS\CHIPER\DESKTOP\Ïðîåêò 2010\KOSTYU~1.PBP ERROR Line 209: Syntax error.
C:\USERS\CHIPER\DESKTOP\Ïðîåêò 2010\KOSTYU~1.PBP ERROR Line 213: IF without a matching ENDIF.
C:\USERS\CHIPER\DESKTOP\Ïðîåêò 2010\KOSTYU~1.PBP ERROR Line 221: Syntax error.

если бы только это..... ругается даже на самый верхний IF.... Вот чем я и не люблю бейсик... вечный геморой с if и endif.... Мыслю при их постановке как в Delphi... а тут такой подход не прокатывает..... ех..

Добавлено (09.11.2010, 21.38.16)
---------------------------------------------
ВОТ! Кусок кода который мне предоставил Matrix252005 в личных сообщениях:)

По моему это то, что надо! И главное компилируется! Хотя нет... я тут подумал, скорее всего он будет работать так же как у меня изночально, или я ошибаюсь?

Code
task = ~ task      
If task = 0 And on_geleostat = 1 Then   
      Pot PORTB.5, 255, b0    
      Pot PORTB.4, 255, b1    
      If b0 = b1 Then ifbuttonmenu    

      If b0 > b1 Then   
          c0 = b0 - b1   
          If c0 > 60 Then PORTC.4 = 1 : PORTC.5 = 0     
          If c0 < 60 Then PORTC.4 = 0 : PORTC.5 = 0    
          GoTo ifbuttonmenu    
      EndIf

      If b0 < b1 Then
          c0 = b1 - b0
          If c0 > 60 Then PORTC.5 = 1 : PORTC.4 = 0
          If c0 < 60 Then PORTC.4 = 0 : PORTC.5 = 0    
          GoTo ifbuttonmenu    
      EndIf    
EndIf    

If task = 1 And on_geleostat = 1 Then   
     Pot PORTB.7, 255, b00    
     Pot PORTB.6, 255, b11    
     If b00 = b11 Then ifbuttonmenu   
       
      If b00 > b11 Then
          c00 = b00 - b11     
          If c00 > 60 Then PORTC.6 = 1 : PORTC.7 = 0     
          If c00 < 60 Then PORTC.6 = 0 : PORTC.7 = 0    
          GoTo ifbuttonmenu    
      EndIf     
       
      If b00 < b11 Then   
          c00 = b11 - b00     
          If c00 > 60 Then PORTC.7 = 1 : PORTC.6 = 0    
          If c00 < 60 Then PORTC.6 = 0 : PORTC.7 = 0    
          GoTo ifbuttonmenu    
      EndIf   
EndIf       
   GoTo ifbuttonmenu
     
   '******************** конец куска "Гелеостат"


Как бы ты хорошо не паял, твой девайс на микроконтроллере без прошивки будет просто куском железа.
Сообщение отредактировал chiper - Вт, 09.11.2010, 21:40
DAlexV Дата: Вт, 09.11.2010, 22:43  |                                                                                                                Сообщение # 14
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Да Действительно, ошибся. Код изменял по принципу copy/paste.
Quote (Matrix252005)
chiper, Уберите: "left" if c0 > 60 then left ' если больше 60

Matrix252005 правильно подметил, достаточно убрать "left".


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
DAlexV Дата: Сб, 20.11.2010, 01:07  |                                                                                                                Сообщение # 15
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Конструкция подобная собираемой(но аналоговая)
https://sites.google.com/site/kyrosprojects/home/relay-solar-tracker
https://sites.google.com/site/kyrosprojects/my-page


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
Форум Picbasic.ru » Программирование МК » PicBasicPro » Реализация меню на LCD (Pic16f877 + LCD 2x16)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск: