Форум myROBOT.ru » Лаборатория » Микроконтроллеры » sprintf не работает(

Страниц (1): [1]
 

1. Жук - 09 Июня, 2014 - 20:50:25 - перейти к сообщению
Привет всем!
Затрахался я уже с этим sprintf
не хочет число в массив запихивать(
а если меняешь формат то компилируется только через раз!
может кто нибудь подскажет в чем проблема?
(он в самом конце находится)
[spoiler]
CODE:
/*
* AVRGCC1.c
*
* Created: 01.06.2014 15:39:16
* Author: Антошка
*/
# define F_CPU 8000000UL
#include <avr/io.h>
#include <stdio.h>
#include <util/delay.h>

void Clear_ports(void)
{
PORTA=0b00000000;
PORTD=0b0000000;
}

void Init_ports(void)
{
DDRA=0b11111111;
DDRD=0b11010000;
Clear_ports();
}

void Impuls(void)
{
PORTD |= _BV(PD4);
_delay_ms(1);
PORTD &= ~_BV(PD4);
}

void Init_LCD(void)
{
_delay_ms(20);
PORTA=0b00110000;
PORTD=0b0000000;
Impuls();
_delay_ms(5);
PORTA=0b00110000;
PORTD=0b0000000;
Impuls();
_delay_us(100);
PORTA=0b00110000;
PORTD=0b0000000;
Impuls();
PORTA=0b00111100; // 8 bit, 2 line, 5*11
PORTD=0b0000000;
Impuls();
PORTA=0b00001100; //display ON OFF
PORTD=0b0000000;
Impuls();
PORTA=0b00000001;//Clear all
PORTD=0b0000000;
Impuls();
PORTA=0b00000110; //Entry mode set
PORTD=0b0000000;
Impuls();
}

void Char_To_LCD ( char TXT )
{
PORTA=TXT; //*
PORTD |= _BV(PD7);
Impuls();
}
void clear ()
{
PORTA=0b00000001;
PORTD=0b0000000;
Impuls();
}

// ------- Основная программа ---------
void main(void)
{
Init_ports(); // настраиваем МК
Init_LCD(); // инициализация модуля
Char_To_LCD(0b10101000); // П
Char_To_LCD(0b01110000); // р
Char_To_LCD(0b10111000); // и
Char_To_LCD(0b10110011); // в
Char_To_LCD(0b01100101); // е
Char_To_LCD(0b10111111); // т
Char_To_LCD(0b00100001); // !

clear ();


int i=8;
int A[i];
A[0]=0;
A[1]=0;
A[2]=0;
A[3]=0;
A[4]=0;
A[5]=0;
A[6]=0;
A[7]=0;
A[8]=0;
i=0;
int n=8 ;
while(n){
DDRC=0x00;
PORTC=0XFF;

if(PINC==0b11111110)
{ Char_To_LCD(0b00110001); // 1

i++;
A[i]=1;

_delay_ms(50);
n=n-1;
}

if(PINC==0b11111101)
{ Char_To_LCD(0b00110000); // 1
i++;
A[i]=0;
_delay_ms(50);

n=n-1;
}

}
DDRB=0xff;
PORTB=0x00;

if (A[1]==1) {
PORTB|=_BV(PB7);
}
else{
PORTB&=~_BV(PB7);
}

if (A[2]==1) {
PORTB|=_BV(PB6);
}
else{
PORTB&=~_BV(PB6);
}

if (A[3]==1) {
PORTB|=_BV(PB5);
}
else{
PORTB&=~_BV(PB5);
}

if (A[4]==1) {
PORTB|=_BV(PB4);
}
else{
PORTB&=~_BV(PB4);
}

if (A[5]==1) {
PORTB|=_BV(PB3);
}
else{
PORTB&=~_BV(PB3);
}

if (A[6]==1) {
PORTB|=_BV(PB2);
}
else{
PORTB&=~_BV(PB2);
}

if (A[7]==1) {
PORTB|=_BV(PB1);
}
else{
PORTB&=~_BV(PB1);
}

if (A[8]==1) {
PORTB|=_BV(PB0);
}
else{
PORTB&=~_BV(PB0);
}
int p=PINB;
clear();

int j=8;
int B[j];
B[0]=0;
B[1]=0;
B[2]=0;
B[3]=0;
B[4]=0;
B[5]=0;
B[6]=0;
B[7]=0;
B[8]=0;
j=0;


int m=8 ;
while(m){
DDRC=0x00;
PORTC=0XFF;

if(PINC==0b11111110)
{ Char_To_LCD(0b00110001); // 1

j++;
B[j]=1;

_delay_ms(50);
m=m-1;
}

if(PINC==0b11111101)
{ Char_To_LCD(0b00110000); // 1
j++;
B[j]=0;
_delay_ms(50);

m=m-1;
}
}

DDRB=0xff;
PORTB=0x00;

if (B[1]==1) {
PORTB|=_BV(PB7);
}
else{
PORTB&=~_BV(PB7);
}

if (B[2]==1) {
PORTB|=_BV(PB6);
}
else{
PORTB&=~_BV(PB6);
}

if (B[3]==1) {
PORTB|=_BV(PB5);
}
else{
PORTB&=~_BV(PB5);
}

if (B[4]==1) {
PORTB|=_BV(PB4);
}
else{
PORTB&=~_BV(PB4);
}

if (B[5]==1) {
PORTB|=_BV(PB3);
}
else{
PORTB&=~_BV(PB3);
}

if (B[6]==1) {
PORTB|=_BV(PB2);
}
else{
PORTB&=~_BV(PB2);
}

if (B[7]==1) {
PORTB|=_BV(PB1);
}
else{
PORTB&=~_BV(PB1);
}

if (B[8]==1) {
PORTB|=_BV(PB0);
}
else{
PORTB&=~_BV(PB0);
}
int o=PINB;



clear();
int e=16;
int array[e];
int y=p+o;
// const char w=1010101;
// sprintf(array, w );
//printf(g,array);
//array[e]=IntToStr(g);
//int sprintf(array, y \d);
sprintf(array,"%d",y);
//sprintf(c[e], "%s",g);

clear ();


for (e=0; e<=16; e++){
if(array[e]==1)
{ Char_To_LCD(0b00110001); // 1
}
else {
Char_To_LCD(0b00110000);
}
}




}
[/spoler]
2. elmot - 10 Июня, 2014 - 11:33:40 - перейти к сообщению
А что происходит-то? Почему sprintf в целочисленный массив, а не в символьный?
Почему размер массива из переменной? И сравнение с единицей как с числом, а не с символом? Т.е. весь кусок со спринтфом - полная ерунда, причем _все_ варианты.

И вообще, sprintf лучше не использовать - он не контролирует длину ,безопаснее snprintf .

Должно быть как-то так:
CODE:

#define CHAR_LENGHT (16)
int i;
char cArr[CHAR_LENGHT];
...
snprintf(cArr, CHAR_LENGHT, "%d",y);
for(i = 0; cArr[i] != 0; i++)
switch(cArr[i]) {
case '0': /*blah;blah*/ break;
case '1': /*blah;blah*/ break;
...
}


и да,

Строки в С
3. Жук - 10 Июня, 2014 - 18:36:49 - перейти к сообщению
строго не судите)
примеры sprintf брал с форумов.
сделал такой вариант в протеусе выдало
1111100000000000
пробовал через свитч
зато выдает правильный результат в десятичной системе счисления)))))
(делал через свитч)
как сделать чтоб в двоичной выдавал???
CODE:
int y=1111000011110000;
char cArr[CHAR_LENGHT];
snprintf(cArr, CHAR_LENGHT, "%d",y);
if (cArr[0]>0) {
Char_To_LCD(0b00110001);
}
else {
Char_To_LCD(0b00110000);
}
if (cArr[1]>0) {
Char_To_LCD(0b00110001);
}
else {
Char_To_LCD(0b00110000);
}
if (cArr[2]>0) {
Char_To_LCD(0b00110001);
}
else {
Char_To_LCD(0b00110000);
}
if (cArr[3]>0) {
Char_To_LCD(0b00110001);
}
else {
Char_To_LCD(0b00110000);
}
if (cArr[4]>0) {
Char_To_LCD(0b00110001);
}
else {
Char_To_LCD(0b00110000);
}
......................
......................
}
4. elmot - 11 Июня, 2014 - 10:22:15 - перейти к сообщению
Жук пишет:
строго не судите)
примеры sprintf брал с форумов.
сделал такой вариант в протеусе выдало
1111100000000000
пробовал через свитч
зато выдает правильный результат в десятичной системе счисления)))))
(делал через свитч)
как сделать чтоб в двоичной выдавал???

Нет, все. Хватит. Дальше своими силами.
5. Жук - 11 Июня, 2014 - 17:55:15 - перейти к сообщению
Все сделал! может кому пригодится
CODE:
int y=0b0000111100001111;
int a=y;
int c=0b0000000000000001;
int n=16;
while (n) {
a = a & c;
if (a>0){
Char_To_LCD(0b00110000);
}
else {
Char_To_LCD(0b00110001);
}
a=y;
c<<=1;
n--;
}}
6. elmot - 16 Июня, 2014 - 10:15:34 - перейти к сообщению
Во, уже неплохоУлыбка
7. Жук - 27 Июня, 2014 - 17:18:29 - перейти к сообщению
elmot пишет:
Во, уже неплохоУлыбка

учусь потихоньку)