Vai al contenuto
PLC Forum


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


matmor

Messaggi consigliati

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

Link al commento
Condividi su altri siti


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

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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
Link al commento
Condividi su altri siti

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 .....

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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
Link al commento
Condividi su altri siti

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 ....

Link al commento
Condividi su altri siti

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

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

Link al commento
Condividi su altri siti

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...