Семисегментный индикатор. Помогите с перекодировкой.
- ipiter
- Встал на лапы
- Сообщения: 82
- Зарегистрирован: Пн май 03, 2010 02:19:08
- Откуда: Москва
- Контактная информация:
Семисегментный индикатор. Помогите с перекодировкой.
Всем привет.
Устройство на PIC16F84A.
Программный счётчик выполняет 16-тиразрядный счёт и записывает результат в два байта ОЗУ.
Полученное значение надо показать на семисегментном, 4-хразрядном индикаторе.
Как преобразовать двубайтное число, больше 255, в четыре отдельных байта?
Чтобы потом перекодировать каждый из 4-х байт в код семисегментной цифры и показать на индикаторе поразрядно.
С уважением, Питер.
Устройство на PIC16F84A.
Программный счётчик выполняет 16-тиразрядный счёт и записывает результат в два байта ОЗУ.
Полученное значение надо показать на семисегментном, 4-хразрядном индикаторе.
Как преобразовать двубайтное число, больше 255, в четыре отдельных байта?
Чтобы потом перекодировать каждый из 4-х байт в код семисегментной цифры и показать на индикаторе поразрядно.
С уважением, Питер.
Программист ПЛИС
- Реклама
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: Семисегментный индикатор. Помогите с перекодировкой.
Код: Выделить всё
//
#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
- Встал на лапы
- Сообщения: 82
- Зарегистрирован: Пн май 03, 2010 02:19:08
- Откуда: Москва
- Контактная информация:
Re: Семисегментный индикатор. Помогите с перекодировкой.
Это перекодировка в семисегментные цифры.
А я спрашиваю:
"Как перекодировать двоичное число, выраженное 16-ю разрядами т. е. 2-мя байтами, в 5 отдельный байт, содержащие десяткитысяч, тысячи, сотни десятки и единицы."
16-ти разрядное число - это число от 0 до 65536 т. е. пять разрядов.
А 255 - 3 разряда т.е. 1 байт.
А я спрашиваю:
"Как перекодировать двоичное число, выраженное 16-ю разрядами т. е. 2-мя байтами, в 5 отдельный байт, содержащие десяткитысяч, тысячи, сотни десятки и единицы."
16-ти разрядное число - это число от 0 до 65536 т. е. пять разрядов.
А 255 - 3 разряда т.е. 1 байт.
Программист ПЛИС
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: Семисегментный индикатор. Помогите с перекодировкой.
понял - welcome
PS. .. если сложно - можно последовательно вычитать 10000,1000,100,10 сохраняя число вычетов n которое и подставить в table[n]
PS. .. если сложно - можно последовательно вычитать 10000,1000,100,10 сохраняя число вычетов n которое и подставить в table[n]
- ipiter
- Встал на лапы
- Сообщения: 82
- Зарегистрирован: Пн май 03, 2010 02:19:08
- Откуда: Москва
- Контактная информация:
Re: Семисегментный индикатор. Помогите с перекодировкой.
вычесть 100 и 10 ясно.ChipKiller писал(а):понял - welcome
PS. .. если сложно - можно последовательно вычитать 10000,1000,100,10 сохраняя число вычетов n которое и подставить в table[n]
Как из одного байта вычесть 1000 и 10000?
Объясните пожалуйста алгоритм.
Программист ПЛИС
- Реклама
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: Семисегментный индикатор. Помогите с перекодировкой.
из одного байта - никак. Вычитаете из двух байт (по очереди с учетом флага переноса)Как из одного байта вычесть 1000 и 10000?
- ipiter
- Встал на лапы
- Сообщения: 82
- Зарегистрирован: Пн май 03, 2010 02:19:08
- Откуда: Москва
- Контактная информация:
Re: Семисегментный индикатор. Помогите с перекодировкой.
Но ведь 1000 состоит тоже из двух байт. Это - 0000 0011 1110 1000ChipKiller писал(а):из одного байта - никак. Вычитаете из двух байт (по очереди с учетом флага переноса)Как из одного байта вычесть 1000 и 10000?
И 10000 тоже - 0010 0111 0001 0000
Программист ПЛИС
- ipiter
- Встал на лапы
- Сообщения: 82
- Зарегистрирован: Пн май 03, 2010 02:19:08
- Откуда: Москва
- Контактная информация:
Re: Семисегментный индикатор. Помогите с перекодировкой.
Я примера код преобразования одного байта.
Код: Выделить всё
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
- Вымогатель припоя
- Сообщения: 650
- Зарегистрирован: Пн июн 18, 2012 12:01:04
- Откуда: Челябинская область, Копейск
Re: Семисегментный индикатор. Помогите с перекодировкой.
Сначала вычитаете по 10000 до тех пор пока число не станет меньше 10000, затем вычитаете по 1000, затем по 100, затем по 10 и остаток единицы. Для первых двух используется двухбайтовое вычитание.
Re: Семисегментный индикатор. Помогите с перекодировкой.
Для ipiter, строка
никогда не выполнится.
Код: Выделить всё
bsf status,c ;Установить перенос- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: Семисегментный индикатор. Помогите с перекодировкой.
похоже ТС имеет весьма смутные представления о двоичной арифметике, так что лучше разобраться с основами http://progcode.narod.ru/stati/asm_stan ... tricks.pdf
PS. на последней странице есть пример многобайтного вычитания
PS. на последней странице есть пример многобайтного вычитания
- ipiter
- Встал на лапы
- Сообщения: 82
- Зарегистрирован: Пн май 03, 2010 02:19:08
- Откуда: Москва
- Контактная информация:
Re: Семисегментный индикатор. Помогите с перекодировкой.
Вот это то, что надо!ChipKiller писал(а):похоже ТС имеет весьма смутные представления о двоичной арифметике, так что лучше разобраться с основами http://progcode.narod.ru/stati/asm_stan ... tricks.pdf
PS. на последней странице есть пример многобайтного вычитания
Спасибо.
Программист ПЛИС
- ipiter
- Встал на лапы
- Сообщения: 82
- Зарегистрирован: Пн май 03, 2010 02:19:08
- Откуда: Москва
- Контактная информация:
Re: Семисегментный индикатор. Помогите с перекодировкой.
Посмотрите, в каком случае перенос устанавливается.korsaj писал(а):Для ipiter, строканикогда не выполнится.Код: Выделить всё
bsf status,c ;Установить перенос
Программист ПЛИС


