Реализация меню на LCD
|
|
chiper |
Дата: Вт, 20.07.2010, 00:22 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
108
Замечания:
±
На сайте с 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) --------------------------------------------- Ребята такое ощущение что до меня это ни кто не пробывал реализовывать))) я не прошу за меня написать, просто объясните основные тонкости которых я пока ещё не знаю Просто я реально забросил на данном этапе прогу, т.к. не хочу сделать тёмный лес и километровый листинг.....
Как бы ты хорошо не паял, твой девайс на микроконтроллере без прошивки будет просто куском железа.
Сообщение отредактировал
chiper - Вс, 18.07.2010, 13:23
|
|
|
|
DAlexV |
Дата: Вт, 20.07.2010, 00:28 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 12.10.2007
Статус:
Offline
|
chiper, по ходу, у Вас есть проект. Вы бы не смогли бы его скинуть? Я попробую покопаться. Задумки есть!!!
THE TRUTH IS OUT THERE.
С уважением, Николай.
|
|
|
|
chiper |
Дата: Чт, 22.07.2010, 15:26 | Сообщение # 4 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
108
Замечания:
±
На сайте с 14.07.2010
Статус:
Offline
|
Это дело чести))) какой он тогда проект если всё сделают за меня ?))
Как бы ты хорошо не паял, твой девайс на микроконтроллере без прошивки будет просто куском железа.
|
|
|
|
Matrix252005 |
Дата: Чт, 22.07.2010, 15:45 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
636
Замечания:
±
На сайте с 12.10.2007
Статус:
Offline
|
Все равно выложите...
THE TRUTH IS OUT THERE.
С уважением, Николай.
|
|
|
|
chiper |
Дата: Вс, 07.11.2010, 22:37 | Сообщение # 6 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
108
Замечания:
±
На сайте с 14.07.2010
Статус:
Offline
|
Привет ребята! Пару месяцев назад я просил помощь с программой :) Так вот... уже прошло достаточно времени... по тихоньку в свободное от учёбы время делал проект... Уже всё железо сострогал :) программу вообще написал спустя 4 дня после обращения за помощью :) Ну так вот.... Протестил на реальном железе, работает даже лучще чем на эмуляторе! я программой доволен! НУ почти доволен.. Единственый баг, это в режимах "Solbat" и в режиме "Auto" Баг заключается в не правильном выполнении куска программы "Гелиостат". Суть заключается в том, что после сравнения межд собой сопротивлений, мотор продолжает вращаться до тех пор, пока сопротивления не сравняются тютелька в тютельку... а мне такое не надо.... мне надо что бы моторы начинали своё вращение в лишь в том случае, когда разница между датчиками будет большой. а так получается эфект "залипания".. вот я не знаю даже что делать, может переменные b0, b1, b00, b11 сбрасывать перед каждом новом "считывание" команды pot ? И ещё одно, иногда (редко) при пролистывании менюшки "<<< >>> " бывает проскакивает раз через раз, своего рода меняется последовательность пунктов. Как это исправить? Ну вообщем вот исходник на picbasicPRO и сам проджект в протеусе. Подскажите пожалуйста мне начинающему в чём конкретно мои косяки... может за одно подскажете где лучще лишнии "goto" по убирать от греха по дальше. Буду оочень чисто по человечески благодарен! З.Ы. после компиляции выдаёт в логах два "306 замечания/сообщения". Это сильно фигово?
Как бы ты хорошо не паял, твой девайс на микроконтроллере без прошивки будет просто куском железа.
Сообщение отредактировал
chiper - Вс, 07.11.2010, 23:10
|
|
|
|
DAlexV |
Дата: Вт, 09.11.2010, 00:41 | Сообщение # 7 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Продолжаем банкет. Дополнение по горчичникам. Вывод сбороса /mclr не подключен через R на питание. Выложил свой вариант схемотехники. Все измерения через АЦП. +3 канала в запасе(E0-E3). Кнопки на B4-B6 если захочется заморочиться с прерываниями. LCD отдал порту D. Порт С полностью свободен для последующего расширения (SPI, I2C, Usart). На то что проц. 18F452, а не 16F877A не обращай внимания. По ногам он полностью совпадает. Схема специально нарисована с соединителями что бы легче было сменить проц. Просто удаляешь 452, и вклеиваешь вместо него 877. Прогу переведу в Рыбу и посмотрю глюки вечером. Сейчас работа. Успехов
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|
chiper |
Дата: Вт, 09.11.2010, 11:05 | Сообщение # 9 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
108
Замечания:
±
На сайте с 14.07.2010
Статус:
Offline
|
Quote (DAlexV) Выложил свой вариант схемотехники Вау)) как я не рационально протеус использовал Конечно большой респект! не ожидал!!! Чёто я сильно намудрил... Не зря говорится "Первый блин комом", но нечё, буду учиться! Больше халтуры не будет! Но есть одно но.... не хочу уже сопли разводить на схеме, а на переделку как всегда времени нет... мне в 20х числах ноября уже проект вести на окружную конференцию.... так что ту халтуру что я имею на данный момент лучще оставить в покое =) Да и пока накладки у меня с лазерным принтером в добавок.... Тонер кончается... Последнюю плату для лицевой понели уже чуток маркером наводил Конечно здорово что можно это всю чисто на АЦП замутить... но блин уже весь девайс намутил под текущую схему... печально =( Ну ладно, перейду от лирического отступления ближе к делу =) Quote (DAlexV) ожет переменные b0, b1, b00, b11 сбрасывать перед каждом новом "считывание" команды pot ?Это не требуется. После выполнения команды POT они все равно обновляются. Непонятна строчка task = ~ task - инверсия предполагаю. чуть измененный кусок программы: Спасибо) вечером попробую! про task =~ task написано всё тут http://www.picbasic.ru/forum/9-441-1 Теперь долгожданные фотки Вот в разных ракурсах сама установка :), Думаю я ещё пожалею что сделал всё так масивно.... 5.4Кг вместе с аккумялятором.... в следующем сообщении фотографии механики, платы и более подробное описание....
Как бы ты хорошо не паял, твой девайс на микроконтроллере без прошивки будет просто куском железа.
Сообщение отредактировал
chiper - Вт, 09.11.2010, 11:41
|
|
|
|
Matrix252005 |
Дата: Вт, 09.11.2010, 11:19 | Сообщение # 10 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
636
Замечания:
±
На сайте с 12.10.2007
Статус:
Offline
|
Приятного времени суток. chiper, молодец. Круто получилось!!!
THE TRUTH IS OUT THERE.
С уважением, Николай.
|
|
|
|
chiper |
Дата: Вт, 09.11.2010, 17:09 | Сообщение # 11 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
108
Замечания:
±
На сайте с 14.07.2010
Статус:
Offline
|
Верхняя часть установки скорее всего ещё будет краситься... а то как то не солидно фанера и ламинат смотрятся на коробке из оргстекла ))) Теперь подробнее о механике. За поворотную основу я взял головку от видеомагнитофона, и прилично доработал её на токарном станке в школе. В результате, по серединке (на месте стыков двух половинок головки) убрал 10мм на станке, как раз по толщине фанеры, и ещё маленько "облегчил" головку... уж больно она массивная была.... Получилось по моему хорошо, всю верхнюю часть конструкции сделал съёмной, достаточно лишь снять стопорную втулку на которой закреплена шестернь, и всё небольшим физическим усилием верхняя часть всей установки снимается вместе с солнечной батареей Саму механику для раскрутки основания снял с принтера Canon оочень древней модели. А вот с поворотом солнечной батареи я сильно обложился. Не рассчитал что моторчик не сможет через таую ременную передачу повернуть батарею.... Полюбому надо будет от куда то тырить механику и переделывать..... Тем более на пасике нет устойчивости у батареи, её просто напросто под действием mg наклоняет либо влево либо в право.. Вот та самая схема на переделку которой у меня уже нет ни времени, не желания.... По моему и так сойдёт. Всё это делаю где то с конца августа. Потихоньку в свободное от учёбы в школе время... Очень много сделал на работе у одного знакомого радиомеханика, пока с ним не поругался.... В итоге у него на работе только "генератор" собрали и коробку склеили... Всё остальное уже в домашних условиях "на коленках" делал. В том числе и плату. Думаю закончить окончательно через пару недель... И хоть в комнате приберу... а то вся комната в стружке из оргстекла:D Но пока всё упереться в косяк с механикой, и в глюченный кусок программы... Вечером буду смотреть и устранять косяки на которые Вы мне уже указали.... Добавлено (09.11.2010, 17.09.57) --------------------------------------------- DAlexV по побывал Ваш кусок кода...... чёто компилятор ругается...... не нравится ему расстановка IF и endif...... где то у Вас ошибочка....
Как бы ты хорошо не паял, твой девайс на микроконтроллере без прошивки будет просто куском железа.
Сообщение отредактировал
chiper - Вт, 09.11.2010, 13:35
|
|
|
|
Matrix252005 |
Дата: Вт, 09.11.2010, 17:20 | Сообщение # 12 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
636
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 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).Старею :)
|
|
|
|