pic ile led kontrol etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
PIC PROGRAMLAMA 13
Merhaba arkadaşlar.Bugün grafik lcd uygulamamızı
yapacagız.Öncelikle biraz grafik lcd lerden bahsedelim.Grafik lcd ler lcd're
ait bütün özelliklere sahiptir.Ayrıca resim çiziminide gösterebilir.Bu lcdler piyasada
genellikle KS0108 entegreleri ile uyumlu olarak bulunur. Aşşagıdaki tabloda
KS0108 entegreli HDM64GS12 grafik lcd pin açıklamaları mevcuttur.
CCS C GRAFİK LCD KÜTÜPHANE DOSYALARI
GLDC.c dosyası;
HDM64GS12 grafik lcd ile ilgili komutlardır.128*64 lcd ile uyumludur.
HDM64GS12.c dosyası;
KS0108 lcd kontrolüne sahip HDM64GS12 grafik lcd ile ilgili komutları içerir.128*64 lcd ile uyumludr.
GRAPHICS.c dosyası;
Lcd ekranımıza çizgi,daire,dikdörtgen vb şekiller çizmemize yarayan kütüphanedir.
KS0108.c dosyası;KS0108 lcd kontrolcüsü komutlarını içerir
GLDC.c dosyası komutları;
-glcd_init(mode)=lcd ekranımızı hazırlamamızı ve silmemizi saglar.Mode kısmına 'on'(lcd aç işelvini görür) ve 'of'(lcd kapa işlevinin görür) komutları yazılır.
-glcd_pixel(x,y,color)=x,y kordinatlarını pasif etmeye yarar.Color kısmına 'on'(siyah) ve 'of'(beyaz) komutları yazılır
-glcd_line(x1,y1,x2,y2,color)=x1,y1 ile x2,y2 arasında çizgi çizer.Color ilede çizgi rengi belirlenir
-glcd_rect(x1,y1,x2,y2,fill,color)=x1,y1 ile x2,y2 arasında dörtgen çizer.Fill komutu "yes" ise içi boyalı,"no" ise boyasız.Color ilede çubuk rengi belirlenır.
-glcd_bar(x1,y1,x2,y2,width,color)=x1,y1 ile x2,y2 arsında bar(çizgi) çizer.Width komutu ile bar kalınlıgı belirlenir.Color ile de çizgi rengi belirlenir.
-glcd_circle(x,y,radius,fill,color)=x,y kordinatlarında çember çizer.Radius ise çemberin yarıçapını belirtir.Fill ile çemberin içinin boyalı olup olmaması durumu kontrol edilir.Color ile de çizgi rengi belirlenir.
-glcd_text57(x,y,textptr,size,color)=x,y kordinatlarına ,textptr yerine girilen yazıyı yazar.Size yazının genişligindedir.5 piksel genişliginde ve 7 piksel yüksekligindedir.
Şekildeki gibi devremizi oluşturup kod kısmına geçiş yapalım;
#include<HDM64GS12.c>//HDM64GS12.c kütüphanemiz
#include<graphics.c>//graphics.c ile şekil çizmemize yara
char yazi1[]="Eren";
char yazi2[]="UZBAY";
int i,x1,y1,x2,y2;
void main()
{setup_psp(psp_disabled);
setup_timer_1(t1_disabled);
setup_timer_2(t2_disabled,0,1);
setup_adc_ports(no_analogs);
setup_adc(adc_off);
setup_ccp1(ccp_off);
setup_ccp2(ccp_off);
glcd_init(on);//lcd ekranımızı hazırladık ve sildik
while(TRUE)
{glcd_init(on);//lcd ekranımızı sildik
glcd_text57(40,15,yazi1,2,on);
glcd_text57(5,30,yazi2,3,on);
delay_ms(2000);
glcd_init(ON);
for(i=0;i<=25;i=i+5)
{glcd_circle(50,25,i,no,on);
delay_ms(1000);
}
glcd_init(on);
x1=5;y1=5;x2=120;y2=60;
for(i=0;i<6;i++)
{glcd_rect(x1,y1,x2,y2,no,on);
y1=x1+=5;
x2-=10;
y2-=5;
delay_ms(1000);
}
}
}
PİC PROGRAMLAMA-12
Merhaba arkadaşlar.Bugün aşşa yukarı her kavşakta trafik ışıgı görüyoruz.Bunun yazılım kısmını anlatacagım bugün.Şekilde görüldügü gibi devremizi olusturuyoruz.
Gelelim kod kısmına;
void main()
{
while(TRUE)
{delay_ms(100);//0,1 sn bekletmemin sebebi ilk başlattıgımız anda ilk satırı atlıyor
//bu atlamayı engellemek için bu komutu kullandım
output_high(pin_b6);//b6 pini aktif
output_high(pin_b0);//b0 pini aktif
delay_ms(2000);//2 sn bekle.Bu saniye kısmını kendınız ayarlayabılırsınız
output_low(pin_b0);//b0 pini pasif
output_low(pin_b6);//b6 pini pasif
delay_ms(1000);//1 sn bekle
output_high(pin_b1);//b1 pini aktif
output_high(pin_b5);//b5 pini aktif
delay_ms(2000);//2 sn bekle.
output_low(pin_b1);//b1 pini pasif
output_low(pin_b5);//b5 pini pasif
delay_ms(1000);//1 sn bekle
output_high(pin_b2);//b2 pini aktif
output_high(pin_b4);//b4 pini aktif
delay_ms(2000);//2 sn bekle.
output_low(pin_b2);//b2 pini pasif
output_low(pin_b4);//b4 pini pasif
delay_ms(1000);//1 sn bekle
}
}
PİC PROGRAMLAMA-11
Capture modunda RC1 ve RC2 pinine gelen sinyale göre
degerlendirilir.Bunlardan herhangi birisine sinyal geldiginde TMR1 kaydecisi
içerigi CCPRxH;CCPRxL içerigine aktarılır ve bir kesme meydana gelir.İkinci bir
yakalama olayı meydana geldiginde o anki TMR1 degeri içerigi tekrardan aktarılır,eski
CCPRxH;CCPRxL nin eski degerleri silinmiş olur.
-Sinyalin her düşen kenarında (ccp_capture_fe)
-Sinyalin her yükselen kenarında (ccp_capture_re)
-Sinyalin her 4 yükselen kenarından sonra (ccp_capture_div_4)
-Sinyalin her 16 yükselen kenarından sonra (ccp_capture_div_16)
Gelelim kod kısmına;
#include <main.h>
int i=0;
#int_ccp1//CCP1 KESMESİ
void yak() {i++;//i degeri birer birer arttırılıyor
output_b(i);//i degişkeni b portuna gönderiliyor
if(i==16)//i degişkeni 16 ya eşit ise
{i=15;//i yi 15 yap
output_b(i);//i degişkenini b portuna gönder
}}
#int_ccp2//CCP' KESMESİ
void sondur(){i--;//i degişkenin bir azalt
output_b(i);//i degişkenini b portuna gönder
if(i==0)//ii degişjenini kontrol et
{i=1;//i ye 1 degerini ata
output_b(i);//i degişkenini b portuna gönder
}}
void main()
{setup_ccp1(ccp_capture_re);//CCP1 kesmesi ayarlaması
setup_ccp2(ccp_capture_re);//CCP2 kesmesi ayarları
enable_interrupts(int_ccp1);//ccp1 kesmesi aktif ettik
enable_interrupts(int_ccp2);//ccp2 kesmesini aktif yaptık
enable_interrupts(global);//aktif yapılan kesmelere izin verdik
set_tris_b(0*00);//b pinlerinin çıkış oldugu ifade edildi
set_tris_c(0xff);//c pinlerinin giriş olacagı ifade edildi
output_b(0*00);//b çıkışımızı sıfırladık
ccp_1_high=0*00;ccp_1_low=0*00;//CCP1 kaydedicimizin içerigini sıfırladık
ccp_2_high=0*00;ccp_2_low=0*00;//CCP2 kaydedicimizin içerigini sıfırladık
while(TRUE)
{
//TODO: User Code
}
}
PİC PORGRAMLA-10
Merhaba
arkadaşlar.Bügünkü dersimizde Timer0 kesmesi ne demek onu anlatmaya
çalışacagım.Diyelim ki güzel bir film izliyorsunuz.Filmin en heyecanlı yerinde
telefonunuz çaldı.Filminizi durdurup telefonunuza bakarsınız.Ardından
kaldıgınız yerden filminizi izlemeye devam edersiniz.Kesme olayıda aynen bu
mantık üzeine çalışmaktadır. Kesme sinyali geldigi anda ana program çalışmayı
bırakıp kesme de yapılacak olan işlemlere gidiyor ve onları icra
ediyor.Ardından tekrardan ana programa geri dönüyor.16F877 ait kesme örnekleri;
1)RB0
kesmesi
2)RB4-RB7
pinlerindeki degişiklik kesmesi
3)Timer0
birimi taşma kesmesi
4)Timer1
birimi taşma kesmesi
5)Timer2
birimi taşma kesmesi
6)A/D
çevirimi yapıldıgında meydana gelen kesme
7)CCP1
modulu kesmesi
8)CCP2 modulu
kesmesi
9)Paralel
porttan veri geldiginde oluşan kesme
10)Seri
porttan veri geldiginde oluşan kesme
setup_timer_0(RTCC_EXT_H_TO_L | RTCC_DIV_2);
// Timer0 ayarları yapılıyor.
//RTCC_EXT_H_TO_L=+5
volttan 0 volta düşünce olacak
//RTCC_EXT_L_TO_H=0
volttan +5 volta çıkınca olacak olan kesme
//RTCC_INTERNAL=Denetleyicinin
çalışma frekansı olacak
//RTCC_DIV_2=bölme
oranın ifade eder(2,4,8,16,32...256 olarak yazılabilir)
set_timer0(254); // TMR0 değeri belirleniyor
enable_interrupts(INT_timer0); // int_timer0
kesmesini aktif yapar
enable_interrupts(GLOBAL); // Aktif edilen kesmelere izin ver
Gelelim kod kısmına;
#include
<16f877.h>
int sayi=0;
#int_timer0 // Timer0 kesmesi
void timer0_kesme () // Kesme fonksiyonu ismi
{
set_timer0(254); // TMR0 değeri belirleniyor
sayi++; // sayi değeri 1 arttrılıyor
output_b(sayi); // sayi değeri B portuna gönderiliyor
}
void main (
)
{
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_CCP1(CCP_OFF);
setup_CCP2(CCP_OFF);
set_tris_a(0x10); // RA4 pini giriş
set_tris_b(0x00); // B portu komple çıkış
output_b(0x00); // B portu çıkışı ilk anda sıfırlanıyor
setup_timer_0(RTCC_EXT_H_TO_L | RTCC_DIV_2);
// Timer0 ayarları yapılıyor
set_timer0(254); // TMR0 değeri belirleniyor
enable_interrupts(INT_timer0); // int_timer0
kesmesini aktif yapar
enable_interrupts(GLOBAL); // Aktif edilen kesmelere izin ver
while(true); // Sonsuz döngü
}
PİC PROGRAMLAMA -8
Merhaba arkadaşlar.Bugün ledler ile kalp animasyonu yapacagız.
Şekildeki gibi devremizi oluşturuyoruz. Ve gelelim kod kısmına :
int32 RND[]={0b00010001000100010001000100010001,//1-5-9-13-17-21-25-29 ledler yanacak
0b00110111011101110111011101110111,//4-8-12-16-20-24-26-30 ledler yanmayacak
0b00111111011111110111111101111111,//8-16-24 yanmayacak
0b00111111111111111111111111111111,//tüm ledler yanacak
};
void ShowAnimation(int32 anim)
{ output_a(anim);
output_b(anim >> 6);
output_c(anim >> 14);
output_d(anim >> 22);
}
int8 i;
void main()
{output_a(0*00);//a,b,c ve d portlarımız çıkış portumuz ve çıkışlarını lojik-0 olarak ayarladık
output_b(0*00);
output_c(0*00);
output_d(0*00);
set_tris_a(0*00);
set_tris_b(0*00);
set_tris_c(0*00);
set_tris_d(0*00);
delay_ms(100);
while(TRUE)
{
ShowAnimation(RND[3]);//rnd dizisininin 3 indisindeki degeri alacak ve çıkışa gönderecek
delay_ms(200);
ShowAnimation(RND[2]);//rnd dizisininin 2 indisindeki degeri alacak ve çıkışa gönderecek
delay_ms(200);
ShowAnimation(RND[1]);//rnd dizisininin 1 indisindeki degeri alacak ve çıkışa gönderecek
delay_ms(200);
ShowAnimation(RND[0]);//rnd dizisininin 0 indisindeki degeri alacak ve çıkışa gönderecek
delay_ms(200);
for(i=0;i<30;i++)
{delay_ms(500);
ShowAnimation(0xFFFFFFFF<<(30-i));//bu döngü son ledden başlyarak 1.lede kadar yakar
}
delay_ms(500);
for(i=0;i<30;i++)
{delay_ms(500);
ShowAnimation(0xFFFFFFFF>>i);//bu döngü son ledden başlayark 1.lede kadar söndürür
}
delay_ms(500);
for(i=0;i<30;i++)
{delay_ms(500);
ShowAnimation(0xFFFFFFFF>>(30-i));//bu döngü 1.ledden başlayarak son lede kadar sırayla ledlerı yakar
}
delay_ms(500);
for(i=0;i<30;i++)
{delay_ms(500);
ShowAnimation(0xFFFFFFFF<<i);//bu döngü 1.ledden başlayarak son lede kadar sırayla söndürür
}
delay_ms(500);
}
}
Merhaba arkadaşlar.Bugün ledler ile kalp animasyonu yapacagız.
Şekildeki gibi devremizi oluşturuyoruz. Ve gelelim kod kısmına :
0b00110111011101110111011101110111,//4-8-12-16-20-24-26-30 ledler yanmayacak
0b00111111011111110111111101111111,//8-16-24 yanmayacak
0b00111111111111111111111111111111,//tüm ledler yanacak
};
void ShowAnimation(int32 anim)
{ output_a(anim);
output_b(anim >> 6);
output_c(anim >> 14);
output_d(anim >> 22);
}
int8 i;
void main()
{output_a(0*00);//a,b,c ve d portlarımız çıkış portumuz ve çıkışlarını lojik-0 olarak ayarladık
output_b(0*00);
output_c(0*00);
output_d(0*00);
set_tris_a(0*00);
set_tris_b(0*00);
set_tris_c(0*00);
set_tris_d(0*00);
delay_ms(100);
while(TRUE)
{
ShowAnimation(RND[3]);//rnd dizisininin 3 indisindeki degeri alacak ve çıkışa gönderecek
delay_ms(200);
ShowAnimation(RND[2]);//rnd dizisininin 2 indisindeki degeri alacak ve çıkışa gönderecek
delay_ms(200);
ShowAnimation(RND[1]);//rnd dizisininin 1 indisindeki degeri alacak ve çıkışa gönderecek
delay_ms(200);
ShowAnimation(RND[0]);//rnd dizisininin 0 indisindeki degeri alacak ve çıkışa gönderecek
delay_ms(200);
for(i=0;i<30;i++)
{delay_ms(500);
ShowAnimation(0xFFFFFFFF<<(30-i));//bu döngü son ledden başlyarak 1.lede kadar yakar
}
delay_ms(500);
for(i=0;i<30;i++)
{delay_ms(500);
ShowAnimation(0xFFFFFFFF>>i);//bu döngü son ledden başlayark 1.lede kadar söndürür
}
delay_ms(500);
for(i=0;i<30;i++)
{delay_ms(500);
ShowAnimation(0xFFFFFFFF>>(30-i));//bu döngü 1.ledden başlayarak son lede kadar sırayla ledlerı yakar
}
delay_ms(500);
for(i=0;i<30;i++)
{delay_ms(500);
ShowAnimation(0xFFFFFFFF<<i);//bu döngü 1.ledden başlayarak son lede kadar sırayla söndürür
}
delay_ms(500);
}
}
Burada zaman ayarlaması ve animasyonlar üzerinde oynama yapabiliriz.
Devrenin proteus dosyasını isteyen arkadaşlar bize facebook üzerinden ulaşırlarssa seviniriz.
PIC PORGRAMALAMA-7
Merhaba arkadaşlar.Bugün karaşimşek devresini yapmayı anlatacagım sizlere.Pic programlama 1 de ki kodları kullanarak ta karaşimşek devresi yapılır.Fakat programcı mantıgını kavramış olmazssınız.Sadece zamanınızı boşa harcamış olursunuz.
Şekildeki devremizi oluşturup kod kısmına geçiş yapalım.
Şekildeki devremizi oluşturup kod kısmına geçiş yapalım.
Gelelim kod kısmımıza;
void main()
{int a,b;//a ve b adı altında 2 degişken tanımladık
while(true){b=1;//kaydırma işlemimiz için sayılsal deger atadık
for(a=0;a<8;a++)
{output_b(b);//b çıkışındaki ledleri yak
b=b<<1;//b yi 1 birim sola kaydır
delay_ms(100);//100 ms bekle
}}}
Bu projemizi 16f877 entegresi ile de gerçekleştirebiliriz arkdaşlar.