Elektronik / Mikrodenetleyici Projeleri/

Matris led display göstergeli yılan oyunu (ccs c pic16f877)

Matris led display göstergeli yılan oyunu pic16f877 mikrodenetleyicisi üzerine kurulu yazılım ise ccs c ile hazırlanmış matris led display gösterge üzerinden butonlar ile oyun oynanıyor uygulama Proje Makale Paylaşım bölümünden ulaştırıldı dosyaları gönderen, uygulamayı hazırlayan kişilere Teşekkürler

Devrenin çalışma görüntüsü;

PIC16f877 ile hazırlanmış bir yılan oyunu.4 buton ile yılanın kontrolü yapılmakta.CCS C ile programlandı.

Malzeme Listesi :

  • 2 adet ortak anot 3 mm 7×5 matris display
  • 5 adet buton
  • 5 adet 10k direnç
  • 1 adet 4 mhz kristal
  • 1 adet PIC16F877

Not : Devrede ortak katod display kullanmak isterseniz kodlarda bazı değişlikler yapmanız gerekmektedir. Sütun seçme fonksiyonu yeniden düzenlenmeli ve C portuna “~” ile terslenerek gönderilen bilgilerin önündeki “~” işareti kaldırılmalı yani bilgiler terslenmeden gönderilmelidir.

CCSC Yazılım içeriği;


/*Tasarım ve Programlama : Recai Sinekli - www.recaisinekli.com*/

#include <16F877.h>
#include 
#fuses XT
#use delay (clock=4000000)
#use fast_io(b)

int konum[3]={1,3,1}; //Yılanın başının yatay değeri,düşey değeri ve yönü

#int_RB
void kontrol(){
  if(input(pin_b7)==0){      //Yukarı butonu
    delay_us(50);
    if(konum[2]!=2){
      konum[2]=4;
    }
  }
  if(input(pin_b6)==0){      //Sol butonu
    delay_us(50);
    if(konum[2]!=1){
      konum[2]=3;
    }
  }
  if(input(pin_b4)==0){      //Aşağı butonu
    delay_us(50);
    if(konum[2]!=4){
      konum[2]=2;
    }
  }
  if(input(pin_b5)==0){      //Sağ butonu
    delay_us(50);
    if(konum[2]!=3){
      konum[2]=1;
    }
  }
}
/*****************************************************************************/
boolean eepromyuklendi=false;
int rastgele=1;
int1 oyun=1;
int i,j,rx,ry,puan_b,puan_o;
int puan=0;
int1 k=0;
int son=2;
int dizi[7][10]={
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
1,2,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0};
int1 yilan[7][10]={
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0};
const int puan_txt[44]={
0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,
0b01111111,0b00001001,0b00001001,0b00001001,0b00000110,0b00000000,//P
0b00111111,0b01000000,0b01000000,0b01000000,0b00111111,0b00000000,//U
0b01111100,0b00001010,0b00001001,0b00001010,0b01111100,0b00000000,//A
0b01111111,0b00000010,0b00000100,0b00001000,0b01111111,0b00000000,//N
0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000};
const int sifir[5]={0b00111110,0b01010001,0b01001001,0b01000101,0b00111110};
const int bir[5]={0b01000100,0b01000010,0b01111111,0b01000000,0b01000000};
const int iki[5]={0b01000110,0b01100001,0b01010001,0b01001001,0b01000110};
const int uc[5]={0b00100010,0b01000001,0b01001001,0b01001001,0b00110110};
const int dort[5]={0b00110000,0b00101000,0b00100100,0b01110010,0b00100001};
const int bes[5]={0b00101111,0b01001001,0b01001001,0b01001001,0b00110001};
const int alti[5]={0b00111110,0b01001001,0b01001001,0b01001001,0b00110010};
const int yedi[5]={0b01100001,0b00010001,0b00001001,0b00000101,0b00000011};
const int sekiz[5]={0b00110110,0b01001001,0b01001001,0b01001001,0b00110110};
const int dokuz[5]={0b00100110,0b01001001,0b01001001,0b01001001,0b00111110};

