PIC İLE ALFA NUMERİK KLAVYE

İleri düzey PIC programlama örneği. PIC16F877 ile alfa – numerik klavye yapımı. Alfabetik ve sayısal değerleri ASCII kodlarını kullanarak okuma ve Lcd’ye yazdırma. Konu anlatımı ve program kodları.


PIC uygulamalarımızın bu bölümünde alfa – numerik klavye yapımı üzerinde duracağız. Bu klavyeye diğer tuş kombinasyonları da eklenirse tam teşekküllü bir PC klavyesi yapılmış olur. Tam teşekküllü dediğimiz olay normal klavyedeki shift, delete, F1, F2 … vb. kodlardır. Bu yazıda onlara yer vermedim. Sadece alfabetik ve sayısal karakterlerin yazımı üzerinde durdum. Zaten amacınız klavye yapmaksa bu kadar yetecektir. Alfabetik ve sayısal karakterleri yaptıktan sonra diğer tuşları da kolaylıkla ekleyebilirsiniz.


Uygulamada PIC16F877A kullandım. Derleyici olarak CCS C derleyicisini kullandım. B bacaklarını giriş olarak, D bacaklarını çıkış olarak ayarladım. 8 adet B bacağı ile tam 37 tuş kullanacağız. Bu tuşlar birbirine karışmayacak çünkü diyot ile tek yönlü geçişler mümkün olacak. Bu tuşların yapımı üzerinde numerik klavye konusunda da durmuştuk.

Pic_alfabe1 


Yukarıda F, G, H ve I harflerinin PIC’e bağlanması gösterilmiştir.

F harfi en sağdadır ve 1. diyodu 64 sayısını temsil eder. 2. Diyodu picin 5. Bacağına bağlıdır. 4 sayısını verir. 3. Diyot picin 6. Bacağına bağlıdır ve 2 sayısını verir. 3 diyot birlikte,

S = 64 + 4 + 2 = 70 sayısını verir. Bu değer ikili olarak,

01000110 şeklindedir ve F harfinin ASCII karşılığıdır. Bu sayının hexadecimal kodu 46’dır. Ve bu sayı PIC tarafından LCD’ye gönderilir ve ekranda F harfi görünür.

F harfi buttonunun yanındaki button G harfine aittir. G harfinin decimal kodu 71’dir. ikili olarak 01000111 şeklindedir. Yani 70 sayından tek farkı en sağ basamağının 1 olmasıdır. Bu durumda bu buttonun ilk 3 diyodu için F harfinin diyotlarını kullandık. Son basamağı için ayrı diyot döşedik. F’ye bağlantısını yine bir diyot ile yaptık.

Tuşların döşenmesi bu şekildedir. 1. Satır dolunca alt satıra geçecektir. Bunuda şağıdaki kodlarla yaptık.

if(i>15)

    {

    y =2;

    i=0;

    }

Yazdığımız karakterleri PIC gönderirken sütunları i ile, satırları y ile belirliyoruz. Aşağıdaki gibi,

if(deger==48)

    {

      lcd_gotoxy(i+1, y);           

      lcd_send_byte(1,0x30);

      delay_ms(wait);

      i++;

    }

Yukarıdaki kod parçasında lcd_gotoxy(i + 1,y) komutu karakterin yazılacağı satır ve sütunu seçiyor. i sayısı aynı satırda sağa doğru giderken y harfi 1. Veya 2. Satırı temsil ediyor. Böylece 1. Satır dolunca otomatik alt satırda devam ediyor.


Programda portread() şeklinde bir fonksiyon vardır. bu fonksiyon b portunu okur ve ikili değere göre bir sayı üretir. Bu sayı ascii kodudur.


if(input_b()==0b10001100)

   {

      sayi=49;

   }

1 rakamının kodunu okuyan fonksiyon sayi değişkenine 49 değerini vermiştir. Bu değer ana fonksiyonda okunacak ve aşağıdaki komutlar işlenecektir.

