Kumanda beta PicC kodları

25 12 2007


Bir önceki postta gösterilen devrede kullanılan pic 16f877 ye ait PicC ile hazırlanmış program kodları. Malesef Pic 16f877 sınırlı program belleginden dolayı protokol sayısı sınırlı kalmıstır. Ancak cihazın Epromu kullanılarak cok sayıda protokol desteklenebilir. PicC kodları yine hi-tech firmasına ait hi-tide arayuzunde yazılmıstır.

#include <htc.h>

 #include <delay.c>

#include <lcd_16f877_imlecsiz.c>

#define IR_DATA_CIKIS RE0 //ir veri cikis portu tanimlandi.

#define protokolsayisi 2 //kac protokol biliniyor…

#define tus_takimi_satir 4 //tus takimina ait bilgiler

#define tus_takimi_sutun 4 //tus takimi sutun sayisi

char tustara(); // fonksiyon bildirimi

char tusoku(); //fonksiyon bildirimi

void bekle_us(unsigned int x){

unsigned int j;

for(j=0;j<x;j++){DelayUs(1)}

}

void bekle_saniye(char a) {

char i,b;

for(i=0;i<=a;i++) {

for(b=0;b<=4;b++) { DelayMs(250);}

}

}

void

ir_tarif_et(unsigned char t,unsigned char protokol,unsigned char cihaz, unsigned char komut)

{

unsigned char a;

/////////////////////////////////////

/////////////////////////////////

///////////////////////////////////////// SONY

if(protokol==1) { //sony infrared protokolu ise 7bit komut 5bit //adres

IR_DATA_CIKIS=1; bekle_us(4*t);IR_DATA_CIKIS=0; bekle_us(t); //bu //satir start kodu gonderiyor.

for (a=0;a<=6;a++) { //bu dongu 7 bit komut gonderiyor

if(((komut)&(1<<a))==(1<<a)) {IR_DATA_CIKIS=1;bekle_us(2*t);IR_DATA_CIKIS=0;bekle_us(t);}

else {IR_DATA_CIKIS=1;bekle_us(t);IR_DATA_CIKIS=0;bekle_us(t);}

} //7bit komut satiri bitti.

for (a=0;a<=4;a++) { //bu dongu 5bit adres kodunu gonderiyor.

if(((cihaz)&(1<<a))==(1<<a)) {IR_DATA_CIKIS=1;bekle_us(2*t);IR_DATA_CIKIS=0;bekle_us(t);}

else {IR_DATA_CIKIS=1;bekle_us(t);IR_DATA_CIKIS=0;bekle_us(t);}

} //5bit adres gonderildi.

} //sony ir bitti

/////////////////////////////////////

/////////////////////////////////

///////////////////////////////////////// SONY BITTI

/////////////////////////////////////

/////////////////////////////////

///////////////////////////////////////// PHILIPS

if(protokol==2) { //philips rc5 ir. 5bit adres 6 bit komut.

IR_DATA_CIKIS=0;bekle_us(t);IR_DATA_CIKIS=1; bekle_us(t); IR_DATA_CIKIS=0;bekle_us(t);IR_DATA_CIKIS=1; bekle_us(t); //start kodu

IR_DATA_CIKIS=1;bekle_us(t);IR_DATA_CIKIS=0;bekle_us(t); //toggle biti– duzenle!!!!

for(a=0;a<=4;a++){ //16=00001 rc5 adres dizisi ters dizimlidir. adres kodu gonderiliyor…

if(((cihaz)&(16>>a))==(16>>a)) {IR_DATA_CIKIS=0;bekle_us(t);IR_DATA_CIKIS=1;bekle_us(t);}

else {IR_DATA_CIKIS=1;bekle_us(t);IR_DATA_CIKIS=0;bekle_us(t);}

} //5bit adres kodu gonderildi.

for(a=0;a<=5;a++){ //32=000001 rc5 komut dizisi ters. komut kodu gonderiliyor…

if(((komut)&(32>>a))==(32>>a)) {IR_DATA_CIKIS=0;bekle_us(t);IR_DATA_CIKIS=1;bekle_us(t);}

else {IR_DATA_CIKIS=1;bekle_us(t);IR_DATA_CIKIS=0;bekle_us(t);}

}// rc5 komut gonderildi.

}

/////////////////////////////////////

/////////////////////////////////

///////////////////////////////////////// PHILIPS BITTI

}

/////////////////////////////////////////////

///////////////////////////////////////////

/////////// TUS TAKIMI

char tuslar[16] = {‘7′,‘8′,‘9′,‘/’,‘4′,‘5′,‘6′,‘*’,‘1′,‘2′,‘3′,‘-’,‘.’,‘0′,‘=’,‘+’};

char tustara()

// Tus takimini tara

// Tus basilmadiginda 0 dondur (return)

{ int satir,sutun,tmp;

char tus=0;

// PortA analog-dijital cevirimi kapat.

ADCON1 = 6;

// PortA yi giris, portCyi cikis yap ve portC ye 0xFF gonder.

TRISC = 0;

TRISA = PORTC = 0xFF;

for (satir=0; satir < tus_takimi_satir; satir++)

{ // Satirlara sifir gonder ve sutunu oku

PORTC = ~(1 << satir); //portc ye tek tek sıfır gonderiyoruz (satirlara)

#asm

NOP

#endasm

tmp = PORTA;

// Tus basilirsa sutun logic sifir gorunur. Buradan logic sifir var mi //diye bak

for (sutun=0; sutun<tus_takimi_sutun; ++sutun) {

if ((tmp & (1<<sutun)) == 0)

{ int idx = (satir*tus_takimi_sutun) + sutun;

tus = tuslar[idx];

goto DONE;

} }

}

DONE:

return tus;

}

char tusoku()

// Basilan tusu bul. Tus basilip birakilana kadar bekle.

{ char tus;

tus = tustara();

if (tus)

while (tustara() != 0){}

// Basilan tus birakilana kadar while dongusunde kaliyoruz. Tusun //birakilmasi bekleniyor.

return tus; //basilan tusu dondur. (tusoku fonksiyonunu cagrildigi yere //dondurulur)

}

////////////////////////////////////////////////////

////////////////////////////////////

/////////////TUS TAKIMI BITTI

//////////////////////

/////////////////

/////////////////////////Tuslara bakiyoruz…

char tusal ()

// Tus okuma rutini calistirir. Basilan tusun ASCII karsiligini dondurur.

{ char btus;

while ((btus = tusoku()) == 0){}

//Bir tus okuyana kadar bekler.

return btus;

}

////////////////////////////

///////////////

////////////////// Tuslara baktik.

///////////////////////////

//////////////

///////////////////////////Tus analizi

char tusanaliz (char tus)

// Basilan tus bir komut mu godnerecek yoksa islem mi yaptiracak?

{ if ((tus == ‘.’)|| ((tus >= ‘0′) && (tus <= ‘9′)))

return 1; //Eger komut gonderecekse 1 dondur.

else

return 0; //eger islem yaptiracaksa sifir gonder.

}

////////////////////////////

///////////////

//////////////////////tus analizi bitii.

void LCD_beklemede() {

lcd_init();

lcd_clear();

lcd_puts(“KUMANDAN beta”);

lcd_goto(0×40);

lcd_puts(“by Mehmet Telli”