LCD keypad menu

Başlatan Sdttn, 02 Şubat 2013, 18:55:12

Sdttn

SPI keypad'den gelen veriyi SPI kesmesiyle alıyorum.
Menü'lü bir 16x2 lcd arayüz kullanıyorum.
Keypadden gelen veri karakter (Char) tipinde. Bu veriyi Bir menüde kullanmak istiyorum.
Sayıları ekranda gösterecek ve 12-13 üyeli bir string dizisine kaydedeceğim.
Basılan her rakamın ekranda hemen görünmesi gerekiyor.

Bu yapıyı nasıl oluşturabilirim?

toprak0258

merhabalar ...
bende spi ve keypad uzerine ornekler ile ugrasiyorum...yaptigim denemede keypad normal iletisim ile kullandigimda hem pratik te hemde isisde bir sorun yok...ama ayni devreyi spi ile kulanmaya calisiyorum sorun var gonderdigim bilgi ile aldigim bilgi farkli oluyor nedenini bir turlu cozemedim....hem alicida hemde vericide kesme kullanmisim acaba buradami hata yapiyorum...keypad noktasinda herhangi bir sorun cikmiyor....
selamlar....
Bilgi paylaşıldıkca değer kazanır.

Sdttn

#2
Ben bu kodu kullanıyorum çalışıyordu en son düzenlemediysem.
Sadece tuşa basıldğında SPI'den bir karakteri gönderiyor. Yazılımsal SPI. Ancak alıcıda kesme ile donanımsal SPI  kullanıyorum.
Devre şeması veremiyorum kodlardan neyin nereye bağlı olduğu belli zaten.
#include <16F688.h> 
#device adc=16
#fuses NOWDT,NOPROTECT,BROWNOUT,INTRC_IO,NOMCLR
#use delay(clock=8000000)  
//#use SPI(MASTER,DI=PIN_C5,DO=PIN_C4,CLK=PIN_C2,SAMPLE_RISE, BITS=8,MSB_FIRST,IDLE=0)
//#use rs232(baud=9600,parity=N,xmit=PIN_C1,bits=8,stream=PORT1)
//============================= 

//Keypad connection: 
#define row0 PIN_a0 
#define row1 PIN_a1 
#define row2 PIN_a2 
#define row3 PIN_a3 
#define col0 PIN_c0 
#define col1 PIN_c1 
#define col2 PIN_a4


// Keypad layout: 
char const KEYS[4][3] = 
{{'1','2','3',}, 
 {'4','5','6',}, 
 {'7','8','9',}, 
 {'*','0','#',}}; 


#define KBD_DEBOUNCE_FACTOR 100 // Set this number to apx n/333 where 
// n is the number of times you expect 
// to call kbd_getc each second 

void kbd_init() 
{ 
//set_tris_a(0x0F); 

//output_a(0xF0);

port_a_pullups(FALSE);  
} 

short int ALL_ROWS (void) 
{ 
if(input (row0) & input (row1) & input (row2) & input (row3)) 
   return (0); 
else 
   return (1); 
} 



char kbd_getc() 
{ 
static byte kbd_call_count; 
static short int kbd_down; 
static char last_key; 
static byte col; 

byte kchar; 
byte row; 

kchar='\0'; 

if(++kbd_call_count>KBD_DEBOUNCE_FACTOR) 
  { 
   switch (col) 
     { 
      case 0: 
        output_LOW(col0); 
        output_HIGH(col1); 
        output_HIGH(col2); 
       
        break; 
    
      case 1: 
        output_HIGH(col0); 
        output_LOW(col1); 
        output_HIGH(col2); 
       
        break; 

      case 2: 
        output_HIGH(col0); 
        output_HIGH(col1); 
        output_LOW(col2); 
      
        break; 

     
      } 

   if(kbd_down) 
     { 
      if(!ALL_ROWS()) 
        { 
         kbd_down=false; 
         kchar=last_key; 
         last_key='\0'; 
        } 
     } 
   else 
     { 
      if(ALL_ROWS()) 
        { 
         if(!input (row0)) 
            row=0; 
         else if(!input (row1)) 
            row=1; 
         else if(!input (row2)) 
            row=2; 
         else if(!input (row3)) 
            row=3; 

         last_key =KEYS[row][col]; 
         kbd_down = true; 
        } 
      else 
        { 
         ++col; 
         if(col==3) 
            col=0; 
        } 
     } 
   kbd_call_count=0; 
  } 
return(kchar); 
} 

//=========================== 
void main() 
{ 

set_tris_a(0b00000100);
disable_interrupts(int_ext);
disable_interrupts(global);
ext_int_edge(H_TO_L);

setup_oscillator(OSC_8MHZ);

char k;



kbd_init(); 



while(TRUE) 
  { 
 //spi_xfer(0b10101010);
   k=kbd_getc(); 
   if(k!=0) 
     { if(k='1')
     output_high(pin_c1);
//      if(k=='*') 
      //   printf("%c", '*'); 
       spi_xfer('*');
       
       //  printf("%c", k); 
        spi_xfer(k);
     } 
  } 

}


mesaj birleştirme:: 03 Şubat 2013, 22:20:39

Alıntı yapılan: toprak0258 - 03 Şubat 2013, 21:47:12
merhabalar ...
bende spi ve keypad uzerine ornekler ile ugrasiyorum...yaptigim denemede keypad normal iletisim ile kullandigimda hem pratik te hemde isisde bir sorun yok...ama ayni devreyi spi ile kulanmaya calisiyorum sorun var gonderdigim bilgi ile aldigim bilgi farkli oluyor nedenini bir turlu cozemedim....hem alicida hemde vericide kesme kullanmisim acaba buradami hata yapiyorum...keypad noktasinda herhangi bir sorun cikmiyor....
selamlar....

SPI ayarların master ve slavede aynı değildir. Muhtemelen hata buradan kaynaklanıyordur.

toprak0258

merhabalar....
yaptiginiz programa baktim benimkinden farkli olmus...belki sana veya farkli arkadaslara faydasi olabilir diye  komple devre programini ve isissini koydum... ben donanimsal kullaniyorum....eger bir hata bulursan yazarsaniz iyi olur ...ben cok bakmaktanmidir hatayi goremedim cok fazlada takildim ama asamadim....
http://www.dosya.tc/server27/1jyWkx/873.rar.html
selamlar....
Bilgi paylaşıldıkca değer kazanır.