Страница 1 из 4
Как разложить по разрядам, програмно (Си).
Добавлено: Пн ноя 19, 2007 01:40:04
MetEl
Проще говоря,
Получаю с АЦП число.
Мне нада его вывести на LCD.
Таблица кодов есть, как проще (быстрее)
Разложить на сотые, десятые... чтоб подставить под таблику кодов и вывести на дисплей.
Какбы форами и ифами, довольно долго.
Нет ли какогонибыдь оператора или функции(пример) похожая на результат маски для битов?
Спасибо.
Re: Как разложить по разрядам, програмно (Си).
Добавлено: Пн ноя 19, 2007 01:55:19
tych
MetEl писал(а):Мне нада его вывести на LCD.
Разложить на сотые, десятые... чтоб подставить под таблику кодов и вывести на дисплей.
Посмотри Вывод на LCD
Добавлено: Пн ноя 19, 2007 02:05:50
MetEl
Ты когданибудь спишь вооще?!
Спасибо ...
Я вспомнил getchar и putchar.
Но LCD от nokia 3410, и таблица кодов самодельная. И "драйвер" тоже.
У меня есть число (пусть - байт) какбы мне его так разложить на сотые, десятые и единицы, чтоб подготовить к последовательному (по разрядному) подставлению с моей таблицей символов.
т.е:
если это число 5 = массив 10
если это число 23 = ???
Как мне "десятый" разряд убрать? (понятно, что делишь пока флаг отрицательный не вылезет, но может чтото есть по проще)
Добавлено: Пн ноя 19, 2007 02:47:56
tych
MetEl писал(а):Ты когданибудь спишь вооще?!
Вот заснул

поэтому не отвечу

Добавлено: Пн ноя 19, 2007 05:51:07
L29Ah
MetEl писал(а):Ты когданибудь спишь вооще?!
Спасибо ...
Я вспомнил getchar и putchar.
Но LCD от nokia 3410, и таблица кодов самодельная. И "драйвер" тоже.
У меня есть число (пусть - байт) какбы мне его так разложить на сотые, десятые и единицы, чтоб подготовить к последовательному (по разрядному) подставлению с моей таблицей символов.
т.е:
если это число 5 = массив 10
если это число 23 = ???
Как мне "десятый" разряд убрать? (понятно, что делишь пока флаг отрицательный не вылезет, но может чтото есть по проще)
Есть в С такая мегаоперация - называется "%". Вместе с "/" получается аццкий тандем

Добавлено: Пн ноя 19, 2007 16:45:15
MetEl
Спасибо что ответили.. это называется.
Яж ни чё не понял.
Щаз поискам нашёл что % оставляют только остаток.
Типа 49%10=9, 23%5=3
Так пол дня искал...
Как usindger char на два байта разломить! (типа int)
Вот новый вопрос?
Добавлено: Пн ноя 19, 2007 17:07:06
Mozart
Как usindger char на два байта разломить! (типа int)
Вот новый вопрос?
это сложный вопрос если чар это уже байт... а инт это два байта...
оч просто... делаете указатель на байт... и присваиваете нач адрес инт... при увеличении указателя на 1 получаете второй байт...
Добавлено: Пн ноя 19, 2007 17:27:14
MetEl
чето я может попутал..
но unsigned char это же два байта (65535).
А int это один вайт (255).
Может чето поменялось, но оно так работает сайчас... и не ругается?
Добавлено: Пн ноя 19, 2007 17:35:43
tych
MetEl писал(а):Типа 49%10=9, 23%5=3
Так пол дня искал...
Как usindger char на два байта разломить! (типа int)
Вот новый вопрос?
старший байт int будет 0 а младший будет твой исходный char
Посмотри наиболе часто используемые типы данных
Добавлено: Пн ноя 19, 2007 17:39:59
Mozart
чето я может попутал..
но unsigned char это же два байта (65535).
А int это один вайт (255).
Может чето поменялось, но оно так работает сайчас... и не ругается?
эээ...ммм... никогда такого не было... читайте книги тогда... что-то у вас бардак какой-то в голове...
Добавлено: Пн ноя 19, 2007 17:46:43
Mozart
Код: Выделить всё
int dataInt;
char *ptrChar;
char little, big;
void main()
{
dataInt = 0xffcc;
ptrChar = &dataInt;
little = *ptrChar;
big = *++ptrChar;
}
вот код... в Борланд С++ необходимо выполнять приведение типов... а винавр и так проглотил... глупый...
Добавлено: Пн ноя 19, 2007 17:59:09
MetEl
Да десительно двухбайтная unsigned short (чё на пнях int не применяют теперь...).
http://www.citforum.ru/programming/c/h12.shtml
Вот ... гуляю по ссылка с курса...
Добавлено: Вт ноя 20, 2007 10:16:52
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 и единицы соответственно ), если я ничего не перепутал.
Добавлено: Вт ноя 20, 2007 10:36:19
Mozart
товарищи модеры администраторы... может быть сделать специальную ветку по программированию?... и разделить на две ветки на ну как вы сами понимаете на Си и АСМ...
Добавлено: Вт ноя 20, 2007 10:43:40
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 - а по таблице деление!
Как вас понять ТА!
Добавлено: Вт ноя 20, 2007 15:14:44
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; //единицы
}
Добавлено: Вт ноя 20, 2007 15:28:24
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;
}
Добавлено: Вт ноя 20, 2007 15:43:18
tych
А я вижу удвоение частоты когда он "1".
Неужели вам моих примеров было не достаточно ?
Код: Выделить всё
00010010 & 01001111 // "И" - только 1 и 1 дают 1
// англ. название AND
00000010 // это результат
// только биты_2 в обоих числах были единицы
И для других операций тоже примеры даны.
Добавлено: Вт ноя 20, 2007 16:18:11
alex2103
Mozart, действительно так красивее

Добавлено: Вт ноя 20, 2007 16:41:26
MetEl
из курсов
""
1) Строка где переменная стоит слева от = но через знак &
PORTB & = 0x23;
на Си означает - прочитать содержимое переменной PORTB, затем выполнить "поразрядное (побитное) логическое И" между прочитанным значением и числом 0x23 и поместить (записать, присвоить) результат в переменную PORTB
""
А может оно так выглядеть?
Переместить содержание регистра PORTB в стек (допустим), переместить число (с права) в следующию "строку"(регистр стека) стека, провести операцию логическкого И (АЛУ уходит в себя...) и выдаёт(выставляет) результат в регистр PORTB.
Ну фиг его знает, зачем вообще тогда нада инт, чары какая нафиг разница!
Умня МС виснет!
-> alex2103
Пасиб! Но всёравно проц виснет и молчит!