algoritmo

Enviado:
20 Jun 2007 13:49
por ze
/*
fiz este programa há alguns anos para acionar um display matriz de
leds que tem as seguintes características:
14 display de matriz de 5x7
1 idéia +- como ele é:
dipslay 1 ...................... display 14
0 0 0 0 0 ...................... 0 0 0 0 0-- catodo comum 1 (decodificado por 74HC138)
0 0 0 0 0 ...................... 0 0 0 0 0-- catodo comum 2 (portanto ligados à suas saídas)
0 0 0 0 0 ...................... 0 0 0 0 0-- catodo comum 3 (lógico não diretamente)
0 0 0 0 0 ...................... 0 0 0 0 0-- catodo comum 4 (e sim com transistores)
0 0 0 0 0 ...................... 0 0 0 0 0-- catodo comum 5 (sinais de entrada do hc138=PORTB)
0 0 0 0 0 ...................... 0 0 0 0 0-- catodo comum 6
0 0 0 0 0 ...................... 0 0 0 0 0-- catodo comum 7
| | | | | | | | | |
| | | | | | | | | |
8 ci´shift register 74HC164 (ligados não diretamente e sim com unl2002)
Obs:
este programa foi de uso comercial, portanto me senti a vontade em
retirar as partes que não lhe são importantes
espero que [não] lhe seja [in]útil!!
abraço
*/
/* Programa para uControlador PIC16F876 controle de display matricial */
/* início 06/03/2001 V.0.0 simulação*/
//V 1.0 pic16f876A com display spider
#include <pic.h>
#include "tabela.c"
#include "i2c876.asm"
#define tm1h 0xf9 //int timer1 300Hz
#define tm1l 0x7e
//#define tm1h 0xfb //int timer1 400Hz
//#define tm1l 0x1e
//#define tm1h 0xf6 //int timer1 200Hz
//#define tm1l 0x3c
#define dd RB1 //tem inversor 74HC04 no pino
#define ck RB0 //tem inversor 74HC04 no pino
#define clk164 ck=0;ck=1 //tem inversor 74HC04 no pino
//************************ configuração ***********************
// proteção do código,4Mhz,powerup,lowvoltagedis,debdis,flaswritedis,wathdogdis,brownoureseten
__CONFIG(PROTECT & XT & PWRTEN & LVPDIS & DEBUGDIS & WDTDIS & BOREN);
unsigned char bank1 lin0[14];
unsigned char bank1 lin1[14];
unsigned char bank1 lin2[14];
unsigned char bank1 lin3[14];
unsigned char bank2 lin4[14];
unsigned char bank2 lin5[14];
unsigned char bank2 lin6[14];
void shift(unsigned char s)
{
unsigned char k;
for (k=0;k<6;k++) //padrão de 6 bits
{
if (s&1) dd=0;
else dd=1;
s>>=1;
clk164;
}
}
/**********************************************************************/
void rolabit()
{
unsigned char i;
for (i=0;i<14;i++)
{
lin6[i]<<=1;
lin5[i]<<=1;
lin4[i]<<=1;
lin3[i]<<=1;
lin2[i]<<=1;
lin1[i]<<=1;
lin0[i]<<=1;
}
for (i=0;i<13;i++)
{
if (lin6[i]&0b1000000) lin6[i+1]|=1;
if (lin5[i]&0b1000000) lin5[i+1]|=1;
if (lin4[i]&0b1000000) lin4[i+1]|=1;
if (lin3[i]&0b1000000) lin3[i+1]|=1;
if (lin2[i]&0b1000000) lin2[i+1]|=1;
if (lin1[i]&0b1000000) lin1[i+1]|=1;
if (lin0[i]&0b1000000) lin0[i+1]|=1;
}
}
/**********************************************************************/
//interrupção timer1: tratamento dos displays, leds e teclado
static bit rl;
unsigned char dl,crl;
static void interrupt
timer1_int(void)
{
unsigned char j,lin,t,tmp,tr;
TMR1IF=0;
TMR1H=tm1h; //restaura 400Hz int
TMR1L=tm1l;
T1CON=0B00010101; //prescaler /2,osc. dis.,not sync.,interno fosc/4,timer on
PORTB=0b00011111; //apaga display
switch (lin)
{
case 0: for (j=0;j<14;j++) shift(lin6[j]); break;
case 1: for (j=0;j<14;j++) shift(lin0[j]); break;
case 2: for (j=0;j<14;j++) shift(lin1[j]); break;
case 3: for (j=0;j<14;j++) shift(lin2[j]); break;
case 4: for (j=0;j<14;j++) shift(lin3[j]); break;
case 5: for (j=0;j<14;j++) shift(lin4[j]); break;
case 6: for (j=0;j<14;j++) shift(lin5[j]); break;
}
tmp=lin;
tmp<<=5;
tmp=tmp^0xff;
tmp|=3;
PORTB=tmp;
lin++;
if (lin>6) lin=0;
dl--;
if (!t--) {RC7^=1;RC6^=1;}
if (rl&&!tr--)
{
rolabit();
crl--;
}
}
/**********************************************************************/
void putchar(unsigned char c,unsigned int dado)
{
c=13-c; //posição na coluna
dado-=32; //retira 1º ascii (spc)
dado+=dado*6; //de 6 em 6 bits
lin6[c]=tabdisp[dado];
lin5[c]=tabdisp[dado+1];
lin4[c]=tabdisp[dado+2];
lin3[c]=tabdisp[dado+3];
lin2[c]=tabdisp[dado+4];
lin1[c]=tabdisp[dado+5];
lin0[c]=tabdisp[dado+6];
}
/**********************************************************************/
void msgdsp(unsigned char col,const char * s)
{
while(*s)
putchar(col++,*s++);
}
/**********************************************************************/
void delay(unsigned char d)
{
dl=d;
while(dl);
}
/**********************************************************************/
/***************INICIO DO PROGRAMA PRINCIPAL***************************/
/**********************************************************************/
main()
{
TRISA=0xff;
TRISB=TRISC=0;
PORTB=0xff;
//ADCON1=0b10000000; //formato do resultado AD xxxxxxBBBBBBBBBB - AAAAA - bits à direita
T1CON=0B00010101; // prescaler /2 timer1 on
TMR1H=tm1h; // int. 400Hz
TMR1L=tm1l;
TMR1IF=0; //zera flag timer1
TMR1IE=1; //hab. int. timer1
PEIE=1;
//SMP=1; //I2C slew rate control disabled
SSPM3=1;//I2C master mode in hardware
SSPEN=1;//enable SSP module
SSPADD=0xa;//set I2C clock rate to 100kHz
GIE=1;
for (;;)
{
rl=0;
msgdsp(0," *Tudo posso ");
delay(0xff);
rl=1;
while(crl);
rl=0;
msgdsp(0,"nAquele que ");
delay(0xff);
rl=1;
while(crl);
rl=0;
msgdsp(0,"me fortalece!");
delay(0xff);
rl=1;
while(crl);
}
}
//tabela.c
unsigned char const tabdisp[]={
0b00000,
0b00000,
0b00000,
0b00000, //spc
0b00000,
0b00000,
0b00000,
0b00100,
0b00100,
0b00100,
0b00100, //!
0b00100,
0b00000,
0b00100,
0b01010,
0b01010,
0b01010,
0b00000, //"
0b00000,
0b00000,
0b00000,
0b01010,
0b01010,
0b11111,
0b01010, //#
0b11111,
0b01010,
0b01010,
0b01111,
0b10100,
0b01100,
0b00110, //$
0b00101,
0b11110,
0b00100,
0b11000,
0b11001,
0b00010,
0b00100, //%
0b01000,
0b10011,
0b00011,
0b01100,
0b10001,
0b10100,
0b01000,
0b10101, //&
0b10010,
0b01101,
0b01100,
0b00100,
0b00000,
0b10000, //'
0b00000,
0b00000,
0b00000,
0b00010,
0b00100,
0b01000,
0b01000, //(
0b01000,
0b00100,
0b00010,
0b01000,
0b00100,
0b00010,
0b00010, //)
0b00010,
0b00100,
0b01000,
0b00000,
0b00100,
0b10101,
0b01110, //*
0b10101,
0b00100,
0b00000,
0b00000,
0b00100,
0b00100,
0b11111, //+
0b00100,
0b00100,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000, //,
0b01100,
0b00100,
0b01000,
0b00000,
0b00000,
0b00000,
0b11111, //-
0b00000,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000, //.
0b01100,
0b01100,
0b00000,
0b00001,
0b00010,
0b00100, // /
0b01000,
0b10000,
0b00000,
0b01110,
0b10001,
0b10011,
0b10101, //0
0b11001,
0b10001,
0b01110,
0b00100,
0b01100,
0b00100,
0b00100, //1
0b00100,
0b00100,
0b01110,
0b01110,
0b10001,
0b00001,
0b00010, //2
0b00100,
0b01000,
0b11111,
0b11111,
0b00010,
0b00100,
0b00010, //3
0b00001,
0b10001,
0b01110,
0b00010,
0b00110,
0b01010,
0b10010, //4
0b11111,
0b00010,
0b00010,
0b11111,
0b10000,
0b11110,
0b00001, //5
0b00001,
0b10001,
0b01110,
0b00110,
0b01000,
0b10000,
0b11110, //6
0b10001,
0b10001,
0b01110,
0b11111,
0b00001,
0b00001,
0b00010, //7
0b00100,
0b01000,
0b01000,
0b01110,
0b10001,
0b10001,
0b01110, //8
0b10001,
0b10001,
0b01110,
0b01110,
0b10001,
0b10001,
0b01111, //9
0b00001,
0b00010,
0b01100,
0b00000,
0b00000,
0b01100,
0b01100,
0b00000, //:
0b01100,
0b01100,
0b00000,
0b01100,
0b01100,
0b00000,
0b01100, //;
0b00100,
0b01000,
0b00010,
0b00100,
0b01000,
0b10000, //<
0b01000,
0b00100,
0b00010,
0b00000,
0b00000,
0b00000,
0b11111, //=
0b00000,
0b11111,
0b00000,
0b01000,
0b00100,
0b00010,
0b00001, //>
0b00010,
0b00100,
0b01000,
0b01110,
0b10001,
0b00001,
0b00010,
0b00100, //?
0b00000,
0b00100,
0b01110,
0b10001,
0b00001,
0b01101,
0b10101, //@
0b10101,
0b01110,
//***************************
0b00100,
0b01010,
0b10001,
0b11111, //A
0b10001,
0b10001,
0b10001,
0b11110,
0b10001,
0b10001,
0b11110, //B
0b10001,
0b10001,
0b11110,
0b01110,
0b10001,
0b10000,
0b10000, //C
0b10000,
0b10001,
0b01110,
0b11100,
0b10010,
0b10001,
0b10001, //D
0b10001,
0b10010,
0b11100,
0b11111,
0b10000,
0b10000,
0b11110, //E
0b10000,
0b10000,
0b11111,
0b11111,
0b10000,
0b10000,
0b11110, //F
0b10000,
0b10000,
0b10000,
0b01110,
0b10001,
0b10000,
0b10011,
0b10001, //G
0b10001,
0b01111,
0b10001,
0b10001,
0b10001,
0b11111, //H
0b10001,
0b10001,
0b10001,
0b01110,
0b00100,
0b00100,
0b00100, //I
0b00100,
0b00100,
0b01110,
0b01110,
0b00100,
0b00100,
0b00100, //J
0b00100,
0b10100,
0b01000,
0b10001,
0b10010,
0b10100,
0b11000, //K
0b10100,
0b10010,
0b10001,
0b10000,
0b10000,
0b10000,
0b10000, //L
0b10000,
0b10000,
0b11111,
0b10001,
0b11011,
0b10101,
0b10001, //M
0b10001,
0b10001,
0b10001,
0b10001,
0b11001,
0b10101,
0b10011, //N
0b10001,
0b10001,
0b10001,
0b01110,
0b10001,
0b10001,
0b10001, //O
0b10001,
0b10001,
0b01110,
0b11110,
0b10001,
0b10001,
0b11110, //P
0b10000,
0b10000,
0b10000,
0b01110,
0b10001,
0b10001,
0b10001, //Q
0b10101,
0b10010,
0b01101,
0b11110,
0b10001,
0b10001,
0b11110, //R
0b10100,
0b10010,
0b10001,
0b01111,
0b10000,
0b10000,
0b01110, //S
0b00001,
0b10001,
0b11110,
0b11111,
0b00100,
0b00100,
0b00100, //T
0b00100,
0b00100,
0b00100,
0b10001,
0b10001,
0b10001,
0b10001, //U
0b10001,
0b10001,
0b01110,
0b10001,
0b10001,
0b10001,
0b10001, //V
0b10001,
0b01010,
0b00100,
0b10001,
0b10001,
0b10001,
0b10001, //W
0b10101,
0b11011,
0b10001,
0b10001,
0b10001,
0b01010,
0b00100, //X
0b01010,
0b10001,
0b10001,
0b10001,
0b10001,
0b01010,
0b00100,
0b00100, //Y
0b00100,
0b00100,
0b11111,
0b00001,
0b00010,
0b00100, //Z
0b01000,
0b10000,
0b11111,
0b01110,
0b01000,
0b01000,
0b01000, //[
0b01000,
0b01000,
0b01110,
0b00000,
0b10000,
0b01000,
0b00100, // \
0b00010,
0b00001,
0b00000,
0b01110,
0b00010,
0b00010,
0b00010, //]
0b00010,
0b00010,
0b01110,
0b00100,
0b01010,
0b10001,
0b00000, //^
0b00000,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000, //_
0b00000,
0b00000,
0b11111,
0b01000,
0b00100,
0b00010,
0b00000, //`
0b00000,
0b00000,
0b00000,
0b00000,
0b00000,
0b11110,
0b00001, //a
0b01111,
0b10001,
0b01111,
0b10000,
0b10000,
0b10110,
0b11001, //b
0b10001,
0b10001,
0b11110,
0b00000,
0b00000,
0b01110,
0b10000, //c
0b10000,
0b10001,
0b01110,
0b00001,
0b00001,
0b01101,
0b10011, //d
0b10001,
0b10001,
0b01111,
0b00000,
0b00000,
0b01110,
0b10001, //e
0b11111,
0b10000,
0b01110,
0b00110,
0b01001,
0b01000,
0b11100, //f
0b01000,
0b01000,
0b01000,
0b00000,
0b01111,
0b10001,
0b10001,
0b01111, //g
0b00001,
0b01110,
0b10000,
0b10000,
0b10000,
0b10110,
0b11001, //h
0b10001,
0b10001,
0b00100,
0b00000,
0b01100,
0b00100, //i
0b00100,
0b00100,
0b01110,
0b00010,
0b00000,
0b00110,
0b00010, //j
0b00010,
0b10010,
0b01100,
0b10000,
0b10000,
0b10010,
0b10100, //k
0b11000,
0b10100,
0b10010,
0b01100,
0b00100,
0b00100,
0b00100, //l
0b00100,
0b00100,
0b01110,
0b00000,
0b00000,
0b11010,
0b10101, //m
0b10101,
0b10001,
0b10001,
0b00000,
0b00000,
0b10110,
0b11001, //n
0b10001,
0b10001,
0b10001,
0b00000,
0b00000,
0b01110,
0b10001, //o
0b10001,
0b10001,
0b01110,
0b00000,
0b00000,
0b11110,
0b10001, //p
0b11110,
0b10000,
0b10000,
0b00000,
0b00000,
0b01101,
0b10011, //q
0b01111,
0b00001,
0b00001,
0b00000,
0b00000,
0b10110,
0b11001, //r
0b10000,
0b10000,
0b10000,
0b00000,
0b00000,
0b01110,
0b10001, //s
0b01110,
0b00001,
0b11110,
0b01000,
0b11100,
0b01000,
0b01000, //t
0b01000,
0b01001,
0b00110,
0b00000,
0b00000,
0b10001,
0b10001, //u
0b10001,
0b10011,
0b01101,
0b00000,
0b00000,
0b10001,
0b10001, //v
0b10001,
0b01010,
0b00100,
0b00000,
0b00000,
0b10001,
0b10001, //w
0b10101,
0b10101,
0b01010,
0b00000,
0b00000,
0b10001,
0b01010, //x
0b00100,
0b01010,
0b10001,
0b00000,
0b00000,
0b10001,
0b10001, //y
0b01110,
0b00001,
0b01110,
0b00000,
0b00000,
0b11111,
0b00010, //z
0b00100,
0b01000,
0b11111,
};
//fim tabela.c