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

Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить
Аватара пользователя
ipiter
Встал на лапы
Сообщения: 82
Зарегистрирован: Пн май 03, 2010 02:19:08
Откуда: Москва
Контактная информация:

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

Сообщение ipiter »

Всем привет.
Устройство на PIC16F84A.
Программный счётчик выполняет 16-тиразрядный счёт и записывает результат в два байта ОЗУ.
Полученное значение надо показать на семисегментном, 4-хразрядном индикаторе.
Как преобразовать двубайтное число, больше 255, в четыре отдельных байта?
Чтобы потом перекодировать каждый из 4-х байт в код семисегментной цифры и показать на индикаторе поразрядно.
С уважением, Питер.
Программист ПЛИС
Реклама
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение 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
Реклама
Аватара пользователя
ipiter
Встал на лапы
Сообщения: 82
Зарегистрирован: Пн май 03, 2010 02:19:08
Откуда: Москва
Контактная информация:

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

Сообщение ipiter »

Это перекодировка в семисегментные цифры.
А я спрашиваю:
"Как перекодировать двоичное число, выраженное 16-ю разрядами т. е. 2-мя байтами, в 5 отдельный байт, содержащие десяткитысяч, тысячи, сотни десятки и единицы."
16-ти разрядное число - это число от 0 до 65536 т. е. пять разрядов.
А 255 - 3 разряда т.е. 1 байт.
Программист ПЛИС
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

понял - welcome

PS. .. если сложно - можно последовательно вычитать 10000,1000,100,10 сохраняя число вычетов n которое и подставить в table[n]
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ipiter
Встал на лапы
Сообщения: 82
Зарегистрирован: Пн май 03, 2010 02:19:08
Откуда: Москва
Контактная информация:

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

Сообщение ipiter »

ChipKiller писал(а):понял - welcome

PS. .. если сложно - можно последовательно вычитать 10000,1000,100,10 сохраняя число вычетов n которое и подставить в table[n]
вычесть 100 и 10 ясно.
Как из одного байта вычесть 1000 и 10000?
Объясните пожалуйста алгоритм.
Программист ПЛИС
Реклама
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

Как из одного байта вычесть 1000 и 10000?
из одного байта - никак. Вычитаете из двух байт (по очереди с учетом флага переноса)
Реклама
Аватара пользователя
ipiter
Встал на лапы
Сообщения: 82
Зарегистрирован: Пн май 03, 2010 02:19:08
Откуда: Москва
Контактная информация:

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

Сообщение ipiter »

ChipKiller писал(а):
Как из одного байта вычесть 1000 и 10000?
из одного байта - никак. Вычитаете из двух байт (по очереди с учетом флага переноса)
Но ведь 1000 состоит тоже из двух байт. Это - 0000 0011 1110 1000
И 10000 тоже - 0010 0111 0001 0000
Программист ПЛИС
Аватара пользователя
ipiter
Встал на лапы
Сообщения: 82
Зарегистрирован: Пн май 03, 2010 02:19:08
Откуда: Москва
Контактная информация:

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

Сообщение 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
Последний раз редактировалось ipiter Ср май 15, 2013 15:33:30, всего редактировалось 2 раза.
Программист ПЛИС
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

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

Сообщение zero648 »

Сначала вычитаете по 10000 до тех пор пока число не станет меньше 10000, затем вычитаете по 1000, затем по 100, затем по 10 и остаток единицы. Для первых двух используется двухбайтовое вычитание.
Аватара пользователя
korsaj
Потрогал лапой паяльник
Сообщения: 330
Зарегистрирован: Чт июн 23, 2011 07:55:51

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

Сообщение korsaj »

Для ipiter, строка

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

bsf   status,c   ;Установить перенос
никогда не выполнится.
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

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

PS. на последней странице есть пример многобайтного вычитания
Аватара пользователя
ipiter
Встал на лапы
Сообщения: 82
Зарегистрирован: Пн май 03, 2010 02:19:08
Откуда: Москва
Контактная информация:

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

Сообщение ipiter »

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

PS. на последней странице есть пример многобайтного вычитания
Вот это то, что надо!
Спасибо.
Программист ПЛИС
Аватара пользователя
ipiter
Встал на лапы
Сообщения: 82
Зарегистрирован: Пн май 03, 2010 02:19:08
Откуда: Москва
Контактная информация:

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

Сообщение ipiter »

korsaj писал(а):Для ipiter, строка

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

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

Вернуться в «PIC»