Vai al contenuto
PLC Forum


tastiera a matrice - scrivere su pic numeri oltre "9"


Messaggi consigliati

Inserito:

Salve

ho realizzato un circuito con un 16f877a , un display 16x2 ed una tastiera a matrice 3x4

Il 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 1

ho 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


Inserita:

La traccia potrebbe essere questa

numero = 0 ;

se premuto numero 0..9 allora

numero = (numero*10) + numero

Se lavori ad alto livello la moltiplicazione non è un problema

Se 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 è questa

tmp = (numero shift sinstra 1)

numero = (tmp shift sinstra 2)

numero = numero + tmp

alla fine sommi (numero x 8) + (numero x 2) = numero x 10

Inserita:

non so dove sbaglio ma adesso mi da 33 se ad esempio premo 3

lavoro con mikroc

quindi nessun problema per i calcoli

ed ho la libreria per la lettura della tastiera Keypad_read

Inserita: (modificato)

Purtroppo non conosco il miKroC ne tantomeno i pic

azzardo però un'ipotesi

Non è 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: da accacca
Inserita:

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 mano

cioè 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 caso

perchè penso che sia possibile più semplice

ma non so come .....

Inserita:

Ascolta matmor capsico poco di questo llinguaggio perchè è più un dialetto

ti chiedo scusa prima ho sbagliato

se fai kp = (kp *10) +kp non funzia

devi fare

kp = 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

Inserita:

scusa per il dialetto

si keypad_read è il numero

Inserita:

matmor scusa de che ?

mica è colpa tua

sono funzioni di un ambiente che non conosco tutto qui

hai provato con la formula corretta adesso dvrebbe essere ok

Inserita:

ok la formula funziona

ma ome faccio se voglio scriver 25 per esempio??

grazie mille per l'aiuto

Inserita: (modificato)

dovrebbe essere universale

premi 2 poi 5 e ti esce 25.

togli if kp==1 in cima al tuo codice e prova

ovviamente se premi tre tasti applichi la forumal tre volte

primo tasto * 100 + secondo tasto * 10 + terzo tasto

Devi controllare tu se ha inserito due o tre tasti.

ed eventualmente scartare la lettura se il terzo tasto premuto è un numero

oppure ripartire azzerando il numero

mi sa che faccio solo casino ...

Modificato: da accacca
Inserita:

io dovrei scrivere in una stringa se non erro

ma non ci capisco una mazza........

ancora devo entrare nella logica del c purtroppo

adesso io quello che leggo con keypad_read lo copio in tmp

ma è finita qui, io poi converto il dato e lo spedisco

a lcd come carattere.

non so come creare una stringa con due decimali ....

Inserita:

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

Inserita:

bravo! hai risolto

ti ho risposto in PM ma la tua casella è piena

riprovo più tardi

ciao

  • 3 months later...
Inserita:
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_Test5

dim kp, cnt, oldstate as byte

txt as byte[5]

dim conta as byte

main:

portc=0

trisc=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 if

if (kp = "5") and (conta=0) then

conta=1

end if

if (kp = "1") and (conta=1) then

conta=2

end if

if (kp = "5") and (conta=2) then

porta.0=1

delay_ms(2000)

porta.0=0

conta=0

end 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)

wend

end.

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 account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...