Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение avreal »

Ну всё честно. Тогда вот так можно progress bar собразить на терминал

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

#include <stdio.h>
#include <stdint.h>

void busy_work()
{
        volatile int i = 10000000;  // Ну это под конкретный ноут на мобильном core-i3
        while (--i) ;
}

void progress(const char *header, uint8_t percent)
{
        enum { width = 50 };
        static const char stars[] = "*************************"
                                    "*************************";

        printf("%s |%*.*s| %2d%%\r",
               header,
               -width, width*percent/100, stars,
               percent);
        fflush(stdout);          // И это тоже под ОС с её буферизацией вывода
}

int main()
{
        for (uint8_t percent = 0; percent <= 100; ++percent) {
                busy_work();
                progress("Calculation", percent);
        }
        putchar('\n');
} 
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Реклама
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Re: Вопросы по С/С++ (СИ)

Сообщение спящий »

Вопрос, могу ли я запихать массив 131X131 в программу? Это зависит от SRAM памяти контроллера?я хочу вывести картинку на дисплей,или это можно сделать только через ММС?
КВ выдает ошибку.

Спойлер#include <stdio.h>
#include <mega48.h>
#include <delay.h>
#include <string.h>
#include <io.h>
#include <font_6x8.h >
int i,m,k;

flash unsigned char dada[]={
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0xDB, 0xB6, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69, 0xDB, 0xB6, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0xDB, 0xB6, 0x00
};



void data_6100(int data_6100)
{PORTC.0=0;

PORTC.3=1;
PORTC.5=1;
delay_us(1);
PORTC.5=0;
PORTC.3=0;
for(i=7;i>=0;i--)
{

if (data_6100&(1<<i))
{
PORTC.3=1;
PORTC.5=1;
delay_us(1);
PORTC.5=0;
PORTC.3=0;
}

else
{

PORTC.3=0;
PORTC.5=1;
delay_us(1) ;
PORTC.5=0;
}
}
PORTD.0=1;
}


void comand_6100(int comand_6100)
{ PORTC.0=0;
PORTC.5=1;
PORTC.3=0;
delay_us(1);
PORTC.5=0;
PORTC.3=0;

for(i=7;i>=0;i--)
{

if (comand_6100&(1<<i))
{
PORTC.3=1;
PORTC.5=1;
delay_us(1);
PORTC.5=0;
PORTC.3=0;
}

else
{

PORTC.3=0;
PORTC.5=1;
delay_us(1) ;
PORTC.5=0;
}
}
PORTC.0=1;
}

void cifra(int cifra)
{
for(k=0;k<=5;k++)
{
for(m=0;m<8;m++)
{if ((Font_6x8_Data[(cifra*6)+k])&(1<<m))
{data_6100(23);}
else {data_6100(0);}
}}

}


void text(flash unsigned char *text1)
{while(*text1)
{
cifra(*text1);
text1++ ;
}
}





void main(void)
{DDRC=0xff;
PORTC.1=1;
delay_ms(20);

comand_6100(0x11); //sleep out
delay_ms(10);
comand_6100(0x14); //verx vniz
delay_ms(2);
comand_6100(0x36); //memory data simmetria
data_6100(0b00101000);

comand_6100(0b00101001);//disp on


comand_6100(0x2a);// x orientacia
data_6100(49);
data_6100(56);
comand_6100(0x2b);// y orientacia
data_6100(0);
data_6100(131);

comand_6100(0x3a);// x orientacia
data_6100(2);


comand_6100(0x2d);// cvet
data_6100(0);
data_6100(2);
data_6100(5);
data_6100(7);
data_6100(9);
data_6100(11);
data_6100(14);
data_6100(16);
data_6100(0);
data_6100(2);
data_6100(5);
data_6100(7);
data_6100(9);
data_6100(11);
data_6100(14);
data_6100(16);
data_6100(0);
data_6100(6);
data_6100(11);
data_6100(15);
comand_6100(0x2c);// vivod infi
k=1;


while(1)
{
for(i=0;i<14000;i++)
{
data_6100(dada);
}
}

}
Вложения
Безымянный.GIF
(73.88 КБ) 361 скачивание
Безымянный.GIF
(73.88 КБ) 370 скачиваний
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

Это зависит от SRAM памяти контроллера?
Это зависит от качества картинки. Если монохромная, то нужно 1 бит на пиксел, если хотябы 256 цветов, то уже 1 байт на пиксел. Вот и считайте...
Tolmi
Говорящий с текстолитом
Сообщения: 1658
Зарегистрирован: Вс дек 11, 2011 05:25:04
Откуда: Киев, Украина
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Tolmi »

