Moderadores: andre_luis, 51, guest2003, Renie
alessandrotga escreveu:Olá galera, eu sou novo aqui no forum e também sou novo em programação com PIC. Aprendi na facudade e agora estou colocando em prática já vai fazer uns 2 meses.
Peguei vários projetos e até agora estava indo bem, até eu pegar um painel com 144 LEDS que devem ser controlados individualmente. Existe outras funções de comunicação e entrada a dispositivo externo, como teclado numérico e LCD. Há um protocolo de comunicação e torna o programa já bem extenso.
Quando cheguei na parte de controlar os 144 LEDs eu não tenho mais espaço na memória de programa. Estou utilizando o PIC16F877a, os 144LEDs podem apresentar 3 status, piscando lento, piscando rápido e aceso. Estava controlando os primerios 2 LEDs com Timer1.
O que eu preciso é o seguinte: Eu como programador sei que devido a experiência, podemos ter uma menor quantidade de linhas. Eu gostaria de saber qual o melhor método que eu deveria seguir para controlar os LEDs individualmente.
#include <stdio.h>
#define LED_OFF 0
#define LED_BLINK_SLOW 1
#define LED_BLINK_FAST 2
#define LED_ON 3
unsigned char buffer[36];
unsigned char get_led(unsigned char led)
{
unsigned char shift = (led&3)<<1;
unsigned char mask = (0x03<<shift);
return (buffer[led>>2] & mask) >> shift;
}
void set_led(unsigned char led, unsigned char value)
{
unsigned char shift = (led&3)<<1;
unsigned char mask = ~ (0x03 << shift);
value = value<<shift;
buffer[led>>2] = (mask & buffer[led>>2]) | value;
}
void refresh()
{
unsigned char i;
unsigned char v;
static unsigned char slow;
static unsigned char fast;
static unsigned blink_slow;
static unsigned blink_fast;
if(!slow--)
{
slow=49;
blink_slow = !blink_slow;
}
if(!fast--)
{
fast=4;
blink_fast = !blink_fast;
}
printf("\33[2J\33[H");
for(i=0;i!=144;i++)
{
if(i%12==0 && i!=0)
{
printf("\n");
}
v = get_led(i);
switch(v)
{
case LED_ON:
printf("O ");
break;
case LED_BLINK_SLOW:
printf(blink_slow?"S ":". ");
break;
case LED_BLINK_FAST:
printf(blink_fast?"F ":". ");
break;
default:
printf(". ");
break;
}
}
printf("\n");
}
int main()
{
unsigned char i;
unsigned char v;
for(i=0;i!=144;i++)
{
set_led(i,LED_OFF);
}
set_led(0,LED_BLINK_SLOW);
set_led(1,LED_BLINK_FAST);
set_led(2,LED_ON);
set_led(3,LED_ON);
set_led(10,LED_BLINK_SLOW);
set_led(21,LED_BLINK_FAST);
set_led(32,LED_ON);
set_led(43,LED_ON);
set_led(143,LED_ON);
while(1)
{
refresh();
usleep(1000000/50);
}
}
S F O O . . . . . . S .
. . . . . . . . . F . .
. . . . . . . . O . . .
. . . . . . . O . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . O
andre_teprom escreveu:Álessandro
Dá uma olhada nesse tópico aqui onde esse assunto já foi debatido :
No caso fiz um apinel com esse mesmo PIC16F877A mas foi em C e tinha 864 LEDs ( 9 caracteres de 8x12 ). O resultado pode ser visto aqui :
http://www.teprom.eng.br/arquivos/painel/video.AVI
Nessa linguagem de programação demorei 6 meses para fazer. É bem verdade que tinha outros recursos mas se for em Assembly pode esquecer; a menso que tenha bastante tempo pra isso.
+++
Faltou colocar o link do tópico...
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante