Это массив для перевода шестнадцатеричного 4-х битного числа в код для вывода на семисегментный индикатор типа A-361X:
Код:
|
__flash const unsigned char LED_decode[16]= // Массив перекодировки данных для семисегментного индикатора
{
0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,
0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e
}; |
Данный массив рассчитан на подключение катода сегмента к выходу порта, на который выводится код, а общего анода всех сегментов к управлящему ключу, который включает и выключает данный индикатор (разряд выводимого числа). Т.е. включенному состоянию сегмента соответствует 0 на выходе порта. Если влючение производится наоборот, т.е. активным является состояние 1, то эти данные необходимо проинвертировать.
Расположение выводов и сегментов индикатора, а так же их соответствие, приведено на прилагаемом рисунке.
Далее приведён кусок кода на С для поразрядного перевода числа в двоично-десятичный вид:
Код:
|
switch (sign_counter)
{
case 0:
port=LED_decode[Data -Data/10*10];
break;
case 1:
port=LED_decode[Data/10 -Data/100*10];
break;
case 2:
port=LED_decode[Data/100 -Data/1000*10];
break;
case 3:
port=LED_decode[Data/1000-Data/10000*10];
break;
} |
Номер разряда, выводимого в данный момент в порт, подключенный к индикатору, хранится в переменной
sign_counter. Самый младший разряд имеет значение 0. Содержимое
port выводится после преобразования на индикатор.
В данном куске программы используется особенность транслятора С, который результат деления двух целых чисел округляет до меньшего целого, т.е. отбрасывает дробную часть. Поэтому результат операции
5/2*2 будет не 5, а 4.
Данную функцию можно, конечно, реализовать и на асме. Общий вид функции при этом будет следующим:
port=LED_decode[Data/10**sign_counter-int(Data/10**(sign_counter+1))*10],
где ** - возведение в степень.
-- Прилагается рисунок: --