74HC595 Entegresi ile LED Animasyonu

74hc595Animasyon

Bu uygulamada aşağıdaki programlama teknikleri kullanılmıştır.

1-      Bit tanımlama,

2-      PORTB Change (değişim) kesmesi,

3-      Çoklu buton uygulaması,

4-      74HC595 entegresini sürme,

5-      Dahili Pull-Up dirençlerinin kullanımı,

6-      C programı içinde asm kullanımı.

74HC595 entegresi shift register entegresidir. Girişinden uygulanan seri bilgiye çıkışlarına paralel olarak aktarır. Veri en büyük değerlikli bitten (MSB), en küçük değerlikli bite(LSB) doğru kaydırılarak yüklenir.

Entegrenin veri iletimi için kullanılan üç pini vardır. Bunlar DS ( Data giriş pini), SH_CP (Data girişindeki  biti kaydırma clock palsi),  ST_CP(8 adet bit girişi yapıldıktan sonra çıkışa gönderme clock palsi).

Entegrenin MR (Master Reset ) pini VDD’ye, OE (Output Enable-Çıkışa izin ver) pini GND’ye bağlanır. Aşağıdaki C fonksiyonu giriş olarak girilen bir bytelık (char) parametre değişkenin değerini entegre çıkışına taşımaktadır. Q7′ pini ise birden fazla 74595 entegresi kullanıldığında sonraki entegrenin DS pinine bağlanır. Bu şekilde çıkış pinlerini arttırmış oluruz.

void veriYaz595(char veri)
{
  char i=0;
  ST_CP=0;
  SH_CP=0;
  DS=0;
  for(i=0;i<8;i++)
  {
    if(veri.B7) DS=1;
     else       DS=0;
    SH_CP=1;
    asm{NOP;NOP;NOP;NOP;NOP;}
    SH_CP=0;
    veri<<=1;
 }
 ST_CP=1;
 asm{NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;}
 ST_CP=0;
}

Fonksiyonun açıklamasını yapacak olursak;

fonksiyon içinde lokal char tipinde i değişkeni tanımlanmış ve ilk değeri 0 atanmış.
Entegre iletişim pinleri Low’a çekilmiş.

Verinin MSB biti if komutuyla sorgulanarak DS bitine atanmış. Clock plasi “1” yapılıp 5 us bekleme yapıldıktan sonra “0” yapılarak bir pals gönderilmiş.

Daha sonra 6. bit sola kaydırılarak (7. bit yapılıyor) 6. bit gönderililiyor. Bu şekilde 8-bit for döngüsü içinde gönderiliyor.

Bütün bitler (8-bit) gönderildikten sonra ST_CP girişine clock palsi gönderiliyor ve sonuç çıkış pinlerinde görünüyor. Çıkış pinlerindeki bilgi girişten değiştirilmediği sürece değerini korur (Latch).

Programın devre şeması aşağıda görülmektedir.

ledAnimasyon_8ed

Programın kodları aşağıdadır.

#define M0 PORTB.B4
#define M1 PORTB.B5
#define M2 PORTB.B6
#define M3 PORTB.B7
#define SH_CP PORTA.B0
#define DS PORTA.B1
#define ST_CP PORTA.B2

bit YON;
char mod=0, sayi=0;

//----------------------------------
void veriYaz595(char veri)
{
 char i=0;
 ST_CP=0;
 SH_CP=0;
 DS=0;
 for(i=0;i<8;i++)
 {
   if(veri.B7) DS=1;
    else       DS=0;
   SH_CP=1;
   asm{NOP;NOP;NOP;NOP;NOP;}
   SH_CP=0;
   veri<<=1;
 }
 ST_CP=1;
 asm{NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;}
 ST_CP=0;
}
//---------Animasyon 0--------
void animasyon_0()
{
 char i=0;
 sayi=1;
 while(mod==0)
 {
   sayi=0xFF;
   veriYaz595(sayi);
   Delay_ms(500);
   sayi=0;
   veriYaz595(sayi);
   Delay_ms(500);
 }
 veriYaz595(0);
}
//---------Animasyon 1 --------
void animasyon_1()
{
 char i=0;
 sayi=1;
 while(mod==1)
 {
   veriYaz595(sayi);
   Delay_ms(300);
   if(sayi==1)   YON=0;
   if(sayi==128) YON=1;
   if(!YON) sayi<<=1;
     else   sayi>>=1;
 }
 veriYaz595(0);
}
//---------Animasyon 2 --------
void animasyon_2()
{
 char i=0;
 sayi=1;
 while(mod==2)
 {
   sayi=0b10000001;
   veriYaz595(sayi);
   Delay_ms(300);
   sayi=0b01000010;
   veriYaz595(sayi);
   Delay_ms(300);
   sayi=0b00100100;
   veriYaz595(sayi);
   Delay_ms(300);
   sayi=0b00011000;
   veriYaz595(sayi);
   Delay_ms(300);
   sayi=0b00100100;
   veriYaz595(sayi);
   Delay_ms(300);
   sayi=0b01000010;
   veriYaz595(sayi);
   Delay_ms(300);
 }
 veriYaz595(0);
}
//---------Animasyon 3 --------
void animasyon_3()
{
 char i=0;
 while(mod==3)
 {
   sayi=0xAA;
   veriYaz595(sayi);
   Delay_ms(300);
   sayi=0x55;
   veriYaz595(sayi);
   Delay_ms(300);
 }
 veriYaz595(0);
}
//---------Animasyon 4 --------
void animasyon_4()
{
 char i=0;
 sayi=254;
 while(mod==4)
 {
   veriYaz595(sayi);
   Delay_ms(300);
   sayi<<=1;
   if(sayi==0)
   {
     veriYaz595(sayi);
     Delay_ms(300);
     sayi=128;
     veriYaz595(sayi);
     Delay_ms(300);
     sayi=0b11000000;
     veriYaz595(sayi);
     Delay_ms(300);
     sayi=0b11100000;
     veriYaz595(sayi);
     Delay_ms(300);
     sayi=0b11110000;
     veriYaz595(sayi);
     Delay_ms(300);
     sayi=0b11111000;
     veriYaz595(sayi);
     Delay_ms(300);
     sayi=0b11111100;
     veriYaz595(sayi);
     Delay_ms(300);
     sayi=0b11111110;
     veriYaz595(sayi);
     Delay_ms(300);
     sayi=0b11111111;
     veriYaz595(sayi);
     Delay_ms(300);
   }
 }
 veriYaz595(0);
}
//-----------------------------
void interrupt()
{
 if(INTCON.RBIF)
 {
   INTCON.RBIF=0;
   if(!M0) mod=1;
   if(!M1) mod=2;
   if(!M2) mod=3;
   if(!M3) mod=4;
 }
}

void kurulum()
{
 CMCON=7;
 TRISA=0;
 TRISB=0xF0;
 OPTION_REG.B7=0;
 PORTA=0;
 PORTB=0;
 INTCON.GIE=1;
 INTCON.RBIE=1;
 INTCON.RBIF=0;
}
void main()
{
 kurulum();
 animasyon_0();
 do
 {
   if(mod==1) animasyon_1();
   if(mod==2) animasyon_2();
   if(mod==3) animasyon_3();
   if(mod==4) animasyon_4();
 }while(1);
}

Devrenin çalışması ile ilgili similasyon aşağıda görülmektedir.

Proje dosyalarına buradan ulaşabilirsiniz.

Hoşça kalın…

Reklamlar

One thought on “74HC595 Entegresi ile LED Animasyonu

  1. Geri bildirim: ADC Keypad (Analog Klavye) | elektrokod

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s