Даже для монохромной картинки
>>> 131*131/8
2145
>>>
нужно больше 2 килобайт.
Нужен хороший МК, чтобы положить всё в RAM. Во flash ещё куда ни шло. И то, если её некуда девать.
In theory, theory and practice are the same. In practice, they're not.
Реклама
Эиком - электронные компоненты и радиодетали
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Re: Вопросы по С/С++ (СИ)

Сообщение спящий »

цветная картинка,тоесть скинуть на экран можно только через ммс или uart?
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

только через ммс или uart?
Нет, не только.
Реклама
Аватара пользователя
БАТАРЕЙКУС
Потрогал лапой паяльник
Сообщения: 346
Зарегистрирован: Сб фев 07, 2009 19:21:25

Re: Вопросы по С/С++ (СИ)

Сообщение БАТАРЕЙКУС »

мужики подскажите кто может.
вот 2 Си компилятора HI-TECH PICC и MPLAB-C18.
так, есть мондуловинка на HI-TECH, прекрасно работает.

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

struct{unsigned data:4;unsigned RS:1;unsigned RW:1;unsigned E:1;unsigned A:1;} LCD @ &PORTD ;
а как это же переписать для MPLAB-C18.

смысл здесь такой при обращении к
LCD.data
LCD.RS
итд

это отображается на порте Д что мне и надо, просто через #define можно назначить 1 бит как
#define RS PORTDbits.RD4 // в MPLAB-C18
#define RS RD4 // в HI-TECH

но как задать четыре бита сразу. как в вышеописанном приёме.
Мечтатель - не тот, кто сидит на диване и думает о несбыточном, а тот, кто всеми силами стремится воплотить несбыточное в реальность.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

Создать тип на Вашу структуру, создать указатель этого типа и присвоить ему адрес порта.
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение urry »

а так не заработает ?


typedef struct
{
unsigned data:4;
unsigned RS:1;
unsigned RW:1;
unsigned E:1;
unsigned A:1;
}LCD_;


LCD_ * LCD=&LATD;


обращение через указатель
LCD->data=3;
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

а так не заработает ?
Заработает. Собственно, я это и предложил человеку. Только хотел, что бы он сам попробовал это реализовать :)
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Re: Вопросы по С/С++ (СИ)

Сообщение ut1wpr »

Аlex писал(а):Создать тип на Вашу структуру, создать указатель этого типа и присвоить ему адрес порта.
Алекс, добрый день.
Может глупо, но спрошу у вас. У автора вопроса не хочу. :)
А что в конечном итоге дает применение в этом случае структуры вместо простых именованых пинов? Или это тяга к прекрасному? Структура ради структуры? Насколько оправдано ее применение в этом случае? Ведь обращаемся мы в любом случае не к группе пинов (бессмысленно устанавливать все четыре пина управления единообразно и одновременно), а к каждому из пинов отдельно и в отдельные дискреты времени... Я считал, что просто определение разных пинов через дефайны, дает бОльшую гибкость, позволяя разносить их на разные порты (в случае восьмибитовок).
Может, есть какой-то глубинный смысл и я не доныриваю? :(
С уважением,
Виктор.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

Добрый день !
Я считал, что просто определение разных пинов через дефайны, дает бОльшую гибкость, позволяя разносить их на разные порты (в случае восьмибитовок).
Я тоже так считаю. По этому, ответом на Ваш вопрос будет - Не знаю :) Видимо, его придётся задать Батарейкусу :)
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Re: Вопросы по С/С++ (СИ)

Сообщение ut1wpr »

Аlex писал(а): Видимо, его придётся задать Батарейкусу :)
Батарейкус! Аллё! Вопрос услышан? :)
С уважением,
Виктор.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

Да хернёй народ заниматься, всё уже давно придумано - Дынс
:)
Аватара пользователя
БАТАРЕЙКУС
Потрогал лапой паяльник
Сообщения: 346
Зарегистрирован: Сб фев 07, 2009 19:21:25

Re: Вопросы по С/С++ (СИ)

Сообщение БАТАРЕЙКУС »

