Matriz de leds para mini publi
Primer codigo de prueba para el 16f88, se puede hacer con un 16f648A y con un registro de dezplazamiento(una matriz de 8×8)
#include <16f88.h>
#fuses HS,NOWDT,NOLVP,PUT,NOBROWNOUT,MCLR
#use delay(clock=20000000)
#use fast_io(a)
#use fast_io(b)
#include <fonts.h>
#include <string.h>
#define clock PIN_A1
#define strobe PIN_A2
#define dato PIN_A0
#define size_matriz_col 8 //cantidad de columnas por matriz
#define COLUMNAS 40 //Defino cantidad de columnas a usar
#define matriz_num COLUMNAS/size_matriz_col //numero de matrices usado
#byte portb=6
int matriz[matriz_num+1][size_matriz_col]={"\0"}; //Almacena los datos a mostrar en el cartel. 0 Para que no me muestre basura por la matriz al comienzo del programa.
int Fila; //Fila actual a refrescar
int VSync; //Indica si es momento correcto de modificar lo que se esta mostrando...
int Inhibit; //Impide que se produzcan cambios en el cartel.
const int mensaje[1][32]={"Feliz Navidad y Feliz 2009!!..."};
const int num_msj=1;
const int msj_length[num_msj]={31};
int carries[6],msj,letra,desplazos;
void ShowFila(void);
void cargar(int datob);
void desplazar_izq(void);
void load_letra(int caracter);
//Esta interrupcion debe suceder segun la cantidad de filas que tengas, y segun la cantidad de Hz a los que queres que tu cartel refresque...
#int_TIMER0
void TIMER0_isr(void){
ShowFila(); //Mostremos la fila actual...
Fila++;
if(Fila==8){
Fila=0;
VSync=1;
if(Inhibit!=0)
Inhibit--;
else
desplazar_izq();
}
else
VSync=0;
}
void main(void){
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32);
enable_interrupts(INT_TIMER0);
clear_interrupt(INT_TIMER0);
enable_interrupts(GLOBAL);
setup_adc(adc_off);
setup_adc_ports(no_analogs);
set_tris_a(0);
set_tris_b(0);
output_b(0xFF); //Apago cartel
output_low(CLOCK); //Aseguro inicialmente clock en bajo
output_low(STROBE);
Fila=0; //Comienzo por la 1er fila
Inhibit=5;
VSync=1; //Indico que comienzo con sync.
desplazos=0;
msj=0;
while(true){}
}
void cargar(int datob){
int contador;
output_low(clock);
delay_cycles(2);
output_low(strobe);
for(contador=0;contador<8;contador++){
output_bit(dato,(datob & 0x1));
datob>>=1;
output_high(clock);
delay_cycles(1);
output_low(clock);
}
output_high(strobe);
delay_cycles(1);
output_low(strobe);
}
void ShowFila(void){
int i;
output_b(0xFF);
for(i=0;i<5;i++){
cargar(matriz[i][Fila]);
}
bit_clear(portb,fila);
}
void desplazar_izq(void){
int i,j,a;
if(desplazos==8 || desplazos==0){ //uso caracteres de 8x8, por tanto deberé cargar una nueva letra si ya se han hecho 8 desplazos o ninguno.
load_letra(mensaje[msj][letra]); //cargo la nueva letra
desplazos=0; //restablezco el valos de desplazos
}
for(i=0;i<8;i++){ //este for desplaza un bit a la izquierda de mi buffer matriz de cada fila, la matriz es de 6x8, en hadware tenía un cartel 8x40,
//con un buffer de 5x8 bastaba, pero el 6to apareció por ser uno temporal para ir cargando ahí el nuevo caracter
for(j=0;j<6;j++){
a=matriz[j][i]; se carga el primer byte en una variable temporal
carries[j]=shift_left(&a,1,0); //desplazo esa variable temporal un bit a la izquierda, y almaceno en valor desplazado en un arreglo.
matriz[j][i]=a; //guardo el nuevo valor de la variable temporal que esta desplazada, en la misma posición de antes
}
for(j=0;j<6;j++){ //coloco los carries donde corresponden16. if(j!=5)
matriz[j][i]|=carries[j+1];
else
matriz[j][i]|=carries[0];
}
}
Inhibit=5; //restablezco valor de Inhibit
desplazos++; //incremento el valor de desplazos
if(desplazos==8){ //si se han hecho 8 desplazos
letra++; //hay que pasar a mostrar la siguiente letra del mensaje
if(letra>msj_length[msj]) //si se ha llegado a la última letra
letra=0; //se comienza desde la primera letra del mensaje
}
}
void load_letra(int caracter){
int i,j;
if(isalnum(caracter)){
if(isalpha(caracter)){
if(isupper(caracter)){
switch(caracter){
case 'A': i=0; break;
case 'B': i=1; break;
case 'C': i=2; break;
case 'D': i=3; break;
case 'E': i=4; break;
case 'F': i=5; break;
case 'G': i=6; break;
case 'H': i=7; break;
case 'I': i=8; break;
case 'J': i=9; break;
case 'K': i=10; break;
case 'L': i=11; break;
case 'M': i=12; break;
case 'N': i=13; break;
case 'O': i=14; break;
case 'P': i=15; break;
case 'Q': i=16; break;
case 'R': i=17; break;
case 'S': i=18; break;
case 'T': i=19; break;
case 'U': i=20; break;
case 'V': i=21; break;
case 'W': i=22; break;
case 'X': i=23; break;
case 'Y': i=24; break;
case 'Z': i=25; break;
}
for(j=0;j<8;j++){
matriz[5][j]=letrasM[i][j];
}
}
else{
switch(caracter){
case 'a': i=0; break;
case 'b': i=1; break;
case 'c': i=2; break;
case 'd': i=3; break;
case 'e': i=4; break;
case 'f': i=5; break;
case 'g': i=6; break;
case 'h': i=7; break;
case 'i': i=8; break;
case 'j': i=9; break;
case 'k': i=10; break;
case 'l': i=11; break;
case 'm': i=12; break;
case 'n': i=13; break;
case 'o': i=14; break;
case 'p': i=15; break;
case 'q': i=16; break;
case 'r': i=17; break;
case 's': i=18; break;
case 't': i=19; break;
case 'u': i=20; break;
case 'v': i=21; break;
case 'w': i=22; break;
case 'x': i=23; break;
case 'y': i=24; break;
case 'z': i=25; break;
}
for(j=0;j<8;j++){
matriz[5][j]=letras_m[i][j];
}
}
}
else{
for(j=0;j<8;j++){
matriz[5][j]=numeros[caracter-'0'][j];
}
}
}
else{
switch(caracter){
case ' ': i=0; break;
case '!': i=1; break;
case '"': i=2; break;
case '#': i=3; break;
case '$': i=4; break;
case '%': i=5; break;
case '&': i=6; break;
case '´': i=7; break; //este es el acento
case '(': i=8; break;
case ')': i=9; break;
case '*': i=10; break;
case '+': i=11; break;
case ',': i=12; break;
case '-': i=13; break;
case '.': i=14; break;
case '/': i=15; break;
case ':': i=16; break;
case ';': i=17; break;
case '>': i=18; break;
case '=': i=19; break;
case '<': i=20; break;
case '?': i=21; break;
case '[': i=22; break;
case ']': i=23; break;
case '^': i=24; break;
case '_': i=25; break;
case '{': i=26; break;
case '|': i=27; break;
case '}': i=28; break;
case '@': i=29; break;
case 'ñ': i=30; break; // esta es la enie
case '\f': i=31; break;
}
for(j=0;j<8;j++){
matriz[5][j]=chars[i][j];
}
}
}
y el fonts.h:
const int letrasM[26][8]={{48,120,204,204,252,204,204,204}, //A
{248,204,204,248,248,204,204,248}, //B
{252,192,192,192,192,192,192,252}, //C
{240,200,204,204,204,204,200,240}, //D
{252,192,192,240,240,192,192,252}, //E
{252,192,192,240,240,192,192,192}, //F
{60,64,192,192,216,204,204,248}, //G
{204,204,204,204,252,204,204,204}, //H
{252,48,48,48,48,48,48,252}, //I
{252,48,48,48,48,48,176,240}, //J
{196,200,208,224,208,204,204,204}, //K
{192,192,192,192,192,192,192,252}, //L
{238,214,214,198,198,198,198,198}, //M
{196,228,244,212,212,204,204,196}, //N
{48,204,204,204,204,204,204,48}, //O
{248,204,204,204,248,192,192,192}, //P
{56,196,196,196,196,212,200,52}, //Q
Para invertir el fondo, se haria de la siguiente manera.
void load_letra(int caracter){
int i,j;
if(isalnum(caracter)){
if(isalpha(caracter)){
if(isupper(caracter))
{
for(j=0;j<8;j++){
//matriz[5][j]=letrasM[i][j];
matriz[5][j]=letrasM[caracter - 'A'][j];
}
}
else{
for(j=0;j<8;j++){
//matriz[5][j]=letras_m[i][j];
matriz[5][j]=letras_m[caracter - 'a'][j];
}
}
}
else{
for(j=0;j<8;j++){
matriz[5][j]=numeros[caracter-'0'][j];
}
}
}
else{
switch(caracter){
case ' ': i=0; break;
case '!': i=1; break;
case '"': i=2; break;
case '#': i=3; break;
case '$': i=4; break;
case '%': i=5; break;
case '&': i=6; break;
case '´': i=7; break; //este es el acento
case '(': i=8; break;
case ')': i=9; break;
case '*': i=10; break;
case '+': i=11; break;
case ',': i=12; break;
case '-': i=13; break;
case '.': i=14; break;
case '/': i=15; break;
case ':': i=16; break;
case ';': i=17; break;
case '>': i=18; break;
case '=': i=19; break;
case '<': i=20; break;
case '?': i=21; break;
case '[': i=22; break;
case ']': i=23; break;
case '^': i=24; break;
case '_': i=25; break;
case '{': i=26; break;
case '|': i=27; break;
case '}': i=28; break;
case '@': i=29; break;
case 'ñ': i=30; break; // esta es la enie
case '\f': i=31; break;
}
for(j=0;j<8;j++){
matriz[5][j]=chars[i][j];
}
}
}
Fuente: http://www.todopic.com.ar/foros/index.php?topic=19091.80
Pagina de referencia: http://www.todopic.com.ar/foros/index.php?topic=30658.0
Escribe tu comentario Jueves 26 agosto 2010 Electronica |





















