Moderadores: andre_luis, 51, guest2003, Renie
void LIB74595_enviaByte(unsigned char dado){
for(unsigned char i=0;i<8;i++){
SET_LED_DATA(0);
if(dado&(0x01<<i))
SET_LED_DATA(1);
BLOCO_NOP;
SET_LED_CLOCK(1);
//vTaskDelay(1);
BLOCO_NOP;
SET_LED_CLOCK(0);
//vTaskDelay(1);//
BLOCO_NOP;
}
SET_LED_STROBE(1);
//vTaskDelay(1);//
BLOCO_NOP;
SET_LED_STROBE(0);
//vTaskDelay(1);//
BLOCO_NOP;
}
// Estes defines servem somente prá deixar o código mais bonito
#define RESET PIN_B0
#define LATCH PIN_B1
#define CLOCK PIN_B2
#define DATA PIN_B3
// Faz um reset no pino Master Reset, colocando ele em nível baixo e depois mantendo em nivel alto
output_low(RESET);
delay_us(10);
output_high(RESET);
// Inicializo o pino Shift Clock e Latch Clock em nível baixo
output_low(CLOCK);
output_low(LATCH);
// Esta função recebe um valor de 8 bits, e envia bit por bit pelo pino RB3 ao 74595
void envia_595(unsigned char dado)
{
unsigned char cont; // Contador que vai de 0 a 7 para enviar os bits
unsigned char mascara = 1; // Mascara que verifica se o bit é 0 ou 1
for(cont = 0; cont < 8; cont++)
{
if(dado & mascara) // Esta operação AND tem valor 0 se o bit em questão é 0, e tem valor diferente de zero se for 10
output_high(DATA); // Se a operação anterior foi diferente de zero, então o bit é 1, coloco a linha DATA em nível alto
else
output_low(DATA); // Caso contrário, o bit em questão é zero, por isso coloco o pino DATA em nível baixo
// Gero uma sequência de clock no pino Shift Clock
output_high(CLOCK);
delay_us(5);
output_low(CLOCK);
mascara = mascara << 1; // Rotaciono a mascara uma vez para a direita, assim na próxima iteração do laço, pega o próximo bit
}
// Gero uma sequência de clock no pino Latch Clock]
output_high(LATCH);
delay_us(5);
output_low(LATCH);
}
eloyfm escreveu:OK. Essa parte eu entendi.
eu sei fazer com um canal de IOs.. tipo.. B.. então teria 8 entradas, mas não sei conseguir mais de
8 entradas e refletir nessa variavel para obter os 12 LEDS acesos..
Outra coisa é a mais importante.. Como usarei essa variavel no codigo ?
onde devo coloca-la...?
grato
#use delay (clock=8000000) /*Definição da frequência do cristal para cálculo
..dos delays*/
#fuses HS, NOWDT, PUT,BROWNOUT, NOLVP //Configuração dos bits de controle
#use fast_io(C)
#DEFINE DATA PIN_C7
#DEFINE CLOCK PIN_C6
#DEFINE SHIFTER PIN_C4
#DEFINE MR PIN_C5
//UNSIGNED CHAR NUM_BIT;
VOID ATUALIZA_SHIFT(UNSIGNED CHAR DADO);
void main()
{
SET_TRIS_C(0B00000000);
while (1) //Loop principal
{
//ATUALIZA_SHIFT(0b00000000);
//DELAY_MS(300);
ATUALIZA_SHIFT(0B00000000);
DELAY_MS(300);
}
}
VOID ATUALIZA_SHIFT(UNSIGNED CHAR DADO)
{
UNSIGNED CHAR NUM_BIT;
FOR(NUM_BIT=128;NUM_BIT<<0;NUM_BIT=NUM_BIT/2)
{
IF((DADO >=1)&& (NUM_BIT==1)) OUTPUT_BIT(DATA,1);
ELSE OUTPUT_BIT(DATA,0);
OUTPUT_BIT(CLOCK,1);
DELAY_MS(100);
OUTPUT_BIT(CLOCK,0);
OUTPUT_BIT(SHIFTER,1);
DELAY_MS(100);
OUTPUT_BIT(SHIFTER,0);
//OUTPUT_BIT(MR,0);
//DELAY_MS(10);
//OUTPUT_BIT(MR,1);
}
}
eloyfm escreveu:Ok. Obrigado. Eu acho que não me expliquei direito.
Eu tenho esse hardware montado e até consigo testar com um PIC.
...
#define dado RB0
#define clock RB1
#define latch RB2
void saida595(unsigned char d)
{
unsigned char i=8;
PORTB=0;
while(i--)
{
dado=d;
clock=1;
asm("nop");
//asm("nop");//acrescente alguns
clock-0;
dado>>=1;
}
latch=1;
asm("nop");
//asm("nop");//acrescente alguns
latch=0;
}
void saida595(unsigned char dado)
{
while(SSPSTAT.BF);//ou while (BF);
SSBUF=dado;
}
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante