Lellis, meu primeiro teste eu fiz bem parecido com o que vc falou com referencia a 3 rotações de 8, mas dai começo a dar erradao e modifiquei o prog e fico esse coco. hehe Consegui fazer funcionar da maneira que vc falou, tirei a variável "A" usei somente CA mesmo sei la de onde que eu tirei esse A, bom pelo menos no simulador funcionou, rotacionou direitinho para os dois lados, mas na placa não, hehe vou ter que ver aqui e vou refazer a placa.
Segue o prog da maneira que funcionou:
- Código: Selecionar todos
//INICIO SAIDAS //DEFINE SAÍDAS
#define CLOCK PORTA.B2 //PINO RA2->LINHA DE CLOCK 74HC164
#define DATA PORTA.B3 //PINO RA3->LINHA DE DADOS 74HC164
//FIM SAIDAS
//------------------
void DESLOCA1BYTE(unsigned char A)
{
unsigned char I;
for (I=0;I<8;I++)
{
DATA=A;
CLOCK=1;
CLOCK=0;
A>>=1;
}//FOR
}//DESLOCA1BYTE
void DESLOCA3BYTES(unsigned char A,unsigned char B,unsigned char C)
{
DESLOCA1BYTE(A);
DESLOCA1BYTE(B);
DESLOCA1BYTE(C);
}// DESLOCA3BYTES
void main()
{
unsigned char CA, TESTE1, TESTE2, TESTE3;
TRISA=0b11110011;
TRISB=0b00000000;
CMCON=0X07;
PORTA=0;
PORTB=0;
TESTE1=255;
TESTE2=255;
TESTE3=255;
CLOCK=0;
DESLOCA3BYTES(TESTE1, TESTE2, TESTE3);
DELAY_MS(1000);
while (1)
{
for(CA=0;CA<24;CA++)
{
if (CA<8) TESTE1>>=1;
if ((CA>7 && CA<16)) TESTE2>>=1;
if (CA>15) TESTE3>>=1;
DESLOCA3BYTES(TESTE1, TESTE2, TESTE3);
DELAY_MS(1000);
}//FOR
DELAY_MS(1000);
TESTE1=1;
TESTE2=1;
TESTE3=1;
DESLOCA3BYTES(TESTE1, TESTE2, TESTE3);
DELAY_MS(1000);
for(CA=0;CA<24;CA++)
{
if (CA<8) TESTE1<<=1;
if ((CA>7 && CA<16)) TESTE2<<=1;
if (CA>15) TESTE3<<=1;
DESLOCA3BYTES(TESTE1, TESTE2, TESTE3);
DELAY_MS(1000);
}
}
}