if(deger==49)

    {

      lcd_gotoxy(i+1, y);           

      lcd_send_byte(1,0x31);

      delay_ms(wait);

      i++;

    }


O kadar yazı yazıp silme komutunu bırakmak doğru olmazdı. Klavyemizde silme buttonu da var.

Backspace tuşunun ASCII karşılığı decimal olarak 8’dir. Bu sayı PIC’e geldiğinde LCD’yi temizler.

  if(input_b()==0b00010000)

   {

      sayi = 8;

      

   }

if(deger==8)

    {

    lcd_init();

    i=0;

    }

Temel mantık bu şekildedir. Aslında fazla zor değil. Biraz alıştırma yaparak kolayca altından kalkabilirsiniz. Kendinize göre geliştirebilirsiniz. 

 Pic_alfabe2


Her buttonun diyot grubunun girişini bir direnç ile üzerinden topraklayınız ki ters polarize olmasın.

Programın devre şemaları sayfa sonundaki linkte verilmiştir. Malzemelerin yerleştirilmesi anlatılmıştır, inceleyebilirsiniz.



Kolay gelsin.

Tüm kodlar (CCS C).


#define LCD_RS_PIN PIN_D0
#define LCD_RW_PIN PIN_D1
#define LCD_ENABLE_PIN PIN_D2
#define LCD_DATA4 PIN_D3
#define LCD_DATA5 PIN_D4
#define LCD_DATA6 PIN_D5
#define LCD_DATA7 PIN_D6
#include <16F877A.h>
#use delay(crystal=4000000)
#include <lcd.c>

 #fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD 
       
