Go Down

Topic: ajuda com ponteiro (Read 3504 times) previous topic - next topic

eraldo

Boa noite, estou tendo uma dificuldade em conseguir salvar valores em um ponteiro estou inicializando ele sem nenhum valor, e quando tento colocar um valor nele para mostrar no lcd nao aparece nada. Gostaria de saber se alguem ae pode me ajudar, vou colocar o codigo aqui em baixo

bubulindo

O código não é assim tanto. Faz copy paste e coloca-o dentro das tags code.

Não percebi para que servem tantos apontadores e variáveis quando não passas os apontadores para dentro das funções, nem fazes return. :S
This... is a hobby.

eraldo

Por enquanto só estou usando o vetor valor[5] e o ponteiro aponta valor, na verdade tentando usar hehe. Quero salvar um caracter digitado no primeiro elemento do vetor, depois o segundo e assim por diante, e imprimi-los, mais imprimendo sempre que um caracter for pressionado.
Code: [Select]
/*
Keypad sketch
prints the key pressed on a keypad to the serial port
*/
#include <LiquidCrystal.h>

#include<stdlib.h>

LiquidCrystal lcd(12,11,7,6,5,4);
const int numRows = 4; // number of rows in the keypad
const int numCols = 3; // number of columns
const int debounceTime = 100; // number of milliseconds for switch to be stable
const int debounceDelay = 50;
char key;
char valor[5];
char valor_anterior[4];
char *ponteiro_valor = &valor[0];
// keymap defines the character returned when the corresponding key is pressed
const char keymap[numRows][numCols] = {
{ '1', '2', '3' } ,
{ '4', '5', '6' } ,
{ '7', '8', '9' } ,
{ '.', '0', ',' }
};
// this array determines the pins used for rows and columns
const int rowPins[numRows] = { 70, 71, 72, 73 }; // Rows 0 through 3
const int colPins[numCols] = { 80, 45, 46 }; // Columns 0 through 2
void setup()
{
    lcd.begin (16,2);
   
for (int row = 0; row < numRows; row++)
{
pinMode(rowPins[row],INPUT); // Set row pins as input
digitalWrite(rowPins[row],LOW); // turn on Pull-ups
}
for (int column = 0; column < numCols; column++)
{
pinMode(colPins[column],OUTPUT); // Set column pins as outputs for writing
digitalWrite(colPins[column],HIGH); // Make all columns inactive
}
}
void loop()
{
key = getKey();
if( key !=0) { // if the character is not 0 then it's a valid key press
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Got key ");
lcd.setCursor(0,1);
lcd.print(valor);
delay(100);

}
}
// returns with the key pressed, or 0 if no key is pressed
char getKey()
{
char key = 0;
delay(100);// 0 indicates no key pressed
for(int column = 0; column < numCols; column++)
{
digitalWrite(colPins[column],LOW);// Activate the current column.
for(int row = 0; row < numRows; row++) // Scan all rows for a key press.
{
if(digitalRead(rowPins[row]) == LOW) // Is a key pressed?
{
    //boolean debounce(int pin);
delay(debounceTime); // debounce
while(digitalRead(rowPins[row]) == LOW); // wait for key to be released
key = keymap[row][column];
//delay(60);// Remember which key was pressed.
}
}
digitalWrite(colPins[column],HIGH); // De-activate the current column.
}
   ponteiro_valor =& key;
  *ponteiro_valor ++;
return key; // returns the key pressed or 0 if none
}
 

neuron_upheaval

#3
May 08, 2012, 01:35 pm Last Edit: May 08, 2012, 02:11 pm by neuron_upheaval Reason: 1
Estás a fazer

Code: [Select]

       ponteiro_valor &= key;


que é equivalente a

Code: [Select]

       ponteiro_valor = ponteiro_valor & key;


mas vê que ponteiro_valor aponta para o início de um vector; digamos que o vector comece na posição de memória 37:

Code: [Select]

        +---+---+---+---+---+
valor   | 0 | 0 | 0 | 0 | 0 |
       +---+---+---+---+---+
         ^
         |
        37  38  39  40  41


Se carregarmos a tecla '0' = 0x30 = 48, ponteiro_valor ganhará o valor 37 & 48 = 32, ou seja, vai acabar apontando para fora dos limites do vector.

O que tens que fazer é o seguinte:

Code: [Select]

       *ponteiro_valor++ = key;


Assim, vais preencher o vector com o caractere '0' e assim por diante.

eraldo

Infelizmente não funcionou, quando eu coloco essa linha de código, não aparece nada no display, só aparece a primeira linha, a segunda só aparece quando eu coloco
Code: [Select]
*ponteiro_valor = key;.
Mesmo tentando incrementar o ponteiro
Code: [Select]
*ponteiro_valor++;
em outra linha para mostrar valores como por exemplo 4, depois 45, depois 458 , ainda não esta funcionando.
Alguem sabe como posso fazer para mostrar cada tecla presionada, aloca-la no vetor e mostrar sem que a primeira seja apagada??? Vlw

bubulindo

Acho que deves rever um pouco a lógica dos ponteiros...

No entanto, experimenta isto:

Code: [Select]
/*
Keypad sketch
prints the key pressed on a keypad to the serial port
*/
#include <LiquidCrystal.h>

#include<stdlib.h>

LiquidCrystal lcd(12,11,7,6,5,4);
const int numRows = 4; // number of rows in the keypad
const int numCols = 3; // number of columns
const int debounceTime = 100; // number of milliseconds for switch to be stable
const int debounceDelay = 50;
char key;
char valor[5];//isto é na realidade um ponteiro...
//char valor_anterior[4];
//char *ponteiro_valor = &valor[0]; //isto está errado...
char valor_index = 0;


// keymap defines the character returned when the corresponding key is pressed
const char keymap[numRows][numCols] = {
{ '1', '2', '3' } ,
{ '4', '5', '6' } ,
{ '7', '8', '9' } ,
{ '.', '0', ',' }
};
// this array determines the pins used for rows and columns
const int rowPins[numRows] = { 70, 71, 72, 73 }; // Rows 0 through 3
const int colPins[numCols] = { 80, 45, 46 }; // Columns 0 through 2
void setup()
{
    lcd.begin (16,2);
    valor[4] = '\0';//terminar a string.
   
for (int row = 0; row < numRows; row++)
{
pinMode(rowPins[row],INPUT); // Set row pins as input
digitalWrite(rowPins[row],LOW); // turn on Pull-ups
}
for (int column = 0; column < numCols; column++)
{
pinMode(colPins[column],OUTPUT); // Set column pins as outputs for writing
digitalWrite(colPins[column],HIGH); // Make all columns inactive
}
}
void loop()
{
key = getKey();
if( key != 0) { // if the character is not 0 then it's a valid key press
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Got key ");
lcd.setCursor(0,1);
//lcd.print(valor); //isto também está errado... em lado nenhum escreves na variável valor.
//podes fazer...
lcd.print(key); //OU

valor[valor_index++] = key;
if (valor_index >= 3) { //indice 4 é o terminador de string, logo apenas vais imprimir 4 digitos.
   lcd.print(valor);
}

//Nota que tens de apagar uma destas opcões para isto correr como deve ser. 



delay(100);

}
}
// returns with the key pressed, or 0 if no key is pressed
char getKey()
{
char key = 0;
delay(100);// 0 indicates no key pressed
for(int column = 0; column < numCols; column++)
{
digitalWrite(colPins[column],LOW);// Activate the current column.
for(int row = 0; row < numRows; row++) // Scan all rows for a key press.
{
if(digitalRead(rowPins[row]) == LOW) // Is a key pressed?
{
    //boolean debounce(int pin);
delay(debounceTime); // debounce
while(digitalRead(rowPins[row]) == LOW); // wait for key to be released
key = keymap[row][column];
//delay(60);// Remember which key was pressed.
}
}
digitalWrite(colPins[column],HIGH); // De-activate the current column.
}
//   ponteiro_valor =& key;//ISTO ESTÁ ERRADO. É uma má prática de programacão.
//  *ponteiro_valor ++; //idem aspas aspas
return key; // returns the key pressed or 0 if none
}


Vê se isto resulta. Não garanto que resulte, porque estou a assumir que a biblioteca do LCD funciona como a Serial e que o keymap retorna ASCII. Mas pelo menos o problema do apontador fica resolvido.
This... is a hobby.

eraldo

O apontador esta funcionando, e incrementando, mais com alguns pequenos bugs.
Ele esta colocando o valor recebido pelo teclado no inicio e no fim, por exemplo, quando a tecla 2 é pressionada aparece 2, em seguida quando outra tecla é pressionada, por exemplo, 5, aparece 5 na mesma posição em que o caracter 2 apareceu, e quando outra tecla é precionada, por exemplo 7, o display imprime 7257.

bubulindo

Não percebi o problema. :S
This... is a hobby.

eraldo

Quando uma tecla é pressionada ele mostra no display, quando uma segunda tecla é pressionada ele mostra na mesma posição da primeira, já quando uma terceira tecla é pressionada ele mostra na seguinte ordem: terceira, primeira, segunda, terceira. Quando uma quarta tecla é pressionada, é mostrado : quarta, primeira, segunda, terceira, quarta.

bubulindo

Suspeito que tenhas lido o que deixei escrito no código... em todo o caso...

Code: [Select]


//podes fazer...
lcd.print(key); //OU

valor[valor_index++] = key;
if (valor_index >= 3) { //indice 4 é o terminador de string, logo apenas vais imprimir 4 digitos.
   lcd.print(valor);
}

//Nota que tens de apagar uma destas opcões para isto correr como deve ser. 


This... is a hobby.

Go Up