Как разложить по разрядам, програмно (Си).

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Сообщение BCluster »

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

POS1=char_table[h/10];
POS2=char_table[h%10];

Тоже работает, только медленнее. Деление поганая операция ) Советую использовать бинарную арифметику везде где возможно.
Passer
Родился
Сообщения: 17
Зарегистрирован: Вт мар 31, 2009 19:03:17

Сообщение Passer »

Прошу прощения за оффтоп(хотя немного по теме)
С месяц назад мне попадалась статья-обучалка в которой описывалось как создать вольтметр и вывести результат на лсд...там(точно конечно уже не скажу) код вывода не превышал трёх-четырёх строк(т.е. код без визарда CV) строк. Ткните пожалуйста в эту статью...найти не могу. :(
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

ребяты, на моем сайте в разделе для начинающих (пробуем программировать) имеется статья о том, как организовать вывод чисел на 7-сегментные дисплеи. статья теоретическая, с заготовками кода на Си - читайте, и вам станет понятно, как выводить любые числа в любой системе счисления (хоть двоичной, хоть девятеричной).
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
vitalik
Родился
Сообщения: 14
Зарегистрирован: Вс апр 26, 2009 20:58:55
Откуда: г.Монте Карло

Сообщение vitalik »

Порадуйте советом для WinAVR
Нужно каждый бит байта вывести на соответствующее место ЖКИ.
while (1)
{cn=PINB;
lcd_com(0x80);
lcd_dat(cn&0b00001000+0x30);
lcd_dat(cn&0b00000100+0x30);
lcd_dat(cn&0b00000010+0x30);
lcd_dat(cn&0b00000001+0x30);
_delay_ms(250);

}

если бит=0 выводит на ЖКИ 0, а если бит=1 на ЖКИ выводит или 8,4,2,1?

Здесь уже сам разобрался!
Последний раз редактировалось vitalik Ср май 13, 2009 06:27:54, всего редактировалось 1 раз.
Аватара пользователя
vitalik
Родился
Сообщения: 14
Зарегистрирован: Вс апр 26, 2009 20:58:55
Откуда: г.Монте Карло

Сообщение vitalik »

Passer писал(а):Прошу прощения за оффтоп(хотя немного по теме)
С месяц назад мне попадалась статья-обучалка в которой описывалось как создать вольтметр и вывести результат на лсд...там(точно конечно уже не скажу) код вывода не превышал трёх-четырёх строк(т.е. код без визарда CV) строк. Ткните пожалуйста в эту статью...найти не могу. :(


Журналы Радиоаматор 9\2005 год. Цикл статей Сергея Рюмика.

WinAVR+VMLab.
Вложения
Avr81 Вольтметр на ЖКИ.zip
(52.49 КБ) 196 скачиваний
Аватара пользователя
Man
Встал на лапы
Сообщения: 83
Зарегистрирован: Чт ноя 13, 2008 19:22:03

Сообщение Man »

Понадобилось разложить 4 байта входных данных в функцию по 1 байту для дальнейшей обработки , тоесть чтобы из 0xFF4A573C получилось 4 переменных unsigned char (FF),(4A),(57),(3C).

Использоватся будет тут
unsigned char eeprom_read(unsigned long int address)
{
unsigned char data;
(а тут сама функция работы с памятью)
return data;
}

Сейчас читал про наложение маски неочень понятно как это делать , приведите примерчик как разложить.
Аватара пользователя
__Alexander
Потрогал лапой паяльник
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Сообщение __Alexander »

Man писал(а):Понадобилось разложить 4 байта входных данных в функцию по 1 байту для дальнейшей обработки , тоесть чтобы из 0xFF4A573C получилось 4 переменных unsigned char (FF),(4A),(57),(3C).

Сейчас читал про наложение маски неочень понятно как это делать , приведите примерчик как разложить.


Тут маска не обязательна. Можно типа так.

unsigned long X=0xFF4A573C;
char data1 = X >> 24; // тут будет FF
char data2 = X >> 16; // тут будет 4A
char data3 = X >> 8; // тут будет 57
char data4 = X; // тут будет 3C

тип char это 8 бит, более никак не поместится.
Аватара пользователя
Man
Встал на лапы
Сообщения: 83
Зарегистрирован: Чт ноя 13, 2008 19:22:03

Сообщение Man »

Более менее разобрался с маской написал функцию:

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

unsigned char eeprom_read(unsigned long int address) 
{
unsigned char data;                                   //переменная для прочитаных данных
unsigned char i1;                                     //
unsigned char i2;                                     //
unsigned char i3;                                     //
i1=address&0b00000000000000000000000011111111;        //налаживаем маску 0x000000FF
i2=address&0b00000000000000001111111100000000;        //налаживаем маску 0x0000FF00
i3=address&0b00000000111111110000000000000000;        //налаживаем маску 0x00FF0000
PORTD=0xFF;                                           
DDRD=0xFF;                                            //Порт на вывод

PORTD=i1;                                             //Пишем адрес.
PORTF.0=1;                                            // A0-A7
delay_ms(1);                                          // .
PORTF.0=0;                                            // .
                                                      // .
PORTD=i2;                                             // A8-A15
PORTF.1=1;                                            // .
delay_ms(1);                                          // .
PORTF.1=0;                                            // .
                                                      // .
PORTD=i3;                                             // A16-X
PORTF.2=1;                                            // . 
delay_ms(1);                                          // .
PORTF.2=0;                                            // .

PORTD=0xFF;                                         
DDRD=0x00;                                            //Порт на ввод

PORTF.3=1;                                            //Читаем
delay_ms(1);                                           
data=PIND;
PORTF.3=0;

return data;                                          //Возрашаем прочитаное
}


Незнаю прально или нет , мне кажется надо сдвигать полученое значение на 8 бит и потом на 16 бит .

За пример спасибо сейчас переделаю :))
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»