sábado, 20 de agosto de 2022

Gigantesco secuenciador de luces de 22 salidas programado en mikroc en un PIC16F876A




Esquema:



El codigo de la secuencia lo puedes ver a continuacion:

   #include <built_in.h>

   #define bts 5

//*******************************************************

// Esta rutina es la encargada de sacar a los tres puertos 22 lineeas los datos

   void Sout(unsigned long dato){

   portb=lo(dato);

   portc=hi(dato);

   porta=Higher(dato);

   }

//*******************************************************

// Esta rutina es la encargada de sacar a los tres puertos 22 lineeas los datos

   void saca(unsigned long dato){

   if(dato==0){return;}

   portb=lo(dato);

   portc=hi(dato);

   porta=Higher(dato);

   delay_ms(75);

   }

//*******************************************************

// Saca los datos con retardo segun variable

   void saca2(unsigned long dato, unsigned short t){

   unsigned short j;

   if(dato==0){return;}

   portb=lo(dato);

   portc=hi(dato);

   porta=Higher(dato);

   for(j=0;j<t;j++){delay_ms(1);}

   }

//*******************************************************

//Saca los datos invertidos al puerto leds a tierra

 void DSaca(unsigned long dato){

   dato=~dato;

   portb=lo(dato);

   portc=hi(dato);

   porta=Higher(dato);

 }

//*******************************************************

// Mueve los datos recividos secuencialmente a la derecha

  void Sec_rp(unsigned long dato, unsigned short x){

  unsigned long  dat;

  unsigned short j;

   dat=dato;

   for(j=0;j<22;j++){

   saca(dat);

   dat>>=x;

   delay_ms(100);

   }

  }

  

//*******************************************************

// Mueve los datos recividos secuencialmente a la derecha invertidos

  void Sec_rp_(unsigned long dato){

  unsigned long  dat;

  unsigned short j;

   dat=dato;

   for(j=0;j<22;j++){

   DSaca(dat);

   dat>>=1;

   delay_ms(150);

   }

  }

//*******************************************************

// Mueve los datos recividos secuencialmente a la izquierda invertidos

  void Sec_rp_2(unsigned long dato){

  unsigned long  dat;

  unsigned short j;

   dat=dato;

   for(j=0;j<22;j++){

   DSaca(dat);

   dat<<=1;

   delay_ms(150);

   }

  }

//*******************************************************

// Mueve los datos recividos secuencialmente a la derecha

  void Sec_r(unsigned long dato){

  unsigned long  dat;

  unsigned short j;

   dat=dato;

   for(j=0;j<22;j++){

   saca(dat);

   dat>>=1;

   }

  }

  

// Rutina igual que hace las salidas intermitentes

  void Sec_ri(unsigned long dato){

  unsigned long  dat;

  unsigned short j;

   dat=dato;

   for(j=0;j<22;j++){

   saca(dat);

   saca(0);

   dat>>=1;

   }

  }


// Complemento de la primera para repetirla 4 veses

     void secuenciador_r(unsigned long dato){

     unsigned short j;

     for(j=0;j<bts;j++){Sec_r(dato);}

     }

//_________________________________________________________

//*******************************************************

// Mueve los datos recividos secuencialmente a la izquierda

  void Sec_l(unsigned long dato){

  unsigned long  dat;

  unsigned short j;

   dat=dato;

   for(j=0;j<22;j++){

   saca(dat);

   dat<<=1;

   }

  }

// Rutina igual que hace las salidas intermitentes

  void Sec_li(unsigned long dato){

  unsigned long  dat;

  unsigned short j;

   dat=dato;

   for(j=0;j<22;j++){

   saca(dat);

   saca(0);

   dat<<=1;


   }

  }


// Complemento de la primera para repetirla 4 veses

     void secuenciador_l(unsigned long dato){

     unsigned short j;

     for(j=0;j<bts;j++){Sec_l(dato);}

     }

//_________________________________________________________

//*******************************************************

// COnvina dos secuencias para asi obtener la secuencia del auto fantastico

  void Sec_rl(unsigned long dato1,unsigned long dato2){

  unsigned short j;

  for(j=0;j<bts;j++){

  Sec_r(dato1);

  Sec_l(dato2);

   }

  }

  void Sec_rli(unsigned long dato1,unsigned long dato2){

  unsigned short j;

  Sec_ri(dato1);

  Sec_li(dato2);

  }

//_________________________________________________________

//*******************************************************

// Esta secuencia va encendiendo las luces una tras la otra a la izquierda

  void ll_r(){

  unsigned long dato;

  unsigned short j;

  dato=0b0000000000000000000001;

  for(j=0;j<22;j++){

  saca(dato);

  dato=dato | (dato<<1);

  }

  }