int portread();
int y=1;
int deger=0;
int i=0;
int wait=100;
void main()
{
     set_tris_b(0x00); 
      set_tris_a(0xFF);
      output_b(0x00);      
      output_a(0x00);
      output_d(0x00);
  lcd_init();
  lcd_putc('\f'); 
  while(TRUE)
  {
  deger=portread();
    if(i>15)
    {
    y =2;
    i=0;
    }
    if(deger==48)
    {
      lcd_gotoxy(i+1, y);           
      lcd_send_byte(1,0x30);
      delay_ms(wait);
      i++;
    }
    if(deger==49)
    {
      lcd_gotoxy(i+1, y);           
      lcd_send_byte(1,0x31);
      delay_ms(wait);
      i++;
    }
    if(deger==50)
    {
      lcd_gotoxy(i+1, y);           
      lcd_send_byte(1,0x32);
      delay_ms(wait);
      i++;
    }
     if(deger==51)
    {
      lcd_gotoxy(i+1, y);           
      lcd_send_byte(1,0x33);
      delay_ms(wait);
      i++;
    }
     if(deger==52)
    {
      lcd_gotoxy(i+1, y);           
      lcd_send_byte(1,0x34);
      delay_ms(wait);
      i++;
    }
     if(deger==53)
    {
      lcd_gotoxy(i+1, y);           
      lcd_send_byte(1,0x35);
      delay_ms(wait);
      i++;
    }
     if(deger==54)
    {
      lcd_gotoxy(i+1, y);           
      lcd_send_byte(1,0x36);
      delay_ms(wait);
      i++;
    }
     if(deger==55)
    {
      lcd_gotoxy(i+1, y);           
      lcd_send_byte(1,0x37);
      delay_ms(wait);
      i++;
    }
     if(deger==56)
    {
      lcd_gotoxy(i+1, y);           
      lcd_send_byte(1,0x38);
      delay_ms(wait);
      i++;
    }
     if(deger==57)
    {
      lcd_gotoxy(i+1, y);           
      lcd_send_byte(1,0x39);
      delay_ms(wait);
      i++;
    }
    if(deger==65)
    {
      lcd_gotoxy(i+1, y);           
     lcd_send_byte(1,0x41);
     delay_ms(100);
     i++;
    }
   if(deger==66)
    {
      lcd_gotoxy(i+1, y);           
     lcd_send_byte(1,0x42);
     delay_ms(100);
     i++;
    }
     if(deger==67)
    {
      lcd_gotoxy(i+1, y);           
     lcd_send_byte(1,0x43);
     delay_ms(100);
     i++;
    }
      if(deger==68)
    {
      lcd_gotoxy(i+1, y);           
     lcd_send_byte(1,0x44);
     delay_ms(100);
     i++;
    }
      if(deger==69)
    {
      lcd_gotoxy(i+1, y);           
     lcd_send_byte(1,0x45);
     delay_ms(100);
     i++;
    }
    if(deger==70)
    {
      lcd_gotoxy(i+1, y);           
     lcd_send_byte(1,0x46);
     delay_ms(wait);
     i++;
    }
  if(deger==71)
    {
      lcd_gotoxy(i+1, y);           
     lcd_send_byte(1,0x47);
     delay_ms(wait);
     i++;
    }
    if(deger==72)
    {
      lcd_gotoxy(i+1, y);           
     lcd_send_byte(1,0x48);
     delay_ms(wait);
     i++;
    }
    if(deger==73)
    {
      lcd_gotoxy(i+1, y);           
     lcd_send_byte(1,0x49);
     delay_ms(wait);
     i++;
    }
    if(deger==74)
    {
      lcd_gotoxy(i+1, y);           
     lcd_send_byte(1,0x4A);
     delay_ms(wait);
     i++;
    }
    if(deger==75)
    {
      lcd_gotoxy(i+1, y);           
     lcd_send_byte(1,0x4B);
     delay_ms(wait);
     i++;
    }
    if(deger==76)
    {
      lcd_gotoxy(i+1, y);           
     lcd_send_byte(1,0x4C);
     delay_ms(wait);
     i++;
    }
    if(deger==77)
    {
      lcd_gotoxy(i+1, y);           
     lcd_send_byte(1,0x4D);
     delay_ms(wait);
     i++;
    }
    if(deger==78)
    {
      lcd_gotoxy(i+1, y);           
     lcd_send_byte(1,0x4E);
     delay_ms(wait);
     i++;
    }
    if(deger==79)
    {
      lcd_gotoxy(i+1, y);           
     lcd_send_byte(1,0x4F);
     delay_ms(wait);
     i++;
    }
    if(deger==80)
    {
      lcd_gotoxy(i+1, y);           
     lcd_send_byte(1,0x50);
     delay_ms(wait);
     i++;
    }
    if(deger==81)
    {
      lcd_gotoxy(i+1, y);           
     lcd_send_byte(1,0x51);
     delay_ms(wait);
     i++;
    }
    if(deger==82)
    {
      lcd_gotoxy(i+1, y);           
     lcd_send_byte(1,0x52);
     delay_ms(wait);
     i++;
    }
    if(deger==83)
    {
      lcd_gotoxy(i+1, y);           
     lcd_send_byte(1,0x53);
     delay_ms(wait);
     i++;
    }
    if(deger==84)
    {
      lcd_gotoxy(i+1, y);           
     lcd_send_byte(1,0x54);
     delay_ms(wait);
     i++;
    }
    if(deger==85)
    {
      lcd_gotoxy(i+1, y);           
     lcd_send_byte(1,0x55);
     delay_ms(wait);
     i++;
    }
    if(deger==86)
    {
      lcd_gotoxy(i+1, y);           
     lcd_send_byte(1,0x56);
     delay_ms(wait);
     i++;
    }
    if(deger==87)
    {
      lcd_gotoxy(i+1, y);           
     lcd_send_byte(1,0x57);
     delay_ms(wait);
     i++;
    }
    if(deger==88)
    {
      lcd_gotoxy(i+1, y);           
     lcd_send_byte(1,0x58);
     delay_ms(wait);
     i++;
    }
    if(deger==89)
    {
      lcd_gotoxy(i+1, y);           
     lcd_send_byte(1,0x59);
     delay_ms(wait);
     i++;
    }
    if(deger==90)
    {
      lcd_gotoxy(i+1, y);           
     lcd_send_byte(1,0x5A);
     delay_ms(wait);
     i++;
    }
    if(deger==8)
    {
    lcd_init();
    i=0;
    }
    
  }
}
 int portread()
{
   int sayi=0;
  
   if(input_b()==0b00001100)
   {
      sayi=48;
   }
   if(input_b()==0b10001100)
   {
      sayi=49;
   }
   if(input_b()==0b01001100)
   {
      sayi=50;
   }
   if(input_b()==0b11001100)
   {
      sayi=51;
   }
   if(input_b()==0b00101100)
   {
      sayi=52;
   }
   if(input_b()==0b10101100)
   {
      sayi=53;
   }
   if(input_b()==0b01101100)
   {
      sayi=54;
   }
   if(input_b()==0b11101100)
   {
      sayi=55;
   }
   if(input_b()==0b00011100)
   {
      sayi=56;
   }
   if(input_b()==0b10011100)
   {
      sayi=57;
   }
   if(input_b()==0b10000010)
   {
      sayi=65;
      
   }
   if(input_b()==0b01000010)
   {
      sayi = 66;
      
   }
   if(input_b()==0b11000010)
   {
      sayi = 67;
      
   }
   if(input_b()==0b00100010)
   {
      sayi = 68;
      
   }
   
   if(input_b()==0b10100010)
   {
      sayi = 69;
      
   }
   if(input_b()==0b01100010)
   {
      sayi = 70;
      
   }
   if(input_b()==0b11100010)
   {
      sayi = 71;
      
   }
   
   if(input_b()==0b00010010)
   {
      sayi = 72;
      
   }
   if(input_b()==0b10010010)
   {
      sayi = 73;
      
   }
    if(input_b()==0b01010010)
   {
      sayi = 74;
      
   }
    if(input_b()==0b11010010)
   {
      sayi = 75;
      
   }
     if(input_b()==0b00110010)
   {
      sayi = 76;
      
   }
     if(input_b()==0b10110010)
   {
      sayi = 77;
      
   }
      if(input_b()==0b01110010)
   {
      sayi = 78;
      
   }
      if(input_b()==0b11110010)
   {
      sayi = 79;
      
   }
       if(input_b()==0b00001010)
   {
      sayi = 80;
      
   }
      if(input_b()==0b10001010)
   {
      sayi = 81;
      
   }
       if(input_b()==0b01001010)
   {
      sayi = 82;
      
   }
         if(input_b()==0b11001010)
   {
      sayi = 83;
      
   }
         if(input_b()==0b00101010)
   {
      sayi = 84;
      
   }
         if(input_b()==0b10101010)
   {
      sayi = 85;
      
   }
         if(input_b()==0b01101010)
   {
      sayi = 86;
      
   }
         if(input_b()==0b11101010)
   {
      sayi = 87;
      
   }
    if(input_b()==0b00011010)
   {
      sayi = 88;
      
   }
   if(input_b()==0b10011010)
   {
      sayi = 89;
      
   }
    if(input_b()==0b01011010)
   {
      sayi = 90;
      
   }
   if(input_b()==0b00010000)
   {
      sayi = 8;
      
   }
   
   return sayi;
}


Bağlantı şemaları aşağıdadır.

Alfa Numerik Klavye Bağlantı Şemaları


Daha sade bir çalışma isteyen arkadaşlar aşağıda sadece sayısal değerler girebildiğimiz numerik klavye örneği yer alıyor.

PIC16F877 İle Sayısal Klavye Yapımı


SANATSAL BİLGİ

15/03/2019

  • YORUM YAZ
  • ADI SOYADI(veya nick)
  • YORUM


COPYRIGHT© HER HAKKI SAKLIDIR
Sitede Yer Alan Bilgi Belge Ve Materyallerin İzinsiz olarak Kopyalanması ve Alıntılanması Yasaktır

SANATSAL BILGI