INT 21h

Домашняя страница самого страшного прерывания

Вывод информации на семисегментные индикаторы на примере 4-х индикаторов АЛ304Г

№ 2824 В разделах: Программирование Электроника от May 9th, 2011,

Сидите вы наверно сейчас и думаете о том, как же вывести цифры.

Вы слышали когда-нибудь про динамическую развертку? Сейчас услышите :) У нас 4 индикатора и все их подключить на наш МК не получится, т.к. просто не хватит ножек. Конечно, вы можете использовать сдвиговые регистры и прочее, но это немного усложнит устройство и сделает его минимум на 40 рублей дороже :) Для начала подключите ваши индикаторы по следующей схеме (не забудьте подключить дополнительные резисторы на все 8 ног данных! транзисторы тоже желательно применять, чтобы не нагружать МК):

Мы видим, что все линии данных индикаторов подключены параллельно к порту D, а ноги питания на 4 пина порта C. При таком подключении работать “правильно” может только 1 из 4. Конечно же, это вас не удовлетворит и вы захотите сделать на сдвиговых регистрах (к тому же и 4 ноги порта C сэкономите), но постойте! Если переключать ноги питания индикаторов очень быстро (МК это может делать хоть 1000 раз в секунду), то вы просто не заметите того факта, что горит только 1 из 4. Вам будет казаться, что горят все 4.

Теперь поговорим о генерации символов. В зависимости от подключения вашего индикатора к МК составьте таблицу знаков. У меня получилась такая:

unsigned char digits[]=
{
0b01001000, // 0
0b11101011, // 1
0b10001100, // ..
0b10001001,
0b00101011,
0b00011001,
0b00011000,
0b11001011, // ..
0b00001000, // 8
0b00001001, // 9
0b11111111  // не горит ничего
};

Как же теперь взять любую цифру и вывести ее на экран? Вы можете извращаться сколько хотите, но лучше всего сделать так:

void indicator_natural(int cifra) {
	//вывод обычного натурального числа (беззнаковое, целое)
	
	int C0=0, C1=0, C2=0, C3=0; //индексы для массива знаков
	
	while(cifra > 0) {
		//отнимаем тысячи
		if (cifra > 1000) {
			cifra = cifra - 1000;
			C0++;
		} else {
			//отнимаем сотни
			if (cifra > 100) {			
				cifra = cifra - 100;
				C1++;
			} else {			
				//отнимаем десятки
				if (cifra > 10) {
					cifra = cifra - 10;
					C2++;
				} else {
					//отнимаем единицы
					if (cifra > 0) {
						cifra = cifra - 1;
						C3++;
					} 
				}
			}
		}		
	}
	
	//если первая цифра 0, то не зажигаем ничего. последний 0 будет показываться!
	if (C0 == 0) { C0=11; }
	if ((C0 + C1) == 0)  { C0=C1=11; }
	if ((C0 + C1 + C2) == 0)  { C0=C1=C2=11; }

}

Для тех, кто не понял: например, у нас есть число 401 и всего 4 знака на индикаторе (тысячи, сотни, десятки и единицы). Вот мы и проверяем циклом и вычитанием сколько у нас сотен, десятков и т.д. Если число оказывается с каждым циклом больше определенного минимума, то переменные Cx инкрементируются. Cx это и есть индексы для того самого массива символов. Последние 3 условия чисто для красоты, чтобы нули не вылазили вперед числа. Если убрать эти условия, то на индикаторе получится 0401.

Теперь у нас есть все 4 индекса для вывода на индикатор. Осталось только менять данные на портах в цикле по следующему алгоритму:

  1. инициализировать пины портов для вывода данных
  2. цикл: пока не выполнится условие (тут ваше условие) {
  3. выключить 4й индикатор
  4. вывести 8 бит рисуемого символа на порт D
  5. включить 1й индикатор
  6. выключить 1й индикатор
  7. вывести 8 бит рисуемого символа на порт D
  8. включить 2й индикатор
  9. выключить 2й индикатор
  10. вывести 8 бит рисуемого символа на порт D
  11. включить 3й индикатор
  12. выключить 3й индикатор
  13. вывести 8 бит рисуемого символа на порт D
  14. включить 4й индикатор }

Таким способом можно подключать любые семисегментные индикаторы от одного, до целых паровозов из них.

Другой пример подключения от Романа Киселева.

Всего 1 комментарий »

1 комментарий »

Comment by Артем | July 7, 2012 @ 20:17:03

Красивый код! А главное быстрый по сравнению с умножением и остатком от деления для выделения разрядов.

Возьму себе на заметку!

Форма отправки комментария

CAPTCHA
*

Разрешенные HTML-теги:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

RSS RSS Feed только для этого поста |


Комментарии
  • Игорь: Все настроил, еще раз просмотрел видео и методом научного тыка все настроил и сохранил, все работает и обе...
  • 21h: Здравствуйте, Игорь! Я не знаю :) Думаю аналогично согласно инструкции к вашей радиостанции.
  • Игорь: Добрый день, просмотрел Ваше видео все доступно и ясно для 8 ми канальных радеек, но мне нада настроить 69...
  • Гоги: Есть инструкция к Моторолкам – она подходит к серии Motorola TLKR T4… Т8. В конце сетка частот и...
  • 21h: торчок давно уже не обновлял, как только закрыл сайт где он работал. да, это морда для opentracker. без...
  • Buter: Какова дальнейшая жизнь торчка? Он кстати веб-интерфейсом для OpenTracker выступает? Без OpenTracker работать...
  • 21h: понятия не имею. гуглите инструкцию к вашей радейке и сверяйтесь с ней.
  • Денис: хочу их подружить с uv5r
  • Денис: t-388 walkie talkie на эти шпаргалочек нет,или как приминить ваши к их настройке?
  • John: Стекла для электроник – техночас.ру