//*****************************************

  void ll_r2(unsigned long ldx,unsigned short lrx, unsigned short t, unsigned short llo){

  unsigned long dato;

  unsigned short j,i;

  dato=ldx;

  for(j=0;j<llo;j++){

  saca2(dato,t);

  for(i=0;i<lrx;i++){dato=dato | (dato<<1);}

  }

  }

// Complemento de la anterior para repetirla 4 veses

     void llenado_r(){

     unsigned short j;

     for(j=0;j<bts;j++){ll_r();delay_ms(100);}

     }


// Mescla de llenado con secuenciador

  void degradado1(){

  unsigned short j;

  for(j=0;j<bts;j++){

  Sec_r(0b1111111111111111111111);

  ll_r();

   }

  }

//_________________________________________________________

//*******************************************************

// Esta secuencia va encendiendo las luces una tras la otra a la derecha

  void ll_l(){

  unsigned long dato;

  unsigned short j;

  dato=0b1000000000000000000000;

  for(j=0;j<22;j++){

  saca(dato);

  dato=dato | (dato>>1);

  }

  }


//*******************************************************

// Esta secuencia va encendiendo las luces una tras la otra a la derecha

  void ll_l2(unsigned long ldx,unsigned short lrx, unsigned short t, unsigned short llo){

  unsigned long dato;

  unsigned short j,i;

  dato=ldx;

  for(j=0;j<llo;j++){

  saca2(dato,t);

  for(i=0;i<lrx;i++){dato=dato | (dato>>1);}

  }

  }


// Complemento de la anterior para repetirla 4 veses

     void llenado_l(){

     unsigned short j;

     for(j=0;j<bts;j++){ll_l();delay_ms(100);}

     }

// Mescla de llenado con secuenciador

  void degradado2(){

  unsigned short j;

  for(j=0;j<bts;j++){

  Sec_l(0b1111111111111111111111);

  ll_l();

   }

  }


//_________________________________________________________

//*******************************************************

// mescla secuencias a la derecha y la izquierda para ver luces que se cruzan

  void combinado(unsigned long dato1,unsigned long dato2){

  unsigned long dx,dx1,dx2 ;

  unsigned short j,i;

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

  dx1=dato1;

  dx2=dato2;

  for(j=0;j<26;j++){

  dx=dx1 | dx2;

  saca(dx);

  dx1>>=1;

  dx2<<=1;

  }

  }

  }

//_________________________________________________________

//*******************************************************

 void conv_1(unsigned long dato1){

  unsigned long dx,dx1,dx2 ;

  unsigned short j,i;


  dx1=dato1;

  for(j=0;j<22;j++){

  dx2=dato1;

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

  dx=dx1 | dx2;

  saca(dx);

  dx2>>=1;

  }

  dx1>>=1;

  }

 }

 //_________________________________________________________

//*******************************************************

 void conv_1inv(unsigned long dato1){

  unsigned long dx,dx1,dx2 ;

  unsigned short j,i;


  dx1=dato1;

  for(j=0;j<22;j++){

  dx2=dato1;

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

  dx=dx1 | dx2;

  saca(dx);

  dx2<<=1;

  }

  dx1<<=1;

  }

 }

//_________________________________________________________

//*******************************************************

 void conv_2(unsigned long dato1){

  unsigned long dx,dx1,dx2 ;

  unsigned short j,i;


  dx1=dato1;

  for(j=0;j<22;j++){

  dx2=dx1;

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

  dx=dx1 | dx2;

  saca(dx);

  dx2>>=1;

  }

  dx1>>=1;

  }

 }

//_________________________________________________________

//*******************************************************

 void conv_2inv(unsigned long dato1){

  unsigned long dx,dx1,dx2 ;

  unsigned short j,i;


  dx1=dato1;

  for(j=0;j<22;j++){

  dx2=dx1;

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

  dx=dx1 | dx2;

  saca(dx);

  dx2<<=1;

  }

  dx1<<=1;

  }

 }

//_________________________________________________________

//*******************************************************

 void conv_3(unsigned long dato1){

  unsigned long dx,dx1,dx2 ;

  unsigned short j,i,r;


  dx1=dato1;

  dx=dato1;

  r=22;

  for(j=0;j<22;j++){

  dx2=dx;

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

  saca(dx1 | dx2);

  dx2>>=1;

  }

  dx1= dx1 | (dx1>>1);

  dx>>=1;

  r--;

  }

 }


//_________________________________________________________

//*******************************************************

 void conv_3Inv(unsigned long dato1){

  unsigned long dx,dx1,dx2 ;

  unsigned short j,i,r;


  dx1=dato1;

  dx=dato1;

  r=22;

  for(j=0;j<22;j++){

  dx2=dx;

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

  saca(dx1 | dx2);

  dx2<<=1;

  }

  dx1= dx1 | (dx1<<1);

  dx<<=1;

  r--;

  }

 }