/*****************************************************************************/
//Yılanın kuyruğundan 1 nokta silen fonksiyon
void kuyruk(){
  for(i=0;i<7;i++){
    for(j=0;j<10;j++){
      if(dizi[i][j]==1){
        dizi[i][j]=0;
      }
    }
  }
  for(i=0;i<7;i++){
    for(j=0;j<10;j++){
      if(dizi[i][j]!=0 && dizi[i][j]!=99){
        dizi[i][j]-=1;
      }
    }
  }
  for(i=0;i<7;i++){
    for(j=0;j<10;j++){
      if(dizi[i][j]>son && dizi[i][j]<99){
        son=dizi[i][j];
      }
    }
  }
}
//Yem belirleyen fonksiyon
void yem(){
  if(k==0){
    while(1){
      rx=rand()%10;
      ry=rand()%7;
      if(dizi[ry][rx]==0){
        dizi[ry][rx]=99;
        k=1;
        break;
      }
    }
    rastgele++;
    write_eeprom(0,rastgele);
  }
}
//Sütun seçen fonksiyon
void sutunsec(char sutun){
 switch (sutun){
  case 0: output_e(0);output_d(1);break;
  case 1: output_e(0);output_d(2);break;
  case 2: output_e(0);output_d(4);break;
  case 3: output_e(0);output_d(8);break;
  case 4: output_e(0);output_d(16);break;
  case 5: output_e(0);output_d(32);break;
  case 6: output_e(0);output_d(64);break;
  case 7: output_e(0);output_d(128);break;
  case 8: output_e(1);output_d(0);break;
  case 9: output_e(2);output_d(0);break;
 }
}
//Yılanın konumunu güncelleyen fonksiyon
void yilan_guncelle(){
  switch (konum[2]){
    //Yön sağa ise
    case 1:
      if(konum[0]<9){
        konum[0]=konum[0]+1;
        if(dizi[konum[1]][konum[0]]!=0 && dizi[konum[1]][konum[0]]!=99){
          oyun=0;
        }else{
        dizi[konum[1]][konum[0]]=son+1;
        }
      }else{
        konum[0]=0;
        if(dizi[konum[1]][konum[0]]!=0 && dizi[konum[1]][konum[0]]!=99){
          oyun=0;
        }else{
        dizi[konum[1]][konum[0]]=son+1;
        }
      }
      if(konum[1]==ry && konum[0]==rx){
      son+=1;
      k=0;
      puan+=1;
      }else{
      kuyruk();
      }
    break;
    //Yön aşağı ise
    case 2:
      if(konum[1]<6){
        konum[1]=konum[1]+1;
        if(dizi[konum[1]][konum[0]]!=0 && dizi[konum[1]][konum[0]]!=99){
          oyun=0;
        }else{
        dizi[konum[1]][konum[0]]=son+1;
        }
      }else{
        konum[1]=0;
        if(dizi[konum[1]][konum[0]]!=0 && dizi[konum[1]][konum[0]]!=99){
          oyun=0;
        }else{
        dizi[konum[1]][konum[0]]=son+1;
        }
      }
      if(konum[1]==ry && konum[0]==rx){
      son+=1;
      k=0;
      puan+=1;
      }else{
      kuyruk();
      }
    break;
    //Yön sola ise
    case 3:
      if(konum[0]>0){
        konum[0]=konum[0]-1;
        if(dizi[konum[1]][konum[0]]!=0 && dizi[konum[1]][konum[0]]!=99){
          oyun=0;
        }else{
        dizi[konum[1]][konum[0]]=son+1;
        }
      }else{
        konum[0]=9;
        if(dizi[konum[1]][konum[0]]!=0 && dizi[konum[1]][konum[0]]!=99){
          oyun=0;
        }else{
        dizi[konum[1]][konum[0]]=son+1;
        }
      }
      if(konum[1]==ry && konum[0]==rx){
      son+=1;
      k=0;
      puan+=1;
      }else{
      kuyruk();
      }
    break;
    //Yön yukarı ise
    case 4:
      if(konum[1]>0){
        konum[1]=konum[1]-1;
        if(dizi[konum[1]][konum[0]]!=0 && dizi[konum[1]][konum[0]]!=99){
          oyun=0;
        }else{
        dizi[konum[1]][konum[0]]=son+1;
        }
      }else{
        konum[1]=6;
        if(dizi[konum[1]][konum[0]]!=0 && dizi[konum[1]][konum[0]]!=99){
          oyun=0;
        }else{
        dizi[konum[1]][konum[0]]=son+1;
        }
      }
      if(konum[1]==ry && konum[0]==rx){
      son+=1;
      k=0;
      puan+=1;
      }else{
      kuyruk();
      }
    break;
  }
}
//Yılanın displaydeki görüntüsünü güncelleyen fonksiyon
void goster(){
  for(i=0;i<7;i++){
    for(j=0;j<10;j++){
      yilan[i][j]=1;
    }
  }
  for(i=0;i<7;i++){
    for(j=0;j<10;j++){
      if(dizi[i][j]>0){
        yilan[i][j]=0;
      }
    }
  }
  for(j=0;j<20;j++){
        for(i=0;i<10;i++){
         sutunsec(i);
         output_bit(pin_c0,yilan[0][i]);
         output_bit(pin_c1,yilan[1][i]);
         output_bit(pin_c2,yilan[2][i]);
         output_bit(pin_c3,yilan[3][i]);
         output_bit(pin_c4,yilan[4][i]);
         output_bit(pin_c5,yilan[5][i]);
         output_bit(pin_c6,yilan[6][i]);
         delay_us(1200);
         output_c(0b11111111);
     }
  }
}
/********************************ANA FONKSİYON*********************************/
void main()
{

   if(eepromyuklendi==false){
      rastgele=read_eeprom(0);
      if(rastgele==0){rastgele=1; write_eeprom(0,1);}
      eepromyuklendi=true;
      srand(rastgele);
   }
   
   output_c(0x00);
   enable_interrupts(INT_RB);
   enable_interrupts(GLOBAL);
   
   while(oyun){
     goster();
     yilan_guncelle();
     yem();
   }
   while(1){
     puan_o=puan/10;
     puan_b=puan%10;
        for(i=10;i<44;i++){
         for(j=0;j<15;j++){
            sutunsec(9);
            output_c(~puan_txt[i]);
            delay_us(1000);
            output_c(0b11111111);
            sutunsec(8);
            output_c(~puan_txt[i-1]);
            delay_us(1000);
            output_c(0b11111111);
            sutunsec(7);
            output_c(~puan_txt[i-2]);
            delay_us(1000);
            output_c(0b11111111);
            sutunsec(6);
            output_c(~puan_txt[i-3]);
            delay_us(1000);
            output_c(0b11111111);
            sutunsec(5);
            output_c(~puan_txt[i-4]);
            delay_us(1000);
            output_c(0b11111111);
            sutunsec(4);
            output_c(~puan_txt[i-5]);
            delay_us(1000);
            output_c(0b11111111);
            sutunsec(3);
            output_c(~puan_txt[i-6]);
            delay_us(1000);
            output_c(0b11111111);
            sutunsec(2);
            output_c(~puan_txt[i-7]);
            delay_us(1000);
            output_c(0b11111111);
            sutunsec(1);
            output_c(~puan_txt[i-8]);
            delay_us(1000);
            output_c(0b11111111);
            sutunsec(0);
            output_c(~puan_txt[i-9]);
            delay_us(1000);
            output_c(0b11111111);
         } 
        }
        for(j=0;j<255;j++){
          for(i=0;i<10;i++){
              sutunsec(i);
           if(i<5){
             if(puan_o==0){
             output_c(~sifir[i]);
             }
             else if(puan_o==1){
             output_c(~bir[i]);
             }
              else if(puan_o==2){
             output_c(~iki[i]);
             }
              else if(puan_o==3){
             output_c(~uc[i]);
             }
              else if(puan_o==4){
             output_c(~dort[i]);
             }
             else if(puan_o==5){
             output_c(~bes[i]);
             }
             else if(puan_o==6){
             output_c(~alti[i]);
             }
             else if(puan_o==7){
             output_c(~yedi[i]);
             }
             else if(puan_o==8){
             output_c(~sekiz[i]);
             }
             else if(puan_o==9){
             output_c(~dokuz[i]);
             }
             delay_ms(1);
             output_c(0b11111111);
           }else{
             if(puan_b==0){
             output_c(~sifir[i-5]);
             }
             else if(puan_b==1){
             output_c(~bir[i-5]);
             }
              else if(puan_b==2){
             output_c(~iki[i-5]);
             }
              else if(puan_b==3){
             output_c(~uc[i-5]);
             }
              else if(puan_b==4){
             output_c(~dort[i-5]);
             }
             else if(puan_b==5){
             output_c(~bes[i-5]);
             }
             else if(puan_b==6){
             output_c(~alti[i-5]);
             }
             else if(puan_b==7){
             output_c(~yedi[i-5]);
             }
             else if(puan_b==8){
             output_c(~sekiz[i-5]);
             }
             else if(puan_b==9){
             output_c(~dokuz[i-5]);
             }
             delay_ms(1);
             output_c(0b11111111);
           }
          }
        }
   }
}

Tasarım ve programlama : Recai Sinekli Web : www.recaisinekli.com Matris led display göstergeli yılan oyunu uygulama dosyaları (kaynak ccsc, hex kodları devre şeması veproteus ares pcb dosyası: Matris led display göstergeli yılan oyunu (ccs c pic16f877)

Dosya indirme LINK listesi (TXT formatında) link-10232.zip şifre-pass: 320volt.com

  1. Serdar 2010/05/14
  2. Recai 2010/05/17
  3. volkan 2012/03/27
  4. yusuf 2014/04/24
  5. ekrem 2015/05/17
  6. Anıl Kubilay 2017/03/06

Yorum

Soru: