Страница 1 из 1
Семисегментный индикатор. Помогите с перекодировкой.
Добавлено: Вт май 14, 2013 18:50:19
ipiter
Всем привет.
Устройство на PIC16F84A.
Программный счётчик выполняет 16-тиразрядный счёт и записывает результат в два байта ОЗУ.
Полученное значение надо показать на семисегментном, 4-хразрядном индикаторе.
Как преобразовать двубайтное число, больше 255, в четыре отдельных байта?
Чтобы потом перекодировать каждый из 4-х байт в код семисегментной цифры и показать на индикаторе поразрядно.
С уважением, Питер.
Re: Семисегментный индикатор. Помогите с перекодировкой.
Добавлено: Вт май 14, 2013 18:58:13
ChipKiller
Код: Выделить всё
//
#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
Re: Семисегментный индикатор. Помогите с перекодировкой.
Добавлено: Вт май 14, 2013 19:13:38
ipiter
Это перекодировка в семисегментные цифры.
А я спрашиваю:
"Как перекодировать двоичное число, выраженное 16-ю разрядами т. е. 2-мя байтами, в 5 отдельный байт, содержащие десяткитысяч, тысячи, сотни десятки и единицы."
16-ти разрядное число - это число от 0 до 65536 т. е. пять разрядов.
А 255 - 3 разряда т.е. 1 байт.
Re: Семисегментный индикатор. Помогите с перекодировкой.
Добавлено: Вт май 14, 2013 19:19:15
ChipKiller
понял -
welcome
PS. .. если сложно - можно последовательно вычитать 10000,1000,100,10 сохраняя число вычетов
n которое и подставить в
table[n]
Re: Семисегментный индикатор. Помогите с перекодировкой.
Добавлено: Вт май 14, 2013 19:26:14
ipiter
ChipKiller писал(а):понял -
welcome
PS. .. если сложно - можно последовательно вычитать 10000,1000,100,10 сохраняя число вычетов
n которое и подставить в
table[n]
вычесть 100 и 10 ясно.
Как из одного байта вычесть 1000 и 10000?
Объясните пожалуйста алгоритм.
Re: Семисегментный индикатор. Помогите с перекодировкой.
Добавлено: Вт май 14, 2013 19:30:17
ChipKiller
Как из одного байта вычесть 1000 и 10000?
из одного байта - никак. Вычитаете из двух байт (по очереди с учетом флага переноса)
Re: Семисегментный индикатор. Помогите с перекодировкой.
Добавлено: Вт май 14, 2013 19:41:38
ipiter
ChipKiller писал(а):Как из одного байта вычесть 1000 и 10000?
из одного байта - никак. Вычитаете из двух байт (по очереди с учетом флага переноса)
Но ведь 1000 состоит тоже из двух байт. Это - 0000 0011 1110 1000
И 10000 тоже - 0010 0111 0001 0000
Re: Семисегментный индикатор. Помогите с перекодировкой.
Добавлено: Вт май 14, 2013 19:44:59
ipiter
Я примера код преобразования одного байта.
Код: Выделить всё
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
Re: Семисегментный индикатор. Помогите с перекодировкой.
Добавлено: Ср май 15, 2013 06:09:30
zero648
Сначала вычитаете по 10000 до тех пор пока число не станет меньше 10000, затем вычитаете по 1000, затем по 100, затем по 10 и остаток единицы. Для первых двух используется двухбайтовое вычитание.
Re: Семисегментный индикатор. Помогите с перекодировкой.
Добавлено: Ср май 15, 2013 06:39:17
korsaj
Для
ipiter, строка
никогда не выполнится.
Re: Семисегментный индикатор. Помогите с перекодировкой.
Добавлено: Ср май 15, 2013 07:07:25
ChipKiller
похоже ТС имеет весьма смутные представления о двоичной арифметике, так что лучше разобраться с основами
http://progcode.narod.ru/stati/asm_stan ... tricks.pdf
PS. на последней странице есть пример многобайтного вычитания
Re: Семисегментный индикатор. Помогите с перекодировкой.
Добавлено: Ср май 15, 2013 15:27:11
ipiter
Вот это то, что надо!
Спасибо.
Re: Семисегментный индикатор. Помогите с перекодировкой.
Добавлено: Ср май 15, 2013 15:29:09
ipiter
korsaj писал(а):Для
ipiter, строка
никогда не выполнится.
Посмотрите, в каком случае перенос устанавливается.