//_________________________________________________________

//*******************************************************

  void conv_4(unsigned long dato){

  unsigned long  dat,dat1=0;

  unsigned short j, jf, i;


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

   dat=dato;

   for(j=1;j<22-i;j++){

   saca(dat | dat1);

   dat>>=1;

   }

   dat1=dat1 | dat;

   }

  }


//_________________________________________________________

//*******************************************************

  void conv_4_inv(unsigned long dato){

  unsigned long  dat,dat1=0;

  unsigned short j, jf, i;


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

   dat=dato;

   for(j=1;j<22-i;j++){

   saca(dat | dat1);

   dat<<=1;

   }

   dat1=dat1 | dat;

   }

  }


//*******************************************************

  void conv_5(unsigned long dato){

  unsigned long  dat,dat1=0;

  unsigned short j, jf, i;


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

   dat=dato;

   for(j=1;j<i;j++){

   saca(dat | dat1);

   dat>>=1;

   }


   }

  }


//*******************************************************

  void conv_5_inv(unsigned long dato){

  unsigned long  dat,dat1=0;

  unsigned short j, jf, i;


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

   dat=dato;

   for(j=1;j<i;j++){

   saca(dat | dat1);

   dat<<=1;

   }


   }

  }


//_________________________________________________________

//*******************************************************

  void DelVar(unsigned short t){

   unsigned short j;

   for(j=0;j<t;j++){

    delay_us(100);

   }


  }

//*******************************************************

  void brillo(){

  unsigned long dato;

  unsigned short j;

  for(j=0;j<255;j++){

  DSaca(0);

  DelVar(j);

  DSaca(~0);

  Delvar(256-j);

  }

  for(j=0;j<255;j++){

  DSaca(~0);

  DelVar(j);

  DSaca(0);

  Delvar(256-j);

  }


  }

//_________________________________________________________

//*******************************************************

//_________________________________________________________

//*******************************************************

//_________________________________________________________

//*******************************************************

  void ll_f1(){

  unsigned long dato1, dato2;

  unsigned short j;

  dato1=0b0000000000000000000001;

  dato2=0b1000000000000000000000;

  for(j=0;j<11;j++){

  saca(dato1 | dato2);

  dato1=dato1 | (dato1<<1);

  dato2=dato2 | (dato2>>1);

  }

  }

//*******************************************************

  void ll_f2(){

  unsigned long dato1, dato2;

  unsigned short j;

  dato1=0b0000000000000000000001;

  dato2=0b1000000000000000000000;

  for(j=0;j<5;j++){

  dato1=dato1 | (dato1<<1);

  dato1=dato1 | (dato1<<1);

  dato2=dato2 | (dato2>>1);

  dato2=dato2 | (dato2>>1);

  saca2(dato1 | dato2,250);

  }

  }

//*******************************************************

  void ll_f3(){

  unsigned long dato1, dato2;

  unsigned short j;

  dato1=0b0000000000000000000001;

  dato2=0b1000000000000000000000;

  for(j=0;j<4;j++){

  dato1=dato1 | (dato1<<1);

  dato1=dato1 | (dato1<<1);

  dato1=dato1 | (dato1<<1);

  dato2=dato2 | (dato2>>1);

  dato2=dato2 | (dato2>>1);

  dato2=dato2 | (dato2>>1);

  saca2(dato1 | dato2,250);

  }

  }

//*******************************************************

  void ll_f1_inv(){

  unsigned long dato1, dato2;

  unsigned short j;

  dato1=0b0000000000011111111111;

  dato2=0b1111111111100000000000;

  for(j=0;j<11;j++){

  saca(dato1 | dato2);

  dato1=dato1>>1;

  dato2=dato2<<1;

 }

 }

//*******************************************************

  void ll_f2_inv(){

  unsigned long dato1, dato2;

  unsigned short j;

  dato1=0b0000000000011111111111;

  dato2=0b1111111111100000000000;

  for(j=0;j<7;j++){

  saca2(dato1 | dato2,250);

  dato1=dato1>>1;

  dato1=dato1>>1;

  dato2=dato2<<1;

  dato2=dato2<<1;

 }

 }

//*******************************************************

  void ll_f3_inv(){

  unsigned long dato1, dato2;

  unsigned short j;

  dato1=0b0000000000011111111111;

  dato2=0b1111111111100000000000;

  for(j=0;j<5;j++){

  saca2(dato1 | dato2,250);

  dato1=dato1>>1;

  dato1=dato1>>1;

  dato1=dato1>>1;

  dato2=dato2<<1;

  dato2=dato2<<1;

  dato2=dato2<<1;

 }

 }

//*******************************************************

  void ll_f4(unsigned long dat1, unsigned long dat2, unsigned short t, unsigned short x){

  unsigned long dato1, dato2;

  unsigned short j, i;

  dato1=dat1;

  dato2=dat2;

  for(j=0;j<11;j++){

  saca2((dato1 | dato2),t);

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

  dato1=dato1 | (dato1>>1);

  dato2=dato2 | (dato2<<1);

  }

 }

 }

//*******************************************************

void desord(){

Sout(0b0000010000000000000000); delay_ms(100);

Sout(0b0000010000001000000000); delay_ms(100);

Sout(0b0000010000001000100000); delay_ms(100);

Sout(0b0000010000001000100100); delay_ms(100);

Sout(0b0000010000001000100100); delay_ms(100);

Sout(0b0010010000001000100100); delay_ms(100);

Sout(0b0010010000101000100100); delay_ms(100);

Sout(0b0010010100101000100100); delay_ms(100);

Sout(0b0010010000101000100100); delay_ms(100);

Sout(0b0010110000101000100100); delay_ms(100);

Sout(0b0010010000101100100100); delay_ms(100);

Sout(0b0010010010101100100100); delay_ms(100);

Sout(0b0010010110101100100100); delay_ms(100);

Sout(0b1010010110101100100100); delay_ms(100);

Sout(0b1010010110111100100100); delay_ms(100);

Sout(0b1010010110111101100100); delay_ms(100);

Sout(0b1011010110111101100100); delay_ms(100);

Sout(0b1011010110111101101100); delay_ms(100);

Sout(0b1011010110111101101101); delay_ms(100);

Sout(0b1011010111111101101101); delay_ms(100);

Sout(0b1111010111111101101101); delay_ms(100);

Sout(0b1111010111111101101111); delay_ms(100);

Sout(0b1111011111111101101111); delay_ms(100);

Sout(0b1111011111111101111111); delay_ms(100);

Sout(0b1111111111111101111111); delay_ms(100);

Sout(0b1111111111111111111111); delay_ms(100);

Sout(0b1111111111011111111111); delay_ms(100);

Sout(0b1111111111011111101111); delay_ms(100);

Sout(0b1111111101011111101111); delay_ms(100);

Sout(0b1110111101011111101111); delay_ms(100);

Sout(0b1110111101011111101011); delay_ms(100);

Sout(0b1110101101011111101011); delay_ms(100);

Sout(0b1110101101011100110101); delay_ms(100);

Sout(0b1110101100011100110101); delay_ms(100);

Sout(0b1110101100010100110101); delay_ms(100);

Sout(0b1010101100010100110101); delay_ms(100);

Sout(0b1010101100010100010101); delay_ms(100);

Sout(0b1010101100010100000101); delay_ms(100);

Sout(0b1010101100010100000100); delay_ms(100);

Sout(0b1010101100010100000100); delay_ms(100);

Sout(0b1010101000010100000100); delay_ms(100);

Sout(0b1010101000010000000100); delay_ms(100);

Sout(0b1000101000010000000100); delay_ms(100);

Sout(0b1000101000000000000100); delay_ms(100);

Sout(0b0000101000000000000100); delay_ms(100);

Sout(0b0000100000000000000100); delay_ms(100);

Sout(0b0000000000000000000100); delay_ms(100);

Sout(0b0000000000000000000000); delay_ms(100);

}


//*******************************************************

void main(){

unsigned long sex, sey, dato1, dato2;

unsigned short j,i;

   adcon1=0x06;

   portb=0; porta=0; portc=0;

   trisa=0; trisb=0; trisc=0;

   

   i=eeprom_read(0x00); if(i==0){while(1);} i--; eeprom_write(0x00,i);



while(1){

for(j=0;j<10;j++){Sout(0b1111111111111111111111);delay_ms(500);Sout(0);delay_ms(500);}

for(j=0;j<45;j++){Sout(0b0101010101010101010101);delay_ms(100);Sout(0b1010101010101010101010);delay_ms(100);}

for(j=0;j<2;j++){brillo();}

for(j=0;j<10;j++){ll_f1();}

for(j=0;j<2;j++){Sec_rl(0b1111111111000000000000,0b0000000000001111111111);}

for(j=0;j<6;j++){desord();}

for(j=0;j<10;j++){Sec_rp(0b1111111111111111111111,2);}

for(j=0;j<5;j++){combinado(0b1111100000000000000000, 0b0000000000000000011111);}

llenado_l();

llenado_r();

for(j=0;j<10;j++){Sec_rp_ (0b1100000000000000000000);}

for(j=0;j<10;j++){Sec_rp_2(0b0000000000000000000011);}

}

}