Go Down

Topic: Difficoltà nel decifrare il codice.... (Read 546 times) previous topic - next topic

matrix77

Feb 08, 2013, 09:12 pm Last Edit: Feb 08, 2013, 11:00 pm by matrix77 Reason: 1
Salve a tutti,

Sto incontrando alcune difficoltà nel capire queste righe di codice che ho estrapolato dagli esempi di gestione del display "Nokia 6600" e che adesso vorrei utilizzare per gestire un display a cristalli liquidi a due righe.
Tra i vari sketch che ho trovato in rete, ho sempre notato che le le tecniche di programmazione per "stampare" sul display le ore, minuti e secondi, erano parecchio diverse da questa e forse risultavano più leggibili e intuitive, fino a quando mi sono imbattuto in questo codice che reputo interessante, ma che forse per un profano, risulta essere molto meno intuitivo e di difficile interpretazione, almeno per quanto riguarda alcuni passaggi chiave.

Le prime perplessità nascono dalla dichiarazione delle variabili all'interno del "void", senza peraltro l'azzeramento delle stesse, seconda domanda come
fa il software a trasformare le "x" in zeri, terza e ultima domanda, a cosa serve lo "+=0x30", dopo il ciclo di for.
Per molti esperti saranno domande stupide, ma per adesso sto facendo fatica a venirne a capo.
Nel frattempo ho cercato di adattare il codice gestendo un display a due righe e il risultato è stato (00:00:00), inserendo in testa al programma un
"sec++" e un "delay(1000)" per scandire il tempo, dopodichè ho stampato il valore "timeChar" tramite la funzione "lcd.print(timeChar)" e impostato
tramite "lcd.setCursor(5,1)", la posizione sul display, ma il risultato finale è stato solo una indecifrata scansione di caratteri alfanumerici, negli utimi due zeri stampati sul display.



Code: [Select]
void displayDigitalTime(int h, int m, int s, int ap)
{
 char timeChar[13] = {'x', 'x', 0x0A, 'x', 'x', 0x0A, 'x', 'x', ' ', ' '};
 

 timeChar[0] = h/10;
 timeChar[1] = h - (timeChar[0] * 10);
 timeChar[3] = m/10;
 timeChar[4] = m - (timeChar[3] * 10);
 timeChar[6] = s/10;
 timeChar[7] = s - (timeChar[6] * 10);
 
 
 for (int i=0; i<8; i++)
   timeChar[i] += 0x30;


Ciao




PaoloP

#1
Feb 08, 2013, 10:21 pm Last Edit: Feb 08, 2013, 10:34 pm by PaoloP Reason: 1

Le prime perplessità nascono dalla dichiarazione delle variabili all'interno del "void", senza peraltro l'azzeramento delle stesse


Le variabili dichiarate nella definizione della funzione sono variabili locali e il tipo di variabile è dichiarato esplicitamente. L'inizializzazione non serve perchè esse assumono il valore delle variabili o costanti passate durante la chiamata della funzione.
In pratica h, m, s e ap esistono solo all'interno della funzione.
Quando tu richiami la funzione gli passerai dei parametri, così
Code: [Select]
displayDigitalTime(ora, minuti, secondi, 1);
La funzione quindi associa
h = ora
m = minuti
s = secondi
ap = 1


seconda domanda come fa il software a trasformare le "x" in zeri

Non è che le trasforma. Fa un assegnamento al primo componente dell'array e lo sovrascrive.
Code: [Select]
timeChar[0] = h/10;
Scrive le decine della variabile ora (chiamata h all'interno della funzione)


terza e ultima domanda, a cosa serve lo "+=0x30", dopo il ciclo di for.

E' il valore ascii dello zero. (48 decimale) In questo modi puoi trasformare quello che per Arduino è un numero in un carattere comprensibile da noi.
Se il valore di timeChar[0] è 0, sommando 0x30, timeChar[0] assume il valore 0x30. Stampandolo apparirà uno zero.
E' se stampo timeChar[0] quando è 0?
Non ottieni niente perchè corrisponde al carattere NULL
--> http://www.asciitable.com/



matrix77

Grazie mille sei stato molto esauriente nella risposta, adesso continuo con gli esperimenti eheh


Testato

complimenti sia alla domanda che alla risposta, +1karma ad entrambi  ;)
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

matrix77


complimenti sia alla domanda che alla risposta, +1karma ad entrambi  ;)

Ciao Testato e grazie  :smiley-sweat:

Go Up