ut1wpr писал(а):
Аlex писал(а):Создать тип на Вашу структуру, создать указатель этого типа и присвоить ему адрес порта.
Алекс, добрый день.
Может глупо, но спрошу у вас. У автора вопроса не хочу. :)
А что в конечном итоге дает применение в этом случае структуры вместо простых именованых пинов? Или это тяга к прекрасному? :(
всё просто, я работаю с дисплеем WH-1602. все знают что он может управляется по 7 проводам

1)RS
2)RW
3)E
4-7) data

так вот последние 4 пина "data" это полубайт данных, и для передачи данных в дисплей надо передать
старший полубайт затем младший.
а с помощью этого прекрасного можно делать так.

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

LCD.RS = 0             ; //
LCD.data = kod>>4 ; // передача старшего полубайта.
LCD.E = 1               ; //
Delay1TCY()           ;
LCD.E = 0               ; //
LCD.data = kod       ; // передача младшего полубайта.
LCD.E = 1               ; //
Delay1TCY()           ;
LCD.E = 0               ; //
а это очень удобно, так как все контакты дисплея присоединены к порту Д.
Мечтатель - не тот, кто сидит на диване и думает о несбыточном, а тот, кто всеми силами стремится воплотить несбыточное в реальность.
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Re: Вопросы по С/С++ (СИ)

Сообщение ut1wpr »

БАТАРЕЙКУС писал(а): всё просто, я работаю с дисплеем WH-1602. все знают что он может управляется по 7 проводам

1)RS
2)RW
3)E
4-7) data

так вот последние 4 пина "data" это полубайт данных, и для передачи данных в дисплей надо передать
старший полубайт затем младший.
а с помощью этого прекрасного можно делать так.

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

LCD.RS = 0             ; //
LCD.data = kod>>4 ; // передача старшего полубайта.
LCD.E = 1               ; //
Delay1TCY()           ;
LCD.E = 0               ; //
LCD.data = kod       ; // передача младшего полубайта.
LCD.E = 1               ; //
Delay1TCY()           ;
LCD.E = 0               ; //
а это очень удобно, так как все контакты дисплея присоединены к порту Д.
А во что превратит компилятор конструкцию

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

LCD.data = kod>>4; 
? Каким образом старший ниббл окажется незатронутым?
В исходном тексте оно может и красиво. В дизасм загляните, будете неприятно удивлены.
Применение структур вообще-то не для красоты написания.
С уважением,
Виктор.
Аватара пользователя
БАТАРЕЙКУС
Потрогал лапой паяльник
Сообщения: 346
Зарегистрирован: Сб фев 07, 2009 19:21:25

Re: Вопросы по С/С++ (СИ)

Сообщение БАТАРЕЙКУС »

ut1wpr

в HI-TECH PICC это прекрасно работает, LCD.data - принадлежат младшие 4 бита порта Д. соответственно kod>>4 позволяет перекачать старший полубайт регистра kod в младший полубайт порта Д.

urry

ваш код компилируется с предупреждением suspicious pointer conversion
не могли б вы его переписать чтоб не было предупреждения я что то не могу понять как это сделать.
Мечтатель - не тот, кто сидит на диване и думает о несбыточном, а тот, кто всеми силами стремится воплотить несбыточное в реальность.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

ваш код компилируется с предупреждением suspicious pointer conversion
Ну совсем народ обленился, только копипасты интересуют. А перевести ? А подумать ? А погуглить ? Да и вообще, пора бы уже книжки начать читать. Или по каждой строчке будете постоянно бегать на форумы ?
Аватара пользователя
БАТАРЕЙКУС
Потрогал лапой паяльник
Сообщения: 346
Зарегистрирован: Сб фев 07, 2009 19:21:25

Re: Вопросы по С/С++ (СИ)

Сообщение БАТАРЕЙКУС »

Аlex писал(а):
ваш код компилируется с предупреждением suspicious pointer conversion
Ну совсем народ обленился, только копипасты интересуют. А перевести ? А подумать ? А погуглить ? Да и вообще, пора бы уже книжки начать читать. Или по каждой строчке будете постоянно бегать на форумы ?
дело в том что я аглицкий языка не знаю и читать документация на С18 не смогу.
а в классическом Си без разнице где располагается структура.
Мечтатель - не тот, кто сидит на диване и думает о несбыточном, а тот, кто всеми силами стремится воплотить несбыточное в реальность.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

Я в буржуйском тоже полный ноль, но, тем не менее, я, видя эту строку, понимаю что происходит.
И для этого совсем не нужно читать мануал на С18, достаточно почитать Русскоязычные книги по Си.
PS: Погуглите указатели и явное приведение типов.
Ответить

Вернуться в «Разные вопросы по МК»