вывод progress bar-a
|
|
timerlan |
Дата: Вс, 24.01.2016, 16:52 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
94
Замечания:
±
На сайте с 18.03.2012
Статус:
Offline
|
Всем здравствуйте! помогите, пожалуйста, разобраться с такой ситуёвиной: пытаюсь, в качестве эксперимента, вывести на стандартный LCD прогресбар, который меняется от потенциометра, вот код:
DEFINE LCD_DREG PORTB DEFINE LCD_DBIT 4 DEFINE LCD_RSREG PORTB DEFINE LCD_RSBIT 3 DEFINE LCD_EREG PORTB DEFINE LCD_EBIT 0 DEFINE LCD_BITS 4 DEFINE LCD_LINES 2 DEFINE LCD_COMMANDUS 2000 DEFINE LCD_DATAUS 50
Define ADC_BITS 8 Define ADC_CLOCK 3 Define ADC_SAMPLEUS 50 adval var byte
Init: PortB = $00 TrisB = %00000000 TRISA = %11111111 ADCON1 = %00000010
lcdout $FE,1
main:
ADCIN 0, adval
lcdout $FE,1
if adval < 75 then lcdout $fe, $80,"0" endif
if adval > 100 then lcdout $fe, $80,$ff endif
if adval > 120 then lcdout $fe, $80,$ff,$ff endif
if adval > 140 then lcdout $fe, $80,$ff,$ff,$ff endif
if adval > 160 then lcdout $fe, $80,$ff,$ff,$ff,$ff endif
if adval > 180 then lcdout $fe, $80,$ff,$ff,$ff,$ff,$ff endif
if adval > 200 then lcdout $fe, $80,$ff,$ff,$ff,$ff,$ff,$ff endif
if adval > 210 then lcdout $fe, $80,$ff,$ff,$ff,$ff,$ff,$ff,$ff endif
if adval > 220 then lcdout $fe, $80,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff endif pause 300 goto main
работает, только странно как-то, все время дергается, моргает, изображение на экране, как только не перепробовал, не могу догнать, из-за чего происходит это, как в железе, так и в протеусе ведет себя одинаково. МК 16F72, 4MHz
|
|
|
|
xvovanx |
Дата: Вс, 24.01.2016, 19:39 | Сообщение # 2 |
Группа:
Модераторы
Ранг:
Помогаю всем
Сообщений:
332
Замечания:
±
На сайте с 02.05.2013
Статус:
Offline
|
Дергается потому, что в цикле вы постоянно очищаете экран и потом выводите инфо снова, поэтому и возникают моргания. Вы не очищайте экран вообще, а выводите целыми строками с пустыми знакоместами справа и ими будете стирать старую инфу справа, типа
if adval > 140 then lcdout $fe, $80,$ff,$ff,$ff ," "," "," "," "," "," " endif ....... if adval > 220 then lcdout $fe, $80,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff endif
Сообщение отредактировал
xvovanx - Вс, 24.01.2016, 19:44
|
|
|
|
timerlan |
Дата: Пн, 25.01.2016, 12:29 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
94
Замечания:
±
На сайте с 18.03.2012
Статус:
Offline
|
xvovanx, спасибо, сейчас попробую, но что-то мне кажется, как-то очищать экран надо будет все равно...и неужели 4 MHz недостаточно для визуальной "стабильности" изображения?... Добавлено (25.01.2016, 12:29) --------------------------------------------- сделал вот так:
DEFINE LCD_DREG PORTB DEFINE LCD_DBIT 4 DEFINE LCD_RSREG PORTB DEFINE LCD_RSBIT 3 DEFINE LCD_EREG PORTB DEFINE LCD_EBIT 0 DEFINE LCD_BITS 4 DEFINE LCD_LINES 2 DEFINE LCD_COMMANDUS 2000 DEFINE LCD_DATAUS 50
Define ADC_BITS 8 Define ADC_CLOCK 3 Define ADC_SAMPLEUS 50 adval var byte
Init: PortB = $00 TrisB = %00000000 TRISA = %11111111 ADCON1 = %00000010
lcdout $FE,1
main: adcin 0, adval
if adval < 75 then lcdout $fe, $80,"0" endif
if adval > 100 then lcdout $fe, $80,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10 endif
if adval > 120 then lcdout $fe, $80,$ff,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10 endif
if adval > 140 then lcdout $fe, $80,$ff,$ff,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10 endif
if adval > 160 then lcdout $fe, $80,$ff,$ff,$ff,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10 endif
if adval > 180 then lcdout $fe, $80,$ff,$ff,$ff,$ff,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10 endif
if adval > 200 then lcdout $fe, $80,$ff,$ff,$ff,$ff,$ff,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10 endif
if adval > 210 then lcdout $fe, $80,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10 endif
if adval > 220 then lcdout $fe, $80,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$10,$10,$10,$10,$10,$10,$10,$10 endif pause 500 goto main
чуть лучше, при повороте ручки назад "ненужные" элементы гаснут, но мерцание все равно очень заметное...
|
|
|
|
Matrix252005 |
Дата: Пн, 25.01.2016, 12:38 | Сообщение # 4 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
636
Замечания:
±
На сайте с 12.10.2007
Статус:
Offline
|
Приятного времени суток!!!
timerlan, попробуйте поиграться с задержкой: pause 500... Для начала уберите ее полностью, потом подбирайте до норм результата...
THE TRUTH IS OUT THERE.
С уважением, Николай.
|
|
|
|
timerlan |
Дата: Пн, 25.01.2016, 12:57 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
94
Замечания:
±
На сайте с 18.03.2012
Статус:
Offline
|
Matrix252005, я тоже грешил на неё, варьировал от нуля до 1000 с шагом в 10, не добился нужного, либо очень быстро, либо очень медленно, но моргает...мне кажется, что где-то всамом алгоритме сравнения и вывода на дисплей затык, который я не вижу...при выводе на светодиоды(по всему В порту) все отлично работает...
|
|
|
|
Matrix252005 |
Дата: Пн, 25.01.2016, 13:12 | Сообщение # 6 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
636
Замечания:
±
На сайте с 12.10.2007
Статус:
Offline
|
Что еще мне не сильно нравится в Вашем коде, так это сами условия...
Взять например:
if adval > 100 then lcdout $fe, $80,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10 endif
if adval > 120 then lcdout $fe, $80,$ff,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10 endif
Например adval = 130, смотрим по условиям if adval > 100... 130 больше 100... Условие выполняется...
if adval > 120... тоже самое...
Попробуйте сделать так:
if adval > 100 and adval < 119 then...
И так далее ко всем условиям...
THE TRUTH IS OUT THERE.
С уважением, Николай.
|
|
|
|
timerlan |
Дата: Вт, 26.01.2016, 17:56 | Сообщение # 7 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
94
Замечания:
±
На сайте с 18.03.2012
Статус:
Offline
|
ага, спасибо, хорошая мысль, сейчас попробую!.. Добавлено (26.01.2016, 17:16) --------------------------------------------- попробовал вот так:
main: adcin 0, adval
if adval < 75 then lcdout $fe, $80,"0" endif
if adval > 100 and adval < 120 then lcdout $fe, $80,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10 endif
if adval > 120 and adval < 140 then lcdout $fe, $80,$ff,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10 endif
if adval > 140 and adval < 160 then lcdout $fe, $80,$ff,$ff,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10 endif
if adval > 160 and adval < 180 then lcdout $fe, $80,$ff,$ff,$ff,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10 endif
if adval > 180 and adval < 200 then lcdout $fe, $80,$ff,$ff,$ff,$ff,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10 endif
if adval > 200 and adval < 210 then lcdout $fe, $80,$ff,$ff,$ff,$ff,$ff,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10 endif
if adval > 210 and adval < 220 then lcdout $fe, $80,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10 endif
if adval > 220 then lcdout $fe, $80,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$10,$10,$10,$10,$10,$10,$10,$10 endif pause 500 goto main
без дерганий/морганий, но при возврате(уменьшении) не гаснет часть клеток, т.е. экран надо как-то очищать... Добавлено (26.01.2016, 17:56) --------------------------------------------- пиз;де#!!!! а ларчик просто открывался:
я забыл на первом условии выставить пустые места на незадействованых полях!!..
main: adcin 0, adval
if adval < 75 then lcdout $fe, $80,"0",$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10 endif
if adval > 100 and adval < 120 then lcdout $fe, $80,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10 endif
if adval > 120 and adval < 140 then lcdout $fe, $80,$ff,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10 endif
if adval > 140 and adval < 160 then lcdout $fe, $80,$ff,$ff,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10 endif
if adval > 160 and adval < 180 then lcdout $fe, $80,$ff,$ff,$ff,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10 endif
if adval > 180 and adval < 200 then lcdout $fe, $80,$ff,$ff,$ff,$ff,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10 endif
if adval > 200 and adval < 210 then lcdout $fe, $80,$ff,$ff,$ff,$ff,$ff,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10 endif
if adval > 210 and adval < 220 then lcdout $fe, $80,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10 endif
if adval > 220 then lcdout $fe, $80,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$10,$10,$10,$10,$10,$10,$10,$10 endif pause 50 goto main
|
|
|
|
ADMIN |
Дата: Вт, 26.01.2016, 20:04 | Сообщение # 8 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Вместо if adval > 200 and adval < 210 then лучше написать if adval >= 200 and adval < 210 then поскольку сама цифра 200 остается без внимания при этом. Это относится и к другим условиям
|
|
|
|
timerlan |
Дата: Ср, 27.01.2016, 11:30 | Сообщение # 9 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
94
Замечания:
±
На сайте с 18.03.2012
Статус:
Offline
|
ADMIN, спасибо за замечание!
|
|
|
|
ADMIN |
Дата: Ср, 27.01.2016, 13:40 | Сообщение # 10 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Еще, я бы попробовал загнать это все в цикл. Прога была бы компактнее.
|
|
|
|
timerlan |
Дата: Сб, 30.01.2016, 10:38 | Сообщение # 11 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
94
Замечания:
±
На сайте с 18.03.2012
Статус:
Offline
|
ADMIN, в цикл это как, можно хоть намек?!
|
|
|
|
ADMIN |
Дата: Сб, 30.01.2016, 15:22 | Сообщение # 12 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Ну я сейчас не знаю, как в PBP печать на экран реализуется. У меня он не установлен. Я не знаю, как допечатывать символы в конце строки. А вот по другому вопросу могу сказать так: Есть диапазон от 0 до 220, за исключением первого варианта (до 75 - но и его можно туда же загнать)
adcin 0, adval lcdout $FE, $80 'команда на печать - где именно печатать for i = 0 to adval /10 do ' цикл - значение делим на десять (поскольку i - типа byte, получим значения от 0 до 22 if i <=7 then lcdout "0" else lcdout $FF ' и вот здесь, по задумке, $FF должно напечататься i раз endif lcdout $10, $10, $10, $10, $10, $10 ' в конце печатаем пробелы. next i
К примеру, в протоне я делал таким способом, но там используется номер строки и столбца дисплея, как здесь, не вспомню и не подскажу. Вот статья. Там в коде есть кусок вывода заставки- вывод символа в нужном месте. Принцип тот же.
'-------------------Заставка------------------------ For i = 8 To 1 Step -1 'Заставка :) Cls Print At 1,i, $54,$61,$78,$6F,$BC,$65,$BF,$70," " Print At 2,2 - i, "v.1.0.2" DelayMS 100 Next
|
|
|
|
holyuser |
Дата: Вс, 31.01.2016, 13:31 | Сообщение # 13 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
228
Замечания:
±
На сайте с 12.12.2007
Статус:
Offline
|
А что должно происходить если 75 < adval < 100 ? Добавлено (31.01.2016, 13:31) --------------------------------------------- п.с. кстати, вот вариант: ....... ....... adval var byte shift var byte threshold var byte PORTB = 0 TRISB = 0 TRISA = 255 ' Set PORTA to all input ADCON1 = 2 ' PORTA is analog pause 1000 lcdout $FE,1 begin: ADCIN 0, adval select case adval case is < 75 threshold = 0 case is < 100 threshold = 1 case is < 120 threshold = 2 case is < 140 threshold = 3 case is < 160 threshold = 4 case is < 180 threshold = 5 case is < 200 threshold = 6 case is < 210 threshold = 7 case is < 220 threshold = 8 case else threshold = 9 end select lcdout $FE,$80 for shift = 0 to 15 if shift < threshold then lcdout $FF else lcdout $10 endif next lcdout $FE,$8D,#adval 'контрольный вывод pause 100 goto begin end
|
|
|
|
timerlan |
Дата: Пн, 01.02.2016, 14:38 | Сообщение # 14 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
94
Замечания:
±
На сайте с 18.03.2012
Статус:
Offline
|
holyuser, спасибо! интересная конструкция, буду разбирать!.. Добавлено (01.02.2016, 14:38) --------------------------------------------- holyuser, а почему в этой части
for shift = 0 to 15 if shift < threshold then lcdout $FF else lcdout $10 endif next
у вас в операторе for....next, установлен порог счетчика именно на 15?..
|
|
|
|
holyuser |
Дата: Пн, 01.02.2016, 15:11 | Сообщение # 15 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
228
Замечания:
±
На сайте с 12.12.2007
Статус:
Offline
|
Потому что в строке индикатора 16 позиций. У первой позиции смещение (shift) ноль, и т.д., у последней смещение 15. Таким образом очищается вся строка до конца, потому что последние три позиции используются для вывода значения adval - просто для визуального контроля. Если это не нужно, то можно цикл "укоротить" до необходимого.
|
|
|
|