Форум РадиоКот • Просмотр темы - Семисегментный индикатор. Помогите с перекодировкой.
Сообщения без ответов | Активные темы
Страница 1 из 1
[ Сообщений: 13 ]
Автор
Сообщение
ipiter
Заголовок сообщения: Семисегментный индикатор. Помогите с перекодировкой.
Добавлено: Вт май 14, 2013 18:50:19
Встал на лапы
Зарегистрирован: Пн май 03, 2010 02:19:08Сообщений: 82Откуда: Москва
Рейтинг сообщения: 0
Всем привет. Устройство на PIC16F84A. Программный счётчик выполняет 16-тиразрядный счёт и записывает результат в два байта ОЗУ. Полученное значение надо показать на семисегментном, 4-хразрядном индикаторе. Как преобразовать двубайтное число, больше 255, в четыре отдельных байта? Чтобы потом перекодировать каждый из 4-х байт в код семисегментной цифры и показать на индикаторе поразрядно. С уважением, Питер.
_________________ Программист ПЛИС
Вернуться наверх
Реклама
ChipKiller
Заголовок сообщения: Re: Семисегментный индикатор. Помогите с перекодировкой.
Добавлено: Вт май 14, 2013 18:58:13
Сверлит текстолит когтями
Карма: 4
Рейтинг сообщений: 30
Зарегистрирован: Ср янв 05, 2011 16:25:15Сообщений: 1163
Рейтинг сообщения: 0
Код:
// #define led_a 0x01 #define led_b 0x02 #define led_c 0x04 #define led_d 0x08 #define led_e 0x10 #define led_f 0x20 #define led_g 0x40 #define led_h 0x80 #define ch_0 (led_a + led_b + led_c + led_d + led_e + led_f) #define ch_1 (led_b + led_c) #define ch_2 (led_a + led_b + led_g + led_d + led_e) #define ch_3 (led_a + led_b + led_c + led_d + led_g) #define ch_4 (led_b + led_c + led_g + led_f) #define ch_5 (led_a + led_c + led_d + led_g + led_f) #define ch_6 (led_a + led_c + led_d + led_g + led_f + led_e) #define ch_7 (led_a + led_b + led_c) #define ch_8 (led_a + led_b + led_c + led_d + led_e + led_f + led_g) #define ch_9 (led_a + led_b + led_c + led_d + led_g + led_f)
а дальше
Код:
flash char table[10]={ch_0,ch_1,ch_2,ch_3,ch_4,ch_5,ch_6,ch_7,ch_8,ch_9}; ... PORTx=table[n]; // n - число 0..9
Вернуться наверх
Реклама
ipiter
Заголовок сообщения: Re: Семисегментный индикатор. Помогите с перекодировкой.
Добавлено: Вт май 14, 2013 19:13:38
Встал на лапы
Зарегистрирован: Пн май 03, 2010 02:19:08Сообщений: 82Откуда: Москва
Рейтинг сообщения: 0
Это перекодировка в семисегментные цифры. А я спрашиваю: "Как перекодировать двоичное число, выраженное 16-ю разрядами т. е. 2-мя байтами, в 5 отдельный байт, содержащие десяткитысяч, тысячи, сотни десятки и единицы." 16-ти разрядное число - это число от 0 до 65536 т. е. пять разрядов. А 255 - 3 разряда т.е. 1 байт.
_________________ Программист ПЛИС
Вернуться наверх
ChipKiller
Заголовок сообщения: Re: Семисегментный индикатор. Помогите с перекодировкой.
Добавлено: Вт май 14, 2013 19:19:15
Сверлит текстолит когтями
Карма: 4
Рейтинг сообщений: 30
Зарегистрирован: Ср янв 05, 2011 16:25:15Сообщений: 1163
Рейтинг сообщения: 0
понял -
welcome PS. .. если сложно - можно последовательно вычитать 10000,1000,100,10 сохраняя число вычетов
n которое и подставить в
table[n]
Вернуться наверх
Реклама
ipiter
Заголовок сообщения: Re: Семисегментный индикатор. Помогите с перекодировкой.
Добавлено: Вт май 14, 2013 19:26:14
Встал на лапы
Зарегистрирован: Пн май 03, 2010 02:19:08Сообщений: 82Откуда: Москва
Рейтинг сообщения: 0
ChipKiller писал(а):
понял -
welcome PS. .. если сложно - можно последовательно вычитать 10000,1000,100,10 сохраняя число вычетов
n которое и подставить в
table[n] вычесть 100 и 10 ясно.
Как из одного байта вычесть 1000 и 10000?
Объясните пожалуйста алгоритм.
_________________ Программист ПЛИС
Вернуться наверх
Реклама
ChipKiller
Заголовок сообщения: Re: Семисегментный индикатор. Помогите с перекодировкой.
Добавлено: Вт май 14, 2013 19:30:17
Сверлит текстолит когтями
Карма: 4
Рейтинг сообщений: 30
Зарегистрирован: Ср янв 05, 2011 16:25:15Сообщений: 1163
Рейтинг сообщения: 0
Цитата:
Как из одного байта вычесть 1000 и 10000?
из одного байта - никак. Вычитаете из двух байт (по очереди с учетом флага переноса)
Вернуться наверх
Реклама
ipiter
Заголовок сообщения: Re: Семисегментный индикатор. Помогите с перекодировкой.
Добавлено: Вт май 14, 2013 19:41:38
Встал на лапы
Зарегистрирован: Пн май 03, 2010 02:19:08Сообщений: 82Откуда: Москва
Рейтинг сообщения: 0
ChipKiller писал(а):
Цитата:
Как из одного байта вычесть 1000 и 10000?
из одного байта - никак. Вычитаете из двух байт (по очереди с учетом флага переноса)
Но ведь 1000 состоит тоже из двух байт. Это - 0000 0011 1110 1000
И 10000 тоже - 0010 0111 0001 0000
_________________ Программист ПЛИС
Вернуться наверх
ipiter
Заголовок сообщения: Re: Семисегментный индикатор. Помогите с перекодировкой.
Добавлено: Вт май 14, 2013 19:44:59
Встал на лапы
Зарегистрирован: Пн май 03, 2010 02:19:08Сообщений: 82Откуда: Москва
Рейтинг сообщения: 0
Я примера код преобразования одного байта.
Код:
clrf hun ;Очистить сотни clrf dec ;Очистить десятки bsf status,c ;Установить перенос con100 movlw d'100' ; subwf count1,w ;Вычесть сто btfss status,c ;Если сотен не осталось, goto con10 ;идти дальше movwf count1 ;Иначе сохранить остаток incf hun,f ;и добавить сотню goto con100 ;и повторить bsf status,c ;Установить перенос con10 movlw d'10' ; subwf count1,w ;Вычесть десять btfss status,c ;Если сотен не осталось, goto con1 ;идти дальше movwf count1 ;Иначе сохранить остаток incf dec,f ;и добавить сотню goto con10 ;и повторить con1
_________________ Программист ПЛИС
Последний раз редактировалось ipiter Ср май 15, 2013 15:33:30, всего редактировалось 2 раз(а).
Вернуться наверх
zero648
Заголовок сообщения: Re: Семисегментный индикатор. Помогите с перекодировкой.
Добавлено: Ср май 15, 2013 06:09:30
Вымогатель припоя
Карма: 5
Рейтинг сообщений: 74
Зарегистрирован: Пн июн 18, 2012 12:01:04Сообщений: 650Откуда: Челябинская область, Копейск
Рейтинг сообщения: 0
Сначала вычитаете по 10000 до тех пор пока число не станет меньше 10000, затем вычитаете по 1000, затем по 100, затем по 10 и остаток единицы. Для первых двух используется двухбайтовое вычитание.
Вернуться наверх
Реклама
korsaj
Заголовок сообщения: Re: Семисегментный индикатор. Помогите с перекодировкой.
Добавлено: Ср май 15, 2013 06:39:17
Потрогал лапой паяльник
Карма: 2
Рейтинг сообщений: 13
Зарегистрирован: Чт июн 23, 2011 07:55:51Сообщений: 330
Рейтинг сообщения: 0
Для
ipiter , строка
Код:
bsf status,c ;Установить перенос
никогда не выполнится.
Вернуться наверх
ChipKiller
Заголовок сообщения: Re: Семисегментный индикатор. Помогите с перекодировкой.
Добавлено: Ср май 15, 2013 07:07:25
Сверлит текстолит когтями
Карма: 4
Рейтинг сообщений: 30
Зарегистрирован: Ср янв 05, 2011 16:25:15Сообщений: 1163
Рейтинг сообщения: 0
Вернуться наверх
ipiter
Заголовок сообщения: Re: Семисегментный индикатор. Помогите с перекодировкой.
Добавлено: Ср май 15, 2013 15:27:11
Встал на лапы
Зарегистрирован: Пн май 03, 2010 02:19:08Сообщений: 82Откуда: Москва
Рейтинг сообщения: 0
ChipKiller писал(а):
похоже ТС имеет весьма смутные представления о двоичной арифметике, так что лучше разобраться с основами
http://progcode.narod.ru/stati/asm_stan ... tricks.pdf PS. на последней странице есть пример многобайтного вычитания
Вот это то, что надо!
Спасибо.
_________________ Программист ПЛИС
Вернуться наверх
ipiter
Заголовок сообщения: Re: Семисегментный индикатор. Помогите с перекодировкой.
Добавлено: Ср май 15, 2013 15:29:09
Встал на лапы
Зарегистрирован: Пн май 03, 2010 02:19:08Сообщений: 82Откуда: Москва
Рейтинг сообщения: 0
korsaj писал(а):
Для
ipiter , строка
Код:
bsf status,c ;Установить перенос
никогда не выполнится.
Посмотрите, в каком случае перенос устанавливается.
_________________ Программист ПЛИС
Вернуться наверх
Страница 1 из 1
[ Сообщений: 13 ]
Кто сейчас на форуме
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения