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

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
MetEl
Вымогатель припоя
Сообщения: 543
Зарегистрирован: Чт окт 18, 2007 16:45:30
Откуда: из Питера

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

Сообщение MetEl »

Проще говоря,
Получаю с АЦП число.
Мне нада его вывести на LCD.
Таблица кодов есть, как проще (быстрее)
Разложить на сотые, десятые... чтоб подставить под таблику кодов и вывести на дисплей.
Какбы форами и ифами, довольно долго.
Нет ли какогонибыдь оператора или функции(пример) похожая на результат маски для битов?


Спасибо.
Аватара пользователя
tych
Э...
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва
Контактная информация:

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

Сообщение tych »

MetEl писал(а):Мне нада его вывести на LCD.

Разложить на сотые, десятые... чтоб подставить под таблику кодов и вывести на дисплей.


Посмотри Вывод на LCD
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
MetEl
Вымогатель припоя
Сообщения: 543
Зарегистрирован: Чт окт 18, 2007 16:45:30
Откуда: из Питера

Сообщение MetEl »

Ты когданибудь спишь вооще?!

Спасибо ...
Я вспомнил getchar и putchar.

Но LCD от nokia 3410, и таблица кодов самодельная. И "драйвер" тоже.
У меня есть число (пусть - байт) какбы мне его так разложить на сотые, десятые и единицы, чтоб подготовить к последовательному (по разрядному) подставлению с моей таблицей символов.

т.е:
если это число 5 = массив 10
если это число 23 = ???

Как мне "десятый" разряд убрать? (понятно, что делишь пока флаг отрицательный не вылезет, но может чтото есть по проще)
Аватара пользователя
tych
Э...
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва
Контактная информация:

Сообщение tych »

MetEl писал(а):Ты когданибудь спишь вооще?!


Вот заснул :lol: поэтому не отвечу :lol:
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
L29Ah
Прорезались зубы
Сообщения: 225
Зарегистрирован: Пн июл 23, 2007 03:10:34
Откуда: СПб
Контактная информация:

Сообщение L29Ah »

MetEl писал(а):Ты когданибудь спишь вооще?!

Спасибо ...
Я вспомнил getchar и putchar.

Но LCD от nokia 3410, и таблица кодов самодельная. И "драйвер" тоже.
У меня есть число (пусть - байт) какбы мне его так разложить на сотые, десятые и единицы, чтоб подготовить к последовательному (по разрядному) подставлению с моей таблицей символов.

т.е:
если это число 5 = массив 10
если это число 23 = ???

Как мне "десятый" разряд убрать? (понятно, что делишь пока флаг отрицательный не вылезет, но может чтото есть по проще)

Есть в С такая мегаоперация - называется "%". Вместе с "/" получается аццкий тандем ;)
Ꙑ!
MetEl
Вымогатель припоя
Сообщения: 543
Зарегистрирован: Чт окт 18, 2007 16:45:30
Откуда: из Питера

Сообщение MetEl »

Спасибо что ответили.. это называется.
Яж ни чё не понял.
Щаз поискам нашёл что % оставляют только остаток.
Типа 49%10=9, 23%5=3
Так пол дня искал...

Как usindger char на два байта разломить! (типа int)
Вот новый вопрос?
Аватара пользователя
Mozart
Мучитель микросхем
Сообщения: 413
Зарегистрирован: Пт мар 10, 2006 12:23:05
Откуда: Moscow
Контактная информация:

Сообщение Mozart »

Как usindger char на два байта разломить! (типа int)
Вот новый вопрос?

это сложный вопрос если чар это уже байт... а инт это два байта...

оч просто... делаете указатель на байт... и присваиваете нач адрес инт... при увеличении указателя на 1 получаете второй байт...
если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
MetEl
Вымогатель припоя
Сообщения: 543
Зарегистрирован: Чт окт 18, 2007 16:45:30
Откуда: из Питера

Сообщение MetEl »

чето я может попутал..

но unsigned char это же два байта (65535).
А int это один вайт (255).
Может чето поменялось, но оно так работает сайчас... и не ругается?
Аватара пользователя
tych
Э...
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва
Контактная информация:

Сообщение tych »

MetEl писал(а):Типа 49%10=9, 23%5=3
Так пол дня искал...
Как usindger char на два байта разломить! (типа int)
Вот новый вопрос?


старший байт int будет 0 а младший будет твой исходный char

Посмотри наиболе часто используемые типы данных
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Аватара пользователя
Mozart
Мучитель микросхем
Сообщения: 413
Зарегистрирован: Пт мар 10, 2006 12:23:05
Откуда: Moscow
Контактная информация:

Сообщение Mozart »

чето я может попутал..

но unsigned char это же два байта (65535).
А int это один вайт (255).
Может чето поменялось, но оно так работает сайчас... и не ругается?

эээ...ммм... никогда такого не было... читайте книги тогда... что-то у вас бардак какой-то в голове...
если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
Аватара пользователя
Mozart
Мучитель микросхем
Сообщения: 413
Зарегистрирован: Пт мар 10, 2006 12:23:05
Откуда: Moscow
Контактная информация:

Сообщение Mozart »

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

int dataInt;
char *ptrChar;
char little, big;
void main()
{   
   dataInt = 0xffcc;
   ptrChar = &dataInt;
   little = *ptrChar;
   big = *++ptrChar;
}

вот код... в Борланд С++ необходимо выполнять приведение типов... а винавр и так проглотил... глупый...
если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
MetEl
Вымогатель припоя
Сообщения: 543
Зарегистрирован: Чт окт 18, 2007 16:45:30
Откуда: из Питера

Сообщение MetEl »

Да десительно двухбайтная unsigned short (чё на пнях int не применяют теперь...).

http://www.citforum.ru/programming/c/h12.shtml

Вот ... гуляю по ссылка с курса...
MetEl
Вымогатель припоя
Сообщения: 543
Зарегистрирован: Чт окт 18, 2007 16:45:30
Откуда: из Питера

Сообщение MetEl »

Как вот это на Си написать?
И вообще правильно ли?

unsigned int u;
u = ADCW; // после опросf АЦП

if(u>=10000){ a=u%10000; a1 = (u-a)/10000; };

if(u>=1000){b=a%1000; b1=(a-b)/1000; };

if(u>=100){c=b%100; c1=(b-c)/100; };

if(u>=10){d=c%10; d1=(c-d)/10; };

if(u<10){e=u;};

e=d;

Результат a1,b1,c1,d1,e (10 000-e, 1 000-e, 100-e, 10-e и единицы соответственно ), если я ничего не перепутал.
Аватара пользователя
Mozart
Мучитель микросхем
Сообщения: 413
Зарегистрирован: Пт мар 10, 2006 12:23:05
Откуда: Moscow
Контактная информация:

Сообщение Mozart »

товарищи модеры администраторы... может быть сделать специальную ветку по программированию?... и разделить на две ветки на ну как вы сами понимаете на Си и АСМ...
если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
MetEl
Вымогатель припоя
Сообщения: 543
Зарегистрирован: Чт окт 18, 2007 16:45:30
Откуда: из Питера

Сообщение MetEl »

Товарисчи рубайте быстрее!

Во вяких курсах не затронута алгоритмическая и синтаксическая часть!

Не проработана примерами и не закреплена практикой!
Простейший пример по написанию программы калькулятора или термометра с часами!

Ведь что читать приходится!

1.3.9. Поразрядные операции
http://www.citforum.ru/programming/c/h13.shtml
Вы находите эту таблицу(внизу перед 1.3.10) правильной?

1.2.2. Целый тип данных
http://www.citforum.ru/programming/c/h12.shtml
Таблица 6

Таблица 72. Связь между частотами SCK и генератора
http://www.gaw.ru/html.cgi/txt/doc/micr ... 8/15_1.htm
Разряд 0 - SPI2X: Бит удвоения скорости SPI - а по таблице деление!

Как вас понять ТА!
Аватара пользователя
alex2103
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт сен 18, 2007 16:41:16
Откуда: Украина, г. Запорожье
Контактная информация:

Сообщение alex2103 »

Вот так быстрее будет чем с делением:

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

void perevod (int a) 
{

  unsigned char Num1, Num2, Num3;
  Num1=Num2=0;
  while (a >= 100) 
  {
    a -= 100; 
    Num1++; 
  }
  while (a >= 10)
  {
    a -= 10; 
    Num2++;
  }
  Num3 = a;
 digits[0] = Num1; //сотни
 digits[1] = Num2; //десятки
 digits[2] = Num3; //единицы
}
Аватара пользователя
Mozart
Мучитель микросхем
Сообщения: 413
Зарегистрирован: Пт мар 10, 2006 12:23:05
Откуда: Moscow
Контактная информация:

Сообщение Mozart »

ну да быстрее... единственно что внутри эти переменные NUM1 NUM2 NUM3 не очень нужны... можно просто глобальную digits[3] увеличивать... к примеру ++digits[0]; и код сократится... вот вам и оптимизация... если digits не глобальная тогда ссылками орудуем...

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

void perevod (int a) 
{
  while (a >= 100) 
  {
    a -= 100; 
    ++digits[0]; 
  }
  while (a >= 10)
  {
    a -= 10; 
    ++digits[1];
  }
  digits[2] = a;
}
если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
Аватара пользователя
tych
Э...
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва
Контактная информация:

Сообщение tych »

MetEl писал(а):Таблица 72. Связь между частотами SCK и генератора
http://www.gaw.ru/html.cgi/txt/doc/micr ... 8/15_1.htm
Разряд 0 - SPI2X: Бит удвоения скорости SPI

а по таблице деление!


А я вижу удвоение частоты когда он "1".

MetEl писал(а):Не проработана примерами ...

1.3.9. Поразрядные операции
http://www.citforum.ru/programming/c/h13.shtml
Вы находите эту таблицу(внизу перед 1.3.10) правильной?


Неужели вам моих примеров было не достаточно ?

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

00010010 &  01001111 // "И" - только 1 и 1 дают 1
                     //    англ. название   AND
     00000010        // это результат

// только биты_2 в обоих числах были единицы


И для других операций тоже примеры даны.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Аватара пользователя
alex2103
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт сен 18, 2007 16:41:16
Откуда: Украина, г. Запорожье
Контактная информация:

Сообщение alex2103 »

Mozart, действительно так красивее :)
MetEl
Вымогатель припоя
Сообщения: 543
Зарегистрирован: Чт окт 18, 2007 16:45:30
Откуда: из Питера

Сообщение MetEl »

из курсов
""
1) Строка где переменная стоит слева от = но через знак &
PORTB & = 0x23;
на Си означает - прочитать содержимое переменной PORTB, затем выполнить "поразрядное (побитное) логическое И" между прочитанным значением и числом 0x23 и поместить (записать, присвоить) результат в переменную PORTB
""

А может оно так выглядеть?

Переместить содержание регистра PORTB в стек (допустим), переместить число (с права) в следующию "строку"(регистр стека) стека, провести операцию логическкого И (АЛУ уходит в себя...) и выдаёт(выставляет) результат в регистр PORTB.

Ну фиг его знает, зачем вообще тогда нада инт, чары какая нафиг разница!


Умня МС виснет!

-> alex2103
Пасиб! Но всёравно проц виснет и молчит!
Последний раз редактировалось MetEl Вт ноя 20, 2007 22:06:43, всего редактировалось 1 раз.
Закрыто

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