Kumanda beta PicC kodları
25 12 2007Bir ö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”