matmor Inserito: 2 ottobre 2007 Segnala Share Inserito: 2 ottobre 2007 Salveho realizzato un circuito con un 16f877a , un display 16x2 ed una tastiera a matrice 3x4Il mio problema è questo:Tutto funziona molto bene,premetto che non sono un gran programmatore, infatti non riesco a fare un programma in grado di gestire i numeri sopra al "9" , cioè per capirsi tipo macchina del caffè dove se premo 1ho l'attesa per il prossimo numero che portra essere esempio 2 risultato (12).Banale, ho pensato, ma non ci riesco....nessuno ha qualche suggerimento ???Grazie Link al commento Condividi su altri siti More sharing options...
accacca Inserita: 2 ottobre 2007 Segnala Share Inserita: 2 ottobre 2007 La traccia potrebbe essere questanumero = 0 ;se premuto numero 0..9 alloranumero = (numero*10) + numeroSe lavori ad alto livello la moltiplicazione non è un problemaSe lavori in asm ci sono diverse soluzioni per implementare la moltiplicazione (se il micro non ha l'istruzione mul come ad es. 8051) una semplice è questatmp = (numero shift sinstra 1)numero = (tmp shift sinstra 2)numero = numero + tmp alla fine sommi (numero x 8) + (numero x 2) = numero x 10 Link al commento Condividi su altri siti More sharing options...
matmor Inserita: 2 ottobre 2007 Autore Segnala Share Inserita: 2 ottobre 2007 non so dove sbaglio ma adesso mi da 33 se ad esempio premo 3lavoro con mikrocquindi nessun problema per i calcolied ho la libreria per la lettura della tastiera Keypad_read Link al commento Condividi su altri siti More sharing options...
accacca Inserita: 2 ottobre 2007 Segnala Share Inserita: 2 ottobre 2007 (modificato) Purtroppo non conosco il miKroC ne tantomeno i picazzardo però un'ipotesiNon è che torna il carattere ad es '3' = 0x33 ?In questo caso ti basta sottrarre 0x30 quando ricevi un numero dall procedura di lettura tastiera.Oppure ti costruisci semplicemente una stringa con le cifre digitate ad es"12"e la passi alla funzione atoi che restituisce un intero corrispondente al numero passato come stringa.Domanda: ma la tabella di codifca dei tasti la passi tu ? o utilizza una predefinita ? Modificato: 2 ottobre 2007 da accacca Link al commento Condividi su altri siti More sharing options...
matmor Inserita: 2 ottobre 2007 Autore Segnala Share Inserita: 2 ottobre 2007 mat3: // Wait for key to be pressed a=0; kp=0; kp = Keypad_Read(); delay_ms(100); if (kp!=0) { if (kp==1) { a=0; goto link;}link: lcd_cmd(LCD_BLINK_CURSOR_ON); lcd_out(1,13," 1"); delay_ms(1000); link1: a=a+1; delay_ms(1) ; kp=0; kp=keypad_read(); if (kp!=0){ // kp=(kp*10)+kp ; kp=kp+10; eeprom_write(mem,kp) ; delay_ms(100); kpa=eeprom_read(mem) ; intToStr(kpa, kp1); Lcd_Out(1, 9, kp1); lcd_cmd(LCD_CURSOR_OFF); kp=0; goto mat3;} //} if (a>=4000) { lcd_cmd(LCD_CURSOR_OFF); kp=1 ; eeprom_write(mem,kp) ; delay_ms(100); kpa=eeprom_read(mem) ; intToStr(kpa, kp1); Lcd_Out(1, 9, kp1);; goto mat3;} else { goto link1; }adesso ho fatto tutto a manocioè se mi esce 1 attendo che venga premuto un'altro numero e lo sommo a 10 altrimenti scrivo 1.soloche lo dovrei fare per tutti i numeri , non mi sembra il casoperchè penso che sia possibile più semplicema non so come ..... Link al commento Condividi su altri siti More sharing options...
accacca Inserita: 2 ottobre 2007 Segnala Share Inserita: 2 ottobre 2007 Ascolta matmor capsico poco di questo llinguaggio perchè è più un dialetto ti chiedo scusa prima ho sbagliatose fai kp = (kp *10) +kp non funziadevi farekp = 0 ;tmp = keypad_read();if (tmp == numero)kp = (kp*10) + tmp ;io non ho ancora capito cosa torna Keypad_read se restituisce i numeri 0..9 allora funziona Link al commento Condividi su altri siti More sharing options...
matmor Inserita: 2 ottobre 2007 Autore Segnala Share Inserita: 2 ottobre 2007 scusa per il dialettosi keypad_read è il numero Link al commento Condividi su altri siti More sharing options...
accacca Inserita: 2 ottobre 2007 Segnala Share Inserita: 2 ottobre 2007 matmor scusa de che ?mica è colpa tua sono funzioni di un ambiente che non conosco tutto quihai provato con la formula corretta adesso dvrebbe essere ok Link al commento Condividi su altri siti More sharing options...
matmor Inserita: 2 ottobre 2007 Autore Segnala Share Inserita: 2 ottobre 2007 ok la formula funzionama ome faccio se voglio scriver 25 per esempio??grazie mille per l'aiuto Link al commento Condividi su altri siti More sharing options...
accacca Inserita: 2 ottobre 2007 Segnala Share Inserita: 2 ottobre 2007 (modificato) dovrebbe essere universalepremi 2 poi 5 e ti esce 25.togli if kp==1 in cima al tuo codice e provaovviamente se premi tre tasti applichi la forumal tre volteprimo tasto * 100 + secondo tasto * 10 + terzo tastoDevi controllare tu se ha inserito due o tre tasti.ed eventualmente scartare la lettura se il terzo tasto premuto è un numerooppure ripartire azzerando il numeromi sa che faccio solo casino ... Modificato: 2 ottobre 2007 da accacca Link al commento Condividi su altri siti More sharing options...
matmor Inserita: 2 ottobre 2007 Autore Segnala Share Inserita: 2 ottobre 2007 io dovrei scrivere in una stringa se non erroma non ci capisco una mazza........ancora devo entrare nella logica del c purtroppoadesso io quello che leggo con keypad_read lo copio in tmpma è finita qui, io poi converto il dato e lo spediscoa lcd come carattere.non so come creare una stringa con due decimali .... Link al commento Condividi su altri siti More sharing options...
matmor Inserita: 2 ottobre 2007 Autore Segnala Share Inserita: 2 ottobre 2007 unsigned short np,kp,mem,high,kpa,kpb,low,kp2,fica,prima,old,tmp ;unsigned counter,cnt,cnt1;char txt[1];char kp1[1];void disp(){ lcd_cmd(lcd_clear); Lcd_Out(1, 1, "P.Piano="); Lcd_Out(2, 1, "P.Tot="); } void main() { mem = 1 ; //'posizione counter in eeprom ibn byte HIGH = 2 ; //'posizione volte 255 in eeprom counter=0; old=0; trisb=1; kp=0; Keypad_Init(&PORTd); Lcd_Init(&PORTb); // Initialize LCD on PORTC Lcd_Cmd(LCD_CLEAR); // Clear display Lcd_Cmd(LCD_CURSOR_OFF); // Cursor off delay_ms(1000); Lcd_Out(1, 1, "P.Piano="); Lcd_Out(2, 1, "P.Tot=");mat3: // Wait for key to be pressed kp=0; tmp = Keypad_Read(); if (tmp!=0) { kp = (kp*10) + tmp ; eeprom_write(mem,kp) ; //scrivo kp in memoria delay_ms(100); kpa=eeprom_read(mem) ; //leggo kp da memoria } intToStr(kpa, kp1); //lo trasformo per lcd Lcd_Out(1, 8, kp1); //lo srivo sul display /// funzione peril conteggio valori al rilascio/// if (old==0) { if (Button(&PORTB, 0, 500, 1)) { old=1; } } if (old==1) { if ((portb.f0==0) && (old==1)) { delay_ms(30); counter=counter+kpa ; delay_ms(100); old=0; } } intToStr(counter, txt); //scrivo il valore della somma Lcd_Out(2, 8, txt);goto mat3;}questo listato mi scrive un solo numero in memoria e su lcd voglio imparare Link al commento Condividi su altri siti More sharing options...
accacca Inserita: 3 ottobre 2007 Segnala Share Inserita: 3 ottobre 2007 bravo! hai risoltoti ho risposto in PM ma la tua casella è piena riprovo più tardiciao Link al commento Condividi su altri siti More sharing options...
Sby Inserita: 3 gennaio 2008 Segnala Share Inserita: 3 gennaio 2008 matmor+2/10/2007, 10:53--> (matmor @ 2/10/2007, 10:53) Io invece mi fermo molto prima, uso mikrobasic come linguaggio, ma non riesco a far andare la tastiera...Ne facendo la simulazione con proteus, ne tantomeno facendo il circuito vero e proprio... Chi sa come mai? Come programma ho usato uno di demo, leggermente modificato. program KeyPad_Test5dim kp, cnt, oldstate as byte txt as byte[5]dim conta as bytemain:portc=0trisc=0 oldstate = 0 cnt = 0 conta=0 Keypad_Init(PORTB) Lcd_Init(PORTC) ' Initialize LCD on PORTB Lcd_Cmd(LCD_CLEAR) ' Clear display Lcd_Cmd(LCD_CURSOR_OFF) ' Cursor off Lcd_Out(1, 1, "Key :") Lcd_Out(2, 1, "Times:") while true kp = 0 ' Wait for key to be pressed and released while kp = 0 kp = Keypad_Read Delay_ms(10) wend ' Prepare value for output select case kp case 1 kp = "1" case 2 kp = "2" case 3 kp = "3" case 4 kp = "A" case 5 kp = "4" case 6 kp = "5" case 7 kp = "6" case 8 kp = "B" case 9 kp = "7" case 10 kp = "8" case 11 kp = "9" case 12 kp = "C" case 13 kp = "*" case 14 kp = "0" case 15 kp = "#" case 16 kp = "D" end select if (kp <> oldstate) then cnt = 1 oldstate = kp while( Keypad_Released() = 0) nop wend else Inc(cnt) while( Keypad_Released() = 0) nop wend end ifif (kp = "5") and (conta=0) thenconta=1end ifif (kp = "1") and (conta=1) thenconta=2end ifif (kp = "5") and (conta=2) thenporta.0=1delay_ms(2000)porta.0=0conta=0end if ' Print on LCD Lcd_Chr(1, 10, kp) if (cnt = 255) then cnt = 0 Lcd_Out(2, 10, " ") end if WordToStr(cnt, txt) Lcd_Out(2, 10, txt) wendend. Link al commento Condividi su altri siti More sharing options...
Messaggi consigliati
Crea un account o accedi per commentare
Devi essere un utente per poter lasciare un commento
Crea un account
Registrati per un nuovo account nella nostra comunità. è facile!
Registra un nuovo accountAccedi
Hai già un account? Accedi qui.
Accedi ora