Как разложить по разрядам, програмно (Си).
- tych
- Э...
- Сообщения: 2792
- Зарегистрирован: Ср апр 04, 2007 08:39:14
- Откуда: Москва
- Контактная информация:
Так умножить на 0.1 или поделить на 10 - АРИФМЕТИКА школьная !
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
- tych
- Э...
- Сообщения: 2792
- Зарегистрирован: Ср апр 04, 2007 08:39:14
- Откуда: Москва
- Контактная информация:
Дак используйте числа с точкой. Этож Си а не АСМ.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
AAAA
НУ всеравно не получается разложить на биты
us это ADCW
массив db[16] глобальный
void d_bit(unsigned int us)
{
for (n=0;n<15;n=n+1){
db[n]=us&1;
us>>=1;
};
А потом нарисовать на экране
}
void set_vol (unsigned char yd )
{
unsigned char x,w,d;
for (x=0;x<15;x=x+1){
d=db[x];
if (!d) {
w = 0x0F;
};
w = 0x03;
DC = 0;
spi(64+yd);
spi(128+x);
DC = 1;
spi(w);
};
}
И такие выражения - wr_symb_LCD(dg,1,dgx,30); и dg=digits[n];
ТОже ни к чему не приводят!
Если вместо dg или dgx пишу 1 или 21, да хоть 5. То всё нормально!
А вот так-
dgx=1;
for (n=0;n<5;n=n+1)
{
dg=digits[n];
wr_symb_LCD(dg,1,dgx,30); // символ, инверсия,x,y
dgx++;
};
Нифига.
В wr_symb-LCD тоже свой массив...
us это ADCW
массив db[16] глобальный
void d_bit(unsigned int us)
{
for (n=0;n<15;n=n+1){
db[n]=us&1;
us>>=1;
};
А потом нарисовать на экране
}
void set_vol (unsigned char yd )
{
unsigned char x,w,d;
for (x=0;x<15;x=x+1){
d=db[x];
if (!d) {
w = 0x0F;
};
w = 0x03;
DC = 0;
spi(64+yd);
spi(128+x);
DC = 1;
spi(w);
};
}
И такие выражения - wr_symb_LCD(dg,1,dgx,30); и dg=digits[n];
ТОже ни к чему не приводят!
Если вместо dg или dgx пишу 1 или 21, да хоть 5. То всё нормально!
А вот так-
dgx=1;
for (n=0;n<5;n=n+1)
{
dg=digits[n];
wr_symb_LCD(dg,1,dgx,30); // символ, инверсия,x,y
dgx++;
};
Нифига.
В wr_symb-LCD тоже свой массив...
Последний раз редактировалось MetEl Ср ноя 21, 2007 10:31:32, всего редактировалось 4 раза.
- tych
- Э...
- Сообщения: 2792
- Зарегистрирован: Ср апр 04, 2007 08:39:14
- Откуда: Москва
- Контактная информация:
ТЫ в переменные выводимые запиши числа и убедись что вывод происходит правильно.
Затем ужет отлаишь часть проги создающей эти числа будучи уверенным в выводе.
Затем ужет отлаишь часть проги создающей эти числа будучи уверенным в выводе.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Мы победим! (наверное...)
да, не ассемблер.
for (x=0;x<10;x++){
t=(db[x]&1);
if (t==0){
spi(0x03);
} // не поставил точку с запятой
else {
spi(0x0F);
} // сдесь тожы
};
Определил что if не функионирует (а я думал, что задаю условия не правильно. Ан нет, не в этом дело)
Расширил возможности операции (if) добавил else и тогда компилятор нечал ругатся.
Типа невозможно - if-а нет!
А остальное - глобальные переменные пересмотрел и с утра оно понятней.
Гулять на свежем воздухе нада!
for (x=0;x<10;x++){
t=(db[x]&1);
if (t==0){
spi(0x03);
} // не поставил точку с запятой
else {
spi(0x0F);
} // сдесь тожы
};
Определил что if не функионирует (а я думал, что задаю условия не правильно. Ан нет, не в этом дело)
Расширил возможности операции (if) добавил else и тогда компилятор нечал ругатся.
Типа невозможно - if-а нет!
А остальное - глобальные переменные пересмотрел и с утра оно понятней.
Гулять на свежем воздухе нада!
ДОРОГАЯ РЕДАКЦИЯ
а я гдето читал , ято её ножно всегда ставить...
А что она значит и зачем ни читал..
(к кпримеру символ перевода каретки, как в текст проц.Word)
А что она значит и зачем ни читал..
(к кпримеру символ перевода каретки, как в текст проц.Word)
- MOHOXPOM
- Встал на лапы
- Сообщения: 108
- Зарегистрирован: Вт мар 18, 2008 08:25:31
- Откуда: Красноярск
- Контактная информация:
Может я не в тему, но я немного не понимаю, а зачем на биты раскладывать? Если на вывод на экран надо то есть простая цепочка:
1) Получить результат ADC
2) Воспользоваться формулой из даташа по переводу в милливольты.
3) Домножить результат до нужной запятой (*1000 = вольты)
4) Разложить на «до запятой» и «после запятой»
5) Через sprintf занести сформированную строку в массив и вывести как строку
возможно этот кусок поможет:
char BufferADC[6]; //хранение значения ADC
unsigned int ADC_H, ADC_L, ADC_T;
SIGNAL(SIG_ADC){
while (ADCSRA & _BV(ADSC)) {}
ADC_T = ((double)ADCW*5/1024)*1000;
ADC_H = ADC_T/1000;
ADC_L = ADC_T-ADC_H*1000;
sprintf(BufferADC,"%d,%03dV", ADC_H, ADC_L);
}
1) Получить результат ADC
2) Воспользоваться формулой из даташа по переводу в милливольты.
3) Домножить результат до нужной запятой (*1000 = вольты)
4) Разложить на «до запятой» и «после запятой»
5) Через sprintf занести сформированную строку в массив и вывести как строку
возможно этот кусок поможет:
char BufferADC[6]; //хранение значения ADC
unsigned int ADC_H, ADC_L, ADC_T;
SIGNAL(SIG_ADC){
while (ADCSRA & _BV(ADSC)) {}
ADC_T = ((double)ADCW*5/1024)*1000;
ADC_H = ADC_T/1000;
ADC_L = ADC_T-ADC_H*1000;
sprintf(BufferADC,"%d,%03dV", ADC_H, ADC_L);
}
Как зачем мне голова?! Я ей ем!!!
-
clawham
- Поставщик валерьянки для Кота
- Сообщения: 1957
- Зарегистрирован: Пт окт 31, 2008 09:38:55
- Откуда: Одесса
- Контактная информация:
ладно ставлю конкретную задачу
Есть переменная data = 0b10100101
теперь далее есть две переменных
port_lcd_tact_lo
port_lcd_tact_hi
в них есть некоторые состояния порта в котором один бит поменян(тот который соответствует выводу к которому подключен тактовый вход
примерно вот так
#define SCE 0b00000001
#define D_C 0b00000010
#define SDIN 0b00000100
#define SCLK 0b00001000
#define RES 0b00010000
следовательно
port_lcd_tact_lo = RES|D_C; // это состояние порта для возможности приём с тактом в нуле
port_lcd_tact_hi = RES|SCLK|D_C; // это то же самое состояние но с высоким тактом
нужно теперь выводить в порт д port_lcd_tact_lo если последний бит в данных = 0 или port_lcd_tact_lo|SDIN если старший бит = 1 потом то же самое но с переменной port_lcd_tact_hi
потом port_lcd_tact_lo если 7-й бит в переменной data = 0 и port_lcd_tact_hi|SDIN если 7-й бит в data = 1 и так далее до конца всех битов в data - 8 штук
Есть переменная data = 0b10100101
теперь далее есть две переменных
port_lcd_tact_lo
port_lcd_tact_hi
в них есть некоторые состояния порта в котором один бит поменян(тот который соответствует выводу к которому подключен тактовый вход
примерно вот так
#define SCE 0b00000001
#define D_C 0b00000010
#define SDIN 0b00000100
#define SCLK 0b00001000
#define RES 0b00010000
следовательно
port_lcd_tact_lo = RES|D_C; // это состояние порта для возможности приём с тактом в нуле
port_lcd_tact_hi = RES|SCLK|D_C; // это то же самое состояние но с высоким тактом
нужно теперь выводить в порт д port_lcd_tact_lo если последний бит в данных = 0 или port_lcd_tact_lo|SDIN если старший бит = 1 потом то же самое но с переменной port_lcd_tact_hi
потом port_lcd_tact_lo если 7-й бит в переменной data = 0 и port_lcd_tact_hi|SDIN если 7-й бит в data = 1 и так далее до конца всех битов в data - 8 штук
- BCluster
- Собутыльник Кота
- Сообщения: 2512
- Зарегистрирован: Пн апр 06, 2009 19:33:29
- Откуда: Молдова, Кишинев
- Контактная информация:
Alexonus писал(а):Есть такая проблемка. Надо вывести цифры на дисплей 7-и сегментный. Но выход на дисплей в особенной кодировке. Пример: 1=0xCO; Числа могут быть больше десятка. Как разбить integer и присвоить цифрам мой код?
Разбивают числа вот так например:
Код: Выделить всё
int input; //ваше число - допустим 0xC7
int out_l, out_r; //результат - C и 7
out_l=input>>4;
out_r=input&0x0F;
Хотя я не совсем понял зачем вам это нужно, вам нужно просто назначить чтобы, например при 0xC7 выводилась "1" на дисплей? Так? Все правильно? Тогда вообще непонятно в чем проблема.
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Для вывода на 7-ми сегментные индикаторы обычно используют таблицы перекодировки.
1. создается таблица кода для отображения в зависимости от подключения к mcu.
2. указатель устанавливается на начало таблицы
3. к указателю добавляется ваше число
4. по значению указателя из таблицы извлекается код и отправляется на индикатор.
все!
зы: числа больше десятка надо привести к BCD виду, разделить на тетрады и пользоваться, хотя... если надо отображать не только цифры 0..9, в общем надо смотреть в контексте конкретной задачи
1. создается таблица кода для отображения в зависимости от подключения к mcu.
2. указатель устанавливается на начало таблицы
3. к указателю добавляется ваше число
4. по значению указателя из таблицы извлекается код и отправляется на индикатор.
все!
зы: числа больше десятка надо привести к BCD виду, разделить на тетрады и пользоваться, хотя... если надо отображать не только цифры 0..9, в общем надо смотреть в контексте конкретной задачи
-
Alexonus
- Родился
- Сообщения: 13
- Зарегистрирован: Ср апр 29, 2009 10:10:42
- Откуда: Киев
- Контактная информация:
В программе были расчеты и в переменную X (Integer) записано число. Мне надо вывести эти числа на 7-ый индикатор. Кодировка вывода нестандартная 1=С2... 2=A2.... как то так. Я вот думаю разбить число на десятые сотые и тд и через сравнение выводить мой код. Есть ли более простое решение? Просто в контроллере Атмега8 из за занятых битов приходится извращатся с выводом данных ^_^
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
что то вы мудрите.
если у вас есть число, которое нужно вывести в переменной, то поступаете так.
в памяти программ записываете с какого то "начального адреса" такую последовательность :х0,х1,х2,х3,х4,х5,х6,х7,х8,х9. где х0 - код цифры ноль на индикаторе, х1-код цифры 1, х2-код цифры 2, х3-код цифры 3.... и т.д.
далее
берете макс число, которое может быть в переменной(например если 16 битное число то макс = 65535, для примера возьмем число 34567) берем оттуда число 10000 (десять тысяч)
и вычитаем несколько раз из нашего исходного числа до тех пор пока результат не станет отрицательным и считаем это количество раз(в нашем примере получим 3), прибавляем к 3 "начальный адрес" - получаем адрес при обращении по которому мы получим код цифры "3", куда нибудь его запоминаем(в какой нить буфер вашего индикатора). потом к переменной прибавляем 10000 один раз, чтобы компенсировать последнее вычитание. в итоге в нашем случае в переменной получим 4567.
далее вычитаем таким же образом 1000, 100, 10 и получаем соответствующие коды цифр. далее выводим из буфера все что мы запомнили на ваш дисплей(семисегментник).
ЗЫ вычитать 1 не нужно. число и так будет храниться в переменной после вычитания 10.
вот как то так. переваривайте пожалуйста.
если у вас есть число, которое нужно вывести в переменной, то поступаете так.
в памяти программ записываете с какого то "начального адреса" такую последовательность :х0,х1,х2,х3,х4,х5,х6,х7,х8,х9. где х0 - код цифры ноль на индикаторе, х1-код цифры 1, х2-код цифры 2, х3-код цифры 3.... и т.д.
далее
берете макс число, которое может быть в переменной(например если 16 битное число то макс = 65535, для примера возьмем число 34567) берем оттуда число 10000 (десять тысяч)
и вычитаем несколько раз из нашего исходного числа до тех пор пока результат не станет отрицательным и считаем это количество раз(в нашем примере получим 3), прибавляем к 3 "начальный адрес" - получаем адрес при обращении по которому мы получим код цифры "3", куда нибудь его запоминаем(в какой нить буфер вашего индикатора). потом к переменной прибавляем 10000 один раз, чтобы компенсировать последнее вычитание. в итоге в нашем случае в переменной получим 4567.
далее вычитаем таким же образом 1000, 100, 10 и получаем соответствующие коды цифр. далее выводим из буфера все что мы запомнили на ваш дисплей(семисегментник).
ЗЫ вычитать 1 не нужно. число и так будет храниться в переменной после вычитания 10.
вот как то так. переваривайте пожалуйста.
- adrenocrome
- Потрогал лапой паяльник
- Сообщения: 365
- Зарегистрирован: Вт окт 21, 2008 15:03:06
- Откуда: moscow
- Контактная информация:
А я сделал в своих часах так
Это для двух сегментов.
соответственно char_table - это массив,в котором каждая цифра перекодирована для семисегментника.
POS1 и POS2 - это первый и второй элементы индикатора.
Это для двух сегментов.
Код: Выделить всё
POS1=char_table[h/10];
POS2=char_table[h%10];
соответственно char_table - это массив,в котором каждая цифра перекодирована для семисегментника.
POS1 и POS2 - это первый и второй элементы индикатора.
