Страница 4 из 4

Добавлено: Вт май 05, 2009 21:02:24
BCluster

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

POS1=char_table[h/10];
POS2=char_table[h%10];
Тоже работает, только медленнее. Деление поганая операция ) Советую использовать бинарную арифметику везде где возможно.

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

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

Добавлено: Пн май 11, 2009 15:32:39
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?

Здесь уже сам разобрался!

Добавлено: Пн май 11, 2009 15:40:23
vitalik
Passer писал(а):Прошу прощения за оффтоп(хотя немного по теме)
С месяц назад мне попадалась статья-обучалка в которой описывалось как создать вольтметр и вывести результат на лсд...там(точно конечно уже не скажу) код вывода не превышал трёх-четырёх строк(т.е. код без визарда CV) строк. Ткните пожалуйста в эту статью...найти не могу. :(
Журналы Радиоаматор 9\2005 год. Цикл статей Сергея Рюмика.

WinAVR+VMLab.

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

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

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

Добавлено: Ср май 13, 2009 17:38:44
__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 бит, более никак не поместится.

Добавлено: Ср май 13, 2009 17:44:16
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 бит .

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