Страница 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, строка

Код: Выделить всё

bsf   status,c   ;Установить перенос
никогда не выполнится.

Re: Семисегментный индикатор. Помогите с перекодировкой.

Добавлено: Ср май 15, 2013 07:07:25
ChipKiller
похоже ТС имеет весьма смутные представления о двоичной арифметике, так что лучше разобраться с основами http://progcode.narod.ru/stati/asm_stan ... tricks.pdf

PS. на последней странице есть пример многобайтного вычитания

Re: Семисегментный индикатор. Помогите с перекодировкой.

Добавлено: Ср май 15, 2013 15:27:11
ipiter
ChipKiller писал(а):похоже ТС имеет весьма смутные представления о двоичной арифметике, так что лучше разобраться с основами http://progcode.narod.ru/stati/asm_stan ... tricks.pdf

PS. на последней странице есть пример многобайтного вычитания
Вот это то, что надо!
Спасибо.

Re: Семисегментный индикатор. Помогите с перекодировкой.

Добавлено: Ср май 15, 2013 15:29:09
ipiter
korsaj писал(а):Для ipiter, строка

Код: Выделить всё

bsf   status,c   ;Установить перенос
никогда не выполнится.
Посмотрите, в каком случае перенос устанавливается.