quarta-feira, 8 de setembro de 2010

usando o RTC com o pic

// ****************************************************************************************************************************************************
// usando o relogio de tempo real PCF8583
//
// Data: 27/11/2009
// Autor: Aguivone
// Descrição: demonstra como usar um rtc da Philips
// *************************************************************************************************************************************************************************************************************************
#include <16F877A.h>
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock=4M)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#use I2C(master, scl=PIN_C3, sda=PIN_C4)

#define PCF8583_Ende_escrita 0xA0
#define PCF8583_Ende_leitura 0xA1
#define PCF8583_Status_controle 0x00
#define PCF8583_Centesimo_seg 0x01
#define PCF8583_Segundos 0x02
#define PCF8583_Minutos 0x03
#define PCF8583_Horas 0x04
#define PCF8583_Ano_Dia 0x05
#define PCF8583_Mes_Semana 0x06
#define PCF8583_Timer 0x07
#define PCF8583_Controle_Alarme 0x08
#define PCF8583_Alarme_centesimo 0x09
#define PCF8583_Alarme_segundos 0x0A
#define PCF8583_Alarme_minutos 0x0B
#define PCF8583_Alarme_horas 0x0C
#define PCF8583_Alarme_dia 0x0D
#define PCF8583_Alarme_mes 0x0E
#define PCF8583_Alarme_timer 0x0F
#define PCF8583_Reg_Ano 0x10 //1° endereço da ram do ci
// usados para modo contador.
#define PCF8583_Inicio_de_contagem 0x00
#define PCF8583_Fim_de_contagem 0x80

int segundos=45;
int minutos=59;
int horas=24;
int dia=31;
int mes=7;
int ano=2;//0 à 3
int semana=1;//0 = Sunday, 1 = Monday, etc.
char dia_da_semana[8][10] =
{
{"Domingo"}
,{"Segunda"}
,{"Terca"}
,{"Quarta"}
,{"Quinta"}
,{"Sexta"}
,{"Sabado"}
};


//----------------------------------------------
void PCF8583_escreve_byte(int8 endereco, int8 dados)
{
disable_interrupts(GLOBAL);
i2c_start(); //inicializa a comunicaçao i2c
i2c_write(PCF8583_Ende_escrita);
i2c_write(endereco);
i2c_write(dados);
i2c_stop(); //finaliza comunicação
enable_interrupts(GLOBAL);
}

//----------------------------------------------
int PCF8583_ler_byte(int endereco)
{
int lido;
disable_interrupts(GLOBAL);
i2c_start();
i2c_write(PCF8583_Ende_escrita);
i2c_write(endereco);
i2c_start();
i2c_write(PCF8583_Ende_leitura);
lido = i2c_read(0);//ler sem ack =0 , ler com ack = 1
i2c_stop();
enable_interrupts(GLOBAL);
return(lido); //retorna o valor lido
}

//----------------------------------------------
// converte de binario para bcd (8 bits), de 0 a 99
int BINparaBCD(int valor)
{
int BCD=0;
while(1)
{
if(valor >= 10)
{
valor -= 10;
BCD += 0x10;
}
else //incrementa casas decimais.
{
BCD += valor;
break;
}
}
return(BCD); //retorna o valor
}

// converte de bcd para binario (8 bits), de 0 a 99

int BCDparaBIN(int valor)
{
int temp=15;
int temp2=240;
temp &= valor;
temp2 &= valor;
temp2 >>= 4;
temp2 *= 10;
valor=temp+temp2;
return(valor);
}

//----------------------------------------------
void PCF8583_programar_tempo(void)
{

int8 bcd_sec;
int8 bcd_min;
int8 bcd_hrs;
int8 bcd_dia;
int8 bcd_mes;
// Converte binario para bcd
bcd_sec = BINparaBCD(segundos);
bcd_min = BINparaBCD(minutos);
bcd_hrs = BINparaBCD(horas);
bcd_dia = BINparaBCD(dia) | (ano << 6); bcd_mes = BINparaBCD(mes) | (semana << 5); // para contagem antes de escrever nos registradores de datas PCF8583_escreve_byte(PCF8583_Status_controle,PCF8583_Fim_de_contagem); // deve-se desabilitar as interrupçoes para fazer a comunicação I2C. disable_interrupts(GLOBAL); i2c_start(); i2c_write(PCF8583_Ende_escrita); i2c_write(PCF8583_Centesimo_seg); // inicia os centesimos de segundos com 0. i2c_write(0x00); i2c_write(bcd_sec); //escreve os segundos i2c_write(bcd_min); i2c_write(bcd_hrs); i2c_write(bcd_dia); i2c_write(bcd_mes); i2c_stop(); enable_interrupts(GLOBAL); PCF8583_escreve_byte(PCF8583_Status_controle,PCF8583_Inicio_de_contagem); } //---------------------------------------------- // Lê data e tempo dos registradores do // PCF8583. Não é preciso parar a contagem durante a operação de leitura void PCF8583_ler_datas(void) { disable_interrupts(GLOBAL); // lê o PCF8583. i2c_start(); i2c_write(PCF8583_Ende_escrita); i2c_write(PCF8583_Segundos); // inicia lendo segundos. i2c_start(); i2c_write(PCF8583_Ende_leitura); segundos = i2c_read(); minutos = i2c_read(); horas = i2c_read(); dia = i2c_read(); mes = i2c_read(0); i2c_stop(); enable_interrupts(GLOBAL); // converte datas de bcd para inteiro segundos = BCDparaBIN(segundos); minutos = BCDparaBIN(minutos); horas = BCDparaBIN(horas& 0x3F);//pega os 6 bits mais baixos ano = dia >> 6; //rotaciona 6 bits para pegar anos (0 à 3)
dia = BCDparaBIN(dia & 0x3F);//pega os 6 bits mais baixos
semana = mes >> 5 ;//rotaciona 5 bits para pegar dia da semana( 0 à 6)
mes = BCDparaBIN(mes & 0x1F); //pega os 5 bits mais baixos

}
/////////////////////////////////////////////////////////////////////////////////////

//=================================
void main()
{
PCF8583_escreve_byte(PCF8583_Status_controle,
PCF8583_Inicio_de_contagem);
PCF8583_programar_tempo();//ajusta data e hora conforme os valores pre ajustados,
while(1)
{
delay_ms(1000);
PCF8583_ler_datas();
printf("hora %u:%u:%u \n\r",horas,minutos,segundos);
printf("data %u/%u/%u \n\r",dia,mes,ano);
printf(" hoje e %s \n\r",dia_da_semana[semana]);
}

}

Nivel de tensão analógica com o pic

//****************************************************************************************************************************************************
//
//
// Data: 28/10/2007
// Autores: Aguivone
// Descrição: saida de tensão analógica
// basta colocar um multimetro no pino RA2.
//
//****************************************************************************************************************************************************
#include <16F628A.h>
#FUSES NOWDT, XT, PUT, NOPROTECT, NOBROWNOUT, NOMCLR, NOLVP, NOCPD
#use delay(clock=4000000)
void main()
{
Set_tris_b(0);
Set_tris_a(0);
setup_comparator(NC_NC_NC_NC);//desabilita os comparadores
setup_vref(VREF_HIGH | VREF_A2 | 10) ;
//define saida no pino Ra2(poderia ser jogado na entrada interna do comparador)
// se vref no modo hight=vdd/4+vdd*valor/32
// se vref no modo low=vdd*valor/24
// se vref no modo false desligado
//o valor 10 é o valor usado na formula
//sendo que este pode variar ate 15
for(;;)
{ }}

Termômetro e higrômetro usando o sensor SHT15 (PIC)

#include <16F877A.h>
#fuses NOWDT,XT, PUT, NOPROTECT, DEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4M)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#include
#define DADOS PIN_C3
#define CLOCK PIN_C4
#define led_on output_high(PIN_D0);
#define led_off output_low(PIN_D0);
#define STATUS_W 0x06 //000 0011 0 escreve status
#define STATUS_R 0x07 //000 0011 1 ler status
#define MEDE_TEMP 0x03 //000 0001 1
#define MEDE_HUMI 0x05 //000 0010 1
#define RESET 0x1e //000 1111 0



// constantes para humidade(12bits e 5V)

const float C1=-4.0; // for 12 Bit
const float C2=+0.0405; // for 12 Bit
const float C3=-0.0000028; // for 12 Bit
const float T1=+0.01; // for 14 Bit @ 5V
const float T2=+0.00008; // for 14 Bit @ 5V

// constantes para temperatura(14bits e 5V)

int checksum;
//----------------------------------------------------------------------------------
long ler_SHT()
//----------------------------------------------------------------------------------
{
int i,Temp;
int Val1=0,Val2=0;
long Valor=0;
//pega MSB de SHT
for (i=0; i<8; i++) { Val1<<=1; output_high(CLOCK); delay_us(1); Temp = input(DADOS); //lê um bit if(Temp) Val1|=1; output_low(CLOCK); delay_us(2); } //rotina de reconhecimento para proximo byte output_low(DADOS); delay_us(1); output_high(CLOCK); delay_us(2); output_low(CLOCK); delay_us(1); output_float(DADOS); //muda para entrada //pega LSB SHT for (i=0; i<8; i++) { Val2<<=1; output_high(CLOCK); delay_us(2); Temp = input(DADOS); //lê um bit delay_us(2); if(Temp) Val2|=1; output_low(CLOCk); delay_us(2); } output_float(DADOS); //muda para entrada delay_us(2); output_high(CLOCK); delay_us(2); output_low(CLOCk); checksum=0; //pega checksum do SHT for (i=0; i<8; i++) { checksum<<=1; output_high(CLOCK); delay_us(2); Temp = input(DADOS); //lê um bit delay_us(2); output_low(CLOCK); delay_us(2); if(Temp) checksum|=1; } valor=make16(val1,val2); //faz uma variavel de 16 bits return(valor); } //---------------------------------------------------------------------------------- //---------------------------------------------------------------------------------- void ini_trans(void) //---------------------------------------------------------------------------------- // inicializa uma transmissao // _____ ________ // dados: |_______| // ___ ___ // clock :___| |___| |______ { output_high(DADOS); output_low(CLOCK); //estado inicial delay_us(2); output_high(CLOCK); delay_us(2); output_low(DADOS); delay_us(2); output_low(CLOCK); delay_us(2); output_high(CLOCK); delay_us(2); output_high(DADOS); delay_us(2); output_low(CLOCK); delay_us(2); } ///////////////////////////////////////////////////////////////////////////////////// boolean escreve_byte(unsigned int valor,long espera) //---------------------------------------------------------------------------------- // escreve 1 byte e checa o reconhecimento { unsigned int i; boolean erro=0; ini_trans(); for (i=0x80;i>0;i/=2) //rotaciona byte 8 vezes
{
if(i & valor)//testa bit na posição 'i' de valor se é igual a 1
{
output_high(DADOS);
}
else
{
output_low(DADOS);
}
delay_us(2);
output_high(CLOCK);
delay_us(2);
output_low(CLOCK);
}
output_float(DADOS);
delay_us(2);
output_high(CLOCK);
delay_us(2);
// se =1 não reconhecido
erro=(input(DADOS));
output_low(CLOCK);
delay_ms(espera);//veja o datasheet
return erro;

}
//----------------------------------------------------------------------------------
void reseta_conexao(void)
//----------------------------------------------------------------------------------
// reseta a conexao colocando a linha de dados=1 e aplicando 9 pulsoso de clock seguido de um pulso de inicio
// _____________________________________________________ ________
// dados: |_______|
// _ _ _ _ _ _ _ _ _ ___ ___
//cloc : __| |__| |__| |__| |__| |__| |__| |__| |__| |______| |___| |______
{
int i;
output_high(DADOS);
for(i=0;i<9;i++) //9 pulsos de clock
{
output_high(CLOCK);
delay_us(2);
output_low(CLOCK);
delay_us(2);
}
ini_trans(); //inicia transmissao
}
//----------------------------------------------------------------------------------
boolean resetar(void)
//----------------------------------------------------------------------------------
// reseta o sensor pelo firmware
{
boolean error=0;
reseta_conexao(); //reseta conexao
error+=escreve_byte(RESET,10);
return error; //error=1 no caso de não ter a resposta do sensor
}
/*//----------------------------------------------------------------------------------
boolean ler_status(unsigned char *valor, unsigned char *checksum)
//----------------------------------------------------------------------------------
// ler o estado do sensor com checksum (8-bit)
{
boolean error=0;
ini_trans();
error=escreve_byte(STATUS_R); //envia comando de ler status do sensor
*valor=ler_SHT();
*checksum=ler_SHT();
return error; //error=1 se não tiver resposta do sensor
}
//----------------------------------------------------------------------------------
boolean escreve_status(unsigned char *valor)
//----------------------------------------------------------------------------------
//escreve no status do sensor com checksum(8-bit)
{
boolean error=0;
ini_trans();
error=escreve_byte(STATUS_W); //envia comando de escrever no status do sensor
error=escreve_byte(*valor); //escreve valor no status do sensor
return error; //error=1 se não tiver resposta do sensor
}*/

//----------------------------------------------------------------------------------
float ponto_de_orvalho(float hum,float Tempe)
{
float ponto;
float auxiliar;

//auxiliar = ((7.5*Tempe)/(237.3+Tempe))+log10(hum)-1.33923;
//ponto = ((0.66077-log10(auxiliar))*(237.3))/(log10(auxiliar)-8.16077);
auxiliar=(0.66077+(7.5*Tempe))/(237.3+Tempe)+(log10(hum)-2);
ponto = (auxiliar - 0.66077)*237.3/(0.66077+7.5-auxiliar);
return(ponto);
}

Display 7 segmentos

// ****************************************************************************************************************************************************
// lcd de 7 segmento
// saida de pwm pino17 rc2
// Data: 03-08-2009
// Autores: Aguivone
// Descrição: frequencimetro que mede de 20Hz a 10 kHZ é a faixa para um cristal de 4 Mhz
// ****************************************************************************************************************************************************
#include <16F877A.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4M)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#bit P1 = 0x06.7
#bit P2 = 0x06.3
#bit P3 = 0x08.7
#bit P4 = 0x05.1

#bit UM = 0x09.2

#bit led = 0x07.1

#bit A1 = 0x05.3
#bit B1 = 0x05.2
#bit C1 = 0x06.4
#bit D1 = 0x06.5
#bit E1 = 0x06.6
#bit F1 = 0x09.0
#bit G1 = 0x09.1
#bit A2 = 0x08.0
#bit B2 = 0x08.1
#bit C2 = 0x06.0
#bit D2 = 0x06.1
#bit E2 = 0x06.2
#bit F2 = 0x07.3
#bit G2 = 0x07.0
#bit A3 = 0x07.4
#bit B3 = 0x07.5
#bit C3 = 0x08.4
#bit D3 = 0x08.5
#bit E3 = 0x08.6
#bit F3 = 0x08.3
#bit G3 = 0x08.2
int aux;
long sobe,sobe2;
long periodo,frequencia;//era float


void mostrar(boolean dig,int dig1,int dig2,int dig3,int ponto)
{
if(dig==0)
{
UM=1;
}
else
{
UM=0;
}
switch(ponto)
{
case 0:
{
P1=1;
P2=1;
P3=1;
P4=1;
}break;
case 1:
{
P1=0;
P2=1;
P3=1;
P4=1;
}break;
case 2:
{
P1=1;
P2=0;
P3=1;
P4=1;
}break;
case 3:
{
P1=1;
P2=1;
P3=0;
P4=1;
}break;
case 4:
{
P1=1;
P2=1;
P3=1;
P4=0;
}break;
}
switch(dig1)
{
case 0:
{
A1=0;
B1=0;
C1=0;
D1=0;
E1=0;
F1=0;
G1=1;
}break;
case 1:
{
A1=1;
B1=0;
C1=0;
D1=1;
E1=1;
F1=1;
G1=1;
}break;
case 2:
{
A1=0;
B1=0;
C1=1;
D1=0;
E1=0;
F1=1;
G1=0;
}break;
case 3:
{
A1=0;
B1=0;
C1=0;
D1=0;
E1=1;
F1=1;
G1=0;
}break;
case 4:
{
A1=1;
B1=0;
C1=0;
D1=1;
E1=1;
F1=0;
G1=0;
}break;
case 5:
{
A1=0;
B1=1;
C1=0;
D1=0;
E1=1;
F1=0;
G1=0;
}break;
case 6:
{
A1=0;
B1=1;
C1=0;
D1=0;
E1=0;
F1=0;
G1=0;
}break;
case 7:
{
A1=0;
B1=0;
C1=0;
D1=1;
E1=1;
F1=1;
G1=1;
}break;
case 8:
{
A1=0;
B1=0;
C1=0;
D1=0;
E1=0;
F1=0;
G1=0;
}break;
case 9:
{
A1=0;
B1=0;
C1=0;
D1=0;
E1=1;
F1=0;
G1=0;
}break;
case 10://desliga o numero
{
A1=1;
B1=1;
C1=1;
D1=1;
E1=1;
F1=1;
G1=1;
}break;
}
switch(dig2)
{
case 0:
{
A2=0;
B2=0;
C2=0;
D2=0;
E2=0;
F2=0;
G2=1;
}break;
case 1:
{
A2=1;
B2=0;
C2=0;
D2=1;
E2=1;
F2=1;
G2=1;
}break;
case 2:
{
A2=0;
B2=0;
C2=1;
D2=0;
E2=0;
F2=1;
G2=0;
}break;
case 3:
{
A2=0;
B2=0;
C2=0;
D2=0;
E2=1;
F2=1;
G2=0;
}break;
case 4:
{
A2=1;
B2=0;
C2=0;
D2=1;
E2=1;
F2=0;
G2=0;
}break;
case 5:
{
A2=0;
B2=1;
C2=0;
D2=0;
E2=1;
F2=0;
G2=0;
}break;
case 6:
{
A2=0;
B2=1;
C2=0;
D2=0;
E2=0;
F2=0;
G2=0;
}break;
case 7:
{
A2=0;
B2=0;
C2=0;
D2=1;
E2=1;
F2=1;
G2=1;
}break;
case 8:
{
A2=0;
B2=0;
C2=0;
D2=0;
E2=0;
F2=0;
G2=0;
}break;
case 9:
{
A2=0;
B2=0;
C2=0;
D2=0;
E2=1;
F2=0;
G2=0;
}break;
case 10://desliga o numero
{
A2=1;
B2=1;
C2=1;
D2=1;
E2=1;
F2=1;
G2=1;
}break;
}
switch(dig3)
{
case 0:
{
A3=0;
B3=0;
C3=0;
D3=0;
E3=0;
F3=0;
G3=1;
}break;
case 1:
{
A3=1;
B3=0;
C3=0;
D3=1;
E3=1;
F3=1;
G3=1;
}break;
case 2:
{
A3=0;
B3=0;
C3=1;
D3=0;
E3=0;
F3=1;
G3=0;
}break;
case 3:
{
A3=0;
B3=0;
C3=0;
D3=0;
E3=1;
F3=1;
G3=0;
}break;
case 4:
{
A3=1;
B3=0;
C3=0;
D3=1;
E3=1;
F3=0;
G3=0;
}break;
case 5:
{
A3=0;
B3=1;
C3=0;
D3=0;
E3=1;
F3=0;
G3=0;
}break;
case 6:
{
A3=0;
B3=1;
C3=0;
D3=0;
E3=0;
F3=0;
G3=0;
}break;
case 7:
{
A3=0;
B3=0;
C3=0;
D3=1;
E3=1;
F3=1;
G3=1;
}break;
case 8:
{
A3=0;
B3=0;
C3=0;
D3=0;
E3=0;
F3=0;
G3=0;
}break;
case 9:
{
A3=0;
B3=0;
C3=0;
D3=0;
E3=1;
F3=0;
G3=0;
}break;
case 10://desliga o numero
{
A3=1;
B3=1;
C3=1;
D3=1;
E3=1;
F3=1;
G3=1;
}break;
}
}
void converte(long quant)
{
int dg1=0,dg2=0,dg3=0;
if(quant<1000) { while(quant>=100)
{
quant=quant-100;
dg1++;
}
while(quant>=10)
{
quant=quant-10;
dg2++;
}
while(quant>0)
{
quant=quant-1;
dg3++;
}
mostrar(0,dg1,dg2,dg3,1);
}
else
{
if(quant>=10000)
{
quant= quant/100;
while(quant>=100)
{
quant=quant-100;
dg1++;
}
while(quant>=10)
{
quant=quant-10;
dg2++;
}
while(quant>0)
{
quant=quant-1;
dg3++;
}
mostrar(0,dg1,dg2,dg3,3);
}
else
{
quant= quant/10;
while(quant>=100)
{
quant=quant-100;
dg1++;
}
while(quant>=10)
{
quant=quant-10;
dg2++;
}
while(quant>0)
{
quant=quant-1;
dg3++;
}
mostrar(0,dg1,dg2,dg3,2);
}
}
}
#int_ccp1
void isr()
{
aux++;
sobe=CCP_1;
if(aux==1)
{
sobe2=sobe;
}
}


void main()
{
Set_tris_a(0);
Set_tris_b(0);
Set_tris_c(0b01000000);
Set_tris_d(0);
Set_tris_e(0);
output_a (255);
output_b (255);
output_c (255);
output_d (255);
output_e (255);
setup_ccp1(CCP_CAPTURE_RE); // Configure CCP1 to capture rise
setup_timer_1(T1_INTERNAL); // Start timer 1
enable_interrupts(INT_CCP1); // Setup interrupt on falling edge
enable_interrupts(GLOBAL);
aux=0;
mostrar(0,0,0,0,1);
for(;;)
{
if(aux==2)
{
disable_interrupts(INT_CCP1); // Setup interrupt on falling edge
disable_interrupts(GLOBAL);
//printf(" periodo %f us \n", periodo );//se for de 4Mhz não prescisa de dividir

printf("\r sobe %lu \n", sobe );
printf("\r sobe2 %lu \n", sobe2 );
if(sobe>sobe2)
{
periodo =sobe-sobe2;
}
else
{
periodo=(65536-sobe2)+sobe;
}
printf("\r periodo %lu \n", periodo);
frequencia=1000000/periodo;
frequencia=frequencia;//compensa a divisão
printf("\r frequencia %lu hz \n", frequencia );
converte(frequencia);
delay_ms(100);
aux=0;
enable_interrupts(INT_CCP1); // Setup interrupt on falling edge
enable_interrupts(GLOBAL);
}
}
}

Botões multiplex com o pic


// ****************************************************************************************************************************************************
// botões multiplex
//
// Data: 22/04/2008
// Autor: Aguivone
// Descrição: Botões multiplex
//****************************************************************************************************************************************************
#include <16F877A.h>
#fuses NOWDT,XT, PUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4M)
void main(void)
{
disable_interrupts(GLOBAL);
for(;;)
{
output_low(PIN_B0);//linha A
output_high(PIN_B1);//linha b
output_high(PIN_B2);//linha c
output_high(PIN_B3);//linha d
if (!input(pin_b4)) //se coluna 1 em nivel baixo numero7
{
output_high(PIN_D0);//Coluna 1
}
else
{
output_low(PIN_D0);//Coluna 1
}
if (!input(pin_b5)) //se coluna 1 em nivel baixo numero8
{
output_high(PIN_D1);//Coluna 1
}
else
{
output_low(PIN_D1);//Coluna 1
}
if (!input(pin_b6)) //se coluna 1 em nivel baixo numero9
{
output_high(PIN_D2);//Coluna 1
}
else
{
output_low(PIN_D2);//Coluna 1
}


output_high(PIN_B0);//linha A
output_low(PIN_B1);//linha b
output_high(PIN_B2);//linha c
output_high(PIN_B3);//linha d
if (!input(pin_b4)) //se coluna 1 em nivel baixo numero4
{
output_high(PIN_D3);//Coluna 1
}
else
{
output_low(PIN_D3);//Coluna 1
}
if (!input(pin_b5)) //se coluna 1 em nivel baixo numero5
{
output_high(PIN_D4);//Coluna 1
}
else
{
output_low(PIN_D4);//Coluna 1
}
if (!input(pin_b6)) //se coluna 1 em nivel baixo numero6
{
output_high(PIN_D5);//Coluna 1
}
else
{
output_low(PIN_D5);//Coluna 1
}


output_high(PIN_B0);//linha A
output_high(PIN_B1);//linha b
output_low(PIN_B2);//linha c
output_high(PIN_B3);//linha d
if (!input(pin_b4)) //se coluna 1 em nivel baixo numero1
{
output_high(PIN_D6);//Coluna 1
}
else
{
output_low(PIN_D6);//Coluna 1
}
if (!input(pin_b5)) //se coluna 1 em nivel baixo numero2
{
output_high(PIN_D7);//Coluna 1
}
else
{
output_low(PIN_D7);//Coluna 1
}
if (!input(pin_b6)) //se coluna 1 em nivel baixo numero3
{
output_high(PIN_E0);//Coluna 1
}
else
{
output_low(PIN_E0);//Coluna 1
}

output_high(PIN_B0);//linha A
output_high(PIN_B1);//linha b
output_high(PIN_B2);//linha c
output_low(PIN_B3);//linha d
if (!input(pin_b5)) //se coluna 1 em nivel baixo numero0
{
output_high(PIN_E1);//Coluna 1
}
else
{
output_low(PIN_E1);//Coluna 1
}

}
}

Ocilador senoidal com o pic

// ****************************************************************************************************************************************************
// oscilador senoidal
//
// Data: 21/10/2008
// Autores: Aguivone
// Descrição: oscilador senoidal de 60hZ  saida no pino RA2
//
// ****************************************************************************************************************************************************
#include <16F877A.h>
#FUSES NOWDT, XT, PUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD
#use delay(clock=4M)
void senoide(void)
{
setup_vref(VREF_LOW | VREF_A2 | 1);//0,208
delay_us(160);
setup_vref(VREF_LOW | VREF_A2 | 2);//0,416
delay_us(155);
setup_vref(VREF_LOW | VREF_A2 | 3);//0,625
delay_us(157);
setup_vref(VREF_LOW | VREF_A2 | 4);//0,833
delay_us(163);
setup_vref(VREF_LOW | VREF_A2 | 5);//1,044
delay_us(161);
setup_vref(VREF_LOW | VREF_A2 | 6);//1,25
delay_us(154);
setup_vref(VREF_LOW | VREF_A2 | 7);//1,45
delay_us(97);
setup_vref(VREF_HIGH | VREF_A2 | 2);//1,56
delay_us(80);
setup_vref(VREF_LOW | VREF_A2 | 8);//1,667
delay_us(44);
setup_vref(VREF_HIGH | VREF_A2 | 3);//1,718
delay_us(133);
setup_vref(VREF_LOW | VREF_A2 | 9);//1,87
delay_us(142);
setup_vref(VREF_HIGH | VREF_A2 | 5);//2,03
delay_us(44);
setup_vref(VREF_LOW | VREF_A2 | 10);//2,08
delay_us(60);
setup_vref(VREF_HIGH | VREF_A2 | 6);//2,18
delay_us(135);
setup_vref(VREF_LOW | VREF_A2 | 11);//2,29
delay_us(45);
setup_vref(VREF_HIGH | VREF_A2 | 7);//2,34
delay_us(168);
setup_vref(VREF_LOW | VREF_A2 | 12);//2,5
delay_us(159);
setup_vref(VREF_HIGH | VREF_A2 | 9);//2,656
delay_us(63);
setup_vref(VREF_LOW | VREF_A2 | 13);//2,708
delay_us(110);
setup_vref(VREF_HIGH | VREF_A2 | 10);//2,81
delay_us(130);
setup_vref(VREF_LOW | VREF_A2 | 14);//2,916
delay_us(62);
setup_vref(VREF_HIGH | VREF_A2 | 11);//2,96
delay_us(230);
setup_vref(VREF_LOW | VREF_A2 | 15);//3,125
delay_us(258);
setup_vref(VREF_HIGH | VREF_A2 | 13);//3,28
delay_us(328);
setup_vref(VREF_HIGH | VREF_A2 | 14);//3,437
delay_us(771);
setup_vref(VREF_HIGH | VREF_A2 | 15);//3,59
delay_us(35);
//até aqui é 90°///////////////////////////////////////////////////////////////
setup_vref(VREF_HIGH | VREF_A2 | 14);
delay_us(771);
setup_vref(VREF_HIGH | VREF_A2 | 13);
delay_us(328);
setup_vref(VREF_low | VREF_A2 | 15);
delay_us(258);
setup_vref(VREF_HIGH | VREF_A2 | 11);
delay_us(230);
setup_vref(VREF_LOW | VREF_A2 | 14);
delay_us(62);
setup_vref(VREF_HIGH | VREF_A2 | 10);
delay_us(130);
setup_vref(VREF_LOW | VREF_A2 | 13);
delay_us(110);
setup_vref(VREF_HIGH | VREF_A2 | 9);
delay_us(63);
setup_vref(VREF_LOW | VREF_A2 | 12);
delay_us(159);
setup_vref(VREF_HIGH | VREF_A2 | 7);
delay_us(168);
setup_vref(VREF_LOW | VREF_A2 | 11);
delay_us(45);
setup_vref(VREF_HIGH | VREF_A2 |6);
delay_us(135);
setup_vref(VREF_LOW | VREF_A2 | 10);
delay_us(60);
setup_vref(VREF_HIGH | VREF_A2 |5);
delay_us(44);
setup_vref(VREF_LOW | VREF_A2 | 9);
delay_us(142);
setup_vref(VREF_HIGH | VREF_A2 | 3);
delay_us(133);
setup_vref(VREF_LOW | VREF_A2 | 8);
delay_us(44);
setup_vref(VREF_HIGH | VREF_A2 |2);
delay_us(80);
setup_vref(VREF_LOW | VREF_A2 | 7);
delay_us(97);
setup_vref(VREF_LOW | VREF_A2 | 6);
delay_us(154);
setup_vref(VREF_LOW | VREF_A2 | 5);
delay_us(161);
setup_vref(VREF_LOW | VREF_A2 | 4);
delay_us(163);
setup_vref(VREF_LOW | VREF_A2 | 3);
delay_us(157);
setup_vref(VREF_LOW | VREF_A2 | 2);
delay_us(155);
setup_vref(VREF_LOW | VREF_A2 | 1);
delay_us(150);
}
void main()
{
Set_tris_b(0);
Set_tris_a(0);
setup_comparator(NC_NC_NC_NC);//desabilita os comparadores
// se vref no modo hight=vdd/4+vdd*valor/32
// se vref no modo low=vdd*valor/24
// se vref no modo false desligado
//o valor 10 é o valor usado na formula
//sendo que este pode variar ate 15
for(;;)
{
senoide();
}
}

sequencial de leds 3 cores

video do sequencial de leds colocado em uma moto.



//sequencial individual 2x2
//23/12/2007
#include <16f877A.h> //
#fuses NOWDT, XT, PUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay (clock=4000000) // usado nos delays, define o CLOCK usado. No caso, 4MHz
long int a;
int b,c,e,d;
// a=tempo, b=auxiliar, c=auxiliar,d=auxiliar.
//C0=vermelho 1-ligado e 0-desligado
//C1=verde 1-ligado e 0-desligado
//C2=amarelo 1-ligado e 0-desligado
//
void uma(void)
{
output_a (255);
output_b (255);
output_d (255);
output_c (2);//verde
delay_ms(a);
output_c (0);//apaga
delay_ms(a);
output_c (1);//vermelho
delay_ms(a);
output_c (0);//apaga
delay_ms(a);
output_c (4);//amarelo
delay_ms(a);
output_c (0);//apaga
delay_ms(a);
}
void bargraf(void)
{
output_a (0);
output_b (1);
output_d (0);
delay_ms(a);
output_b (3);
delay_ms(a);
output_b (7);
delay_ms(a);
output_b (15);
delay_ms(a);
output_b (31);
delay_ms(a);
output_b (63);
delay_ms(a);
output_b (127);
delay_ms(a);
output_b (255);
delay_ms(a);
output_d (1);
delay_ms(a);
output_d (3);
delay_ms(a);
output_d (7);
delay_ms(a);
output_d (15);
delay_ms(a);
output_d (31);
delay_ms(a);
output_d (63);
delay_ms(a);
output_d (127);
delay_ms(a);
output_d (255);
delay_ms(a);
output_a (1);
delay_ms(a);
output_a (3);
delay_ms(a);
output_a (7);
delay_ms(a);
output_a (15);
delay_ms(a);
}
void vai(void)
{
output_a (0);
output_d (0);
output_b (1);
delay_ms(a);
output_b (2);
delay_ms(a);
output_b (4);
delay_ms(a);
output_b (8);
delay_ms(a);
output_b (16);
delay_ms(a);
output_b (32);
delay_ms(a);
output_b (64);
delay_ms(a);
output_b (128);
delay_ms(a);
output_a (0);
output_b (0);
output_d (1);
delay_ms(a);
output_d (2);
delay_ms(a);
output_d (4);
delay_ms(a);
output_d (8);
delay_ms(a);
output_d (16);
delay_ms(a);
output_d (32);
delay_ms(a);
output_d (64);
delay_ms(a);
output_d (128);
delay_ms(a);
output_d (0);
output_b (0);
output_a (1);
delay_ms(a);
output_a (2);
delay_ms(a);
output_a (4);
delay_ms(a);
output_a (8);
delay_ms(a);
}
void vem(void)
{
output_a (0);
output_d (0);
output_b (1);
delay_ms(a);
output_b (2);
delay_ms(a);
output_b (4);
delay_ms(a);
output_b (8);
delay_ms(a);
output_b (16);
delay_ms(a);
output_b (32);
delay_ms(a);
output_b (64);
delay_ms(a);
output_b (128);
delay_ms(a);
output_a (0);
output_b (0);
output_d (1);
delay_ms(a);
output_d (2);
delay_ms(a);
output_d (4);
delay_ms(a);
output_d (8);
delay_ms(a);
output_d (16);
delay_ms(a);
output_d (32);
delay_ms(a);
output_d (64);
delay_ms(a);
output_d (128);
delay_ms(a);
output_d (0);
output_b (0);
output_a (1);
delay_ms(a);
output_a (2);
delay_ms(a);
output_a (4);
delay_ms(a);
output_a (8);
delay_ms(a);
}


void duas(int c,int b)//cor1 cor2
{
for(e=0;e<21;e++)//tempo da luz acesa 10ms
{
a=1;
output_c (c);
output_b (1);
output_a (0);
output_d (0);
delay_ms(a);
output_c (b);
output_a (8);
output_d (0);
output_b (0);
delay_ms(a);
}
for(e=0;e<21;e++)//tempo da luz acesa 10ms
{
a=1;
output_c (c);
output_b (2);
output_a (0);
output_d (0);
delay_ms(a);
output_c (b);
output_a (4);
output_d (0);
output_b (0);
delay_ms(a);
}
for(e=0;e<21;e++)//tempo da luz acesa 10ms
{
a=1;
output_c (c);
output_b (4);
output_a (0);
output_d (0);
delay_ms(a);
output_c (b);
output_a (2);
output_d (0);
output_b (0);
delay_ms(a);
}
for(e=0;e<21;e++)//tempo da luz acesa 10ms
{
a=1;
output_c (c);
output_b (8);
output_a (0);
output_d (0);

delay_ms(a);
output_c (b);
output_a (1);
output_d (0);
output_b (0);
delay_ms(a);
}
for(e=0;e<21;e++)//tempo da luz acesa 10ms
{
a=1;
output_c (c);
output_b (16);
output_a (0);
output_d (0);
delay_ms(a);
output_c (b);
output_d (128);
output_a (0);
output_b (0);
delay_ms(a);
}
for(e=0;e<21;e++)//tempo da luz acesa 10ms
{
a=1;
output_c (c);
output_b (32);
output_a (0);
output_d (0);
delay_ms(a);
output_c (b);
output_d (64);
output_a (0);
output_b (0);
delay_ms(a);
}
for(e=0;e<21;e++)//tempo da luz acesa 10ms
{
a=1;
output_c (c);
output_b (64);
output_a (0);
output_d (0);
delay_ms(a);
output_c (b);
output_d (32);
output_b (0);
output_a (0);
delay_ms(a);
}
for(e=0;e<21;e++)//tempo da luz acesa 10ms
{
a=1;
output_c (c);
output_b (128);
output_a (0);
output_d (0);
delay_ms(a);
output_c (b);
output_d (16);
output_b (0);
output_a (0);
delay_ms(a);
}
for(e=0;e<21;e++)//tempo da luz acesa 10ms
{
a=1;
output_c (c);
output_d (1);
output_b (0);
output_a (0);
delay_ms(a);
output_c (b);
output_d (8);
output_b (0);
output_a (0);
delay_ms(a);
}
for(e=0;e<21;e++)//tempo da luz acesa 10ms
{
a=1;
output_c (b);
output_d (2);
delay_ms(a);
output_c (c);
output_d (4);
delay_ms(a);
}
//do meio para borda
for(e=0;e<21;e++)//tempo da luz acesa 10ms
{
a=1;
output_c (b);
output_d (1);
delay_ms(a);
output_c (c);
output_d (8);
delay_ms(a);
}
for(e=0;e<21;e++)//tempo da luz acesa 10ms
{
a=1;
output_c (b);
output_b (128);
output_a (0);
output_d (0);
delay_ms(a);
output_c (c);
output_d (16);
output_b (0);
output_a (0);
delay_ms(a);
}
for(e=0;e<21;e++)//tempo da luz acesa 10ms
{
a=1;
output_c (b);
output_b (64);
output_a (0);
output_d (0);
delay_ms(a);
output_c (c);
output_b (0);
output_a (0);
output_d (32);
delay_ms(a);
}
for(e=0;e<21;e++)//tempo da luz acesa 10ms
{
a=1;
output_c (b);
output_b (32);
output_a (0);
output_d (0);
delay_ms(a);
output_c (c);
output_d (64);
output_b (0);
output_a (0);
delay_ms(a);
}
for(e=0;e<21;e++)//tempo da luz acesa 10ms
{
a=1;
output_c (b);
output_b (16);
output_a (0);
output_d (0);
delay_ms(a);
output_c (c);
output_d (128);
output_b (0);
output_a (0);
delay_ms(a);
}
for(e=0;e<21;e++)//tempo da luz acesa 10ms
{
a=1;
output_c (b);
output_b (8);
output_a (0);
output_d (0);
delay_ms(a);
output_c (c);
output_a (1);
output_b (0);
output_d (0);
delay_ms(a);
}
for(e=0;e<21;e++)//tempo da luz acesa 10ms
{
a=1;
output_c (b);
output_b (4);
output_a (0);
output_d (0);
delay_ms(a);
output_c (c);
output_a (2);
output_b (0);
output_d (0);
delay_ms(a);
}
for(e=0;e<21;e++)//tempo da luz acesa 10ms
{
a=1;
output_c (b);
output_b (2);
output_a (0);
output_d (0);
delay_ms(a);
output_c (c);
output_a (4);
output_b (0);
output_d (0);
delay_ms(a);
}
for(e=0;e<21;e++)//tempo da luz acesa 10ms
{
a=1;
output_c (b);
output_b (1);
output_a (0);
output_d (0);
delay_ms(a);
output_c (c);
output_a (8);
output_b (0);
output_d (0);
delay_ms(a);
}
}


void main()
{
set_tris_a(0); // define o port a como saída
set_tris_b(0); // define o port b como saída
set_tris_c(0); // define o port c como saída
set_tris_d(0); // define o port d como saída
set_tris_e(0); // define o port e como saída
a=200;//30;
for(;;)
{
output_a (0);
output_b (0);
output_c (0);
output_d (0);
output_e (0);

//uma cor
for(b=0;b<20;b++)
{
a=60; //define velocidade
uma();
}

//vai e vem de uma cor
for(b=0;b<2;b++)
{
a=30; //define velocidade
output_c (2);//verde
vai();
output_c (1);//vermelho
vem();
output_c (4);//amarelo
vai();
output_c (2);//verde
vem();
output_c (1);//vermelho
vai();
output_c (4);//verde
vem();
}
//só vai
for(b=0;b<2;b++)
{
a=20;
output_c (2);//verde
vai();
output_c (1);//vermelho
vai();
output_c (4);//amarelo
vai();
}
for(b=0;b<2;b++)
{
a=5;
output_c (2);//verde
vai();
output_c (1);//vermelho
vai();
output_c (4);//amarelo
vai();
}
//só vai 2 cores
for(b=0;b<2;b++)
{
a=50;
output_c (3);//verde/vm
vai();
output_c (5);//vermelho/am
vai();
output_c (6);//amarelo/vd
vai();
}

//tres cores
for(b=0;b<3;b++)
{
output_c (7);
a=50;
vai();
}
//duas cores em direcoes contrarias
for(d=0;d<3;d++)
{
duas(2,1);//vd vm
duas(1,2);//vm vd
duas(1,4);//vm am
duas(4,1);//am vm
duas(2,4);//vd am
duas(4,2);//am vd
}
// vai acendendo
for(d=0;d<2;d++)
{
a=80;
output_c (2);//verde
bargraf();
output_c (1);//vermelho
bargraf();
output_c (4);//amarelo
bargraf();
//
}


}

}

Frequencimetro com o pic

// frequencimetro
//entrada pino c1 ec2
//autor:aguivone
//autor : aguivone
//12 de janeiro de 2008

// nota: no proteus não simulou mas funcionou na pratica.

//.............................................................................................

#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20M)
#use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7)

boolean a;
int32 sobe,sobe2,valor;
float periodo,frequencia;
#int_ccp1
void isr2()
{
sobe=CCP_1;
}

#int_ccp2
void isr()
{
sobe2 = CCP_2;
valor =sobe2-sobe;
a=1;
}
void main()
{
#priority ccp2,ccp1
setup_ccp1(CCP_CAPTURE_RE); // Configure CCP1 to capture rise
setup_ccp2(CCP_CAPTURE_RE); // Configure CCP2 to capture subida
setup_ccp2(CCP_CAPTURE_DIV_4);
setup_timer_1(T1_INTERNAL); // Start timer 1
enable_interrupts(INT_CCP2); // Setup interrupt on falling edge
enable_interrupts(INT_CCP1); // Setup interrupt on falling edge
enable_interrupts(GLOBAL);
a=0;
while(TRUE) {
if(a==1)
{
periodo=valor/5;
printf(" periodo %f us \n", periodo );//se fosse de 4Mhz não prescisava de dividir
if(periodo<1000)
{
frequencia=1000000/periodo;
frequencia=frequencia/1000;
printf("\r frequencia %f Khz ", frequencia );
}
else
{
frequencia=1000000/periodo;
printf("\r frequencia %f hz ", frequencia );
}

a=0;
}
}
}

Discadora por pulso via pc (com pic)

// discadora por pulso via pc
//Autor :Aguivone
//data : 29/01/2008
//..............................................................

#include <16f877A.h>
#fuses NOWDT, XT, PUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay (clock=4M) // usado nos delays, define o CLOCK usado. No caso, 4_MHz
#use RS232(baud=9600, parity=N, bits=8, xmit=PIN_C6,rcv=PIN_C7)
#locate tx_reg= 0x19
#locate rx_reg= 0x1A
int digito[20],max,aux,a,b;
long int p;
int16 reg;
boolean flag,ok,fim;
char dado;
//funçoes auxiliares...................................
void pulso(void)
{
output_high(PIN_B4);
delay_ms(30);
output_low(PIN_B4);
delay_ms(60);
}
void tempo(long int valor)
{
p=0;
reg=0;
fim=0;
while(reg!=1)
{
delay_ms(1);
if(fim==1||p==valor)
{
reg=1;
}
p++;
}
}
///interrupção.........................................
#int_RDA
void recebido(void)
{
dado = rx_reg;
if(flag==1)
{

switch(dado)
{
case '0':digito[aux]=10;
break;
case '1':digito[aux]=1;
break;
case '2':digito[aux]=2;
break;
case '3':digito[aux]=3;
break;
case '4':digito[aux]=4;
break;
case '5':digito[aux]=5;
break;
case '6':digito[aux]=6;
break;
case '7':digito[aux]=7;
break;
case '8':digito[aux]=8;
break;
case '9':digito[aux]=9;
break;
case 'f':
{
max=aux;
flag=0;
ok=1;
aux=0;
}
break;
}
aux++;
}
if(dado =='*')
{
flag=1;
aux=0;
}
if(dado=='#')
{
fim=1;
}
}

//função principal.............................................
void main(void)
{
port_b_pullups(FALSE);
enable_interrupts(global);
enable_interrupts(int_rda); //interrupção de recebimento
for(a=0;a<=20;a++) { digito[a]=0; } for(;;) { if (ok==1) { output_high(PIN_B4); tempo(2500); for(b=0;b<=max;b++) { if(digito[b]>0)
{
for(a=1;a<=digito[b];a++)
{
pulso();
}
output_high(PIN_B4);
tempo(620);
}
else
{
output_high(PIN_B4);
}

}
output_high(PIN_B4);
tempo(60000); //espera 1 minuto
printf("ok"); //tempo para atender e depois desliga
for(a=0;a<=20;a++)
{
digito[a]=0;
}
output_low(PIN_B4);
aux=0;
ok=0;
flag=0;
}
}
}

Usando LCD modo 8 bits e 4 bits com pic

// ****************************************************************************************************************************************************
// usando display de lcd
//
// autor: Aguivone
// DATA: 24/07/2009
// Descrição: lcd no modo 8 bits exemplo
//
//
// ****************************************************************************************************************************************************
#include <16F877A.h>
#ignore_warnings 203, 216
#fuses NOWDT,XT, PUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4M)

/////////////////////////display lcd//////////////////////////////////////////////////////////////////
#define RS PIN_E0
#define RW PIN_E1
#define EN PIN_E2

//função principal////////////////////////////////////////////////////////////////////////////////////
void main(void)
{
////inicializa display
delay_ms(15);
output_low(RW);
output_low(RS);
output_high(EN);
output_b(0x38);//modo de 8 bits
delay_us(2);
output_low(EN);
delay_ms(5);
output_high(EN);
output_b(0x38);//modo de 8 bits
delay_us(2);
output_low(EN);
delay_ms(5);
output_high(EN);
//output_b(0x0E);//cursor ligado
output_b(0x0C);//cursor desligado
delay_us(2);
output_low(EN);
delay_ms(5);
output_high(EN);
output_b(0x06);//direção de movimento
delay_us(2);
output_low(EN);
delay_ms(5);
output_high(EN);
output_b(0x01);//limpa display
delay_us(2);
output_low(EN);
delay_ms(5);

//prepara envio

delay_ms(15);
output_bit(RS,0);// envia comando
output_high(EN);
output_b(0x80); //poe na linha 1 posicão 0
delay_us(2);
output_low(EN);
delay_us(5);
output_bit(RS,1);// envia dados
output_high(EN);
output_b(' '); //poe na linha 1 posicão 1
delay_us(2);
output_low(EN);
delay_us(5);
output_bit(RS,1);// envia dados
output_high(EN);
output_b('P'); //poe na linha 1 posicão 2
delay_us(2);
output_low(EN);
delay_us(5);
output_bit(RS,1);// envia dados
output_high(EN);
output_b('r'); //poe na linha 1 posicão 3
delay_us(2);
output_low(EN);
delay_us(5);
output_bit(RS,1);// envia dados
output_high(EN);
output_b('o'); //poe na linha 1 posicão 4
delay_us(2);
output_low(EN);
delay_us(5);
output_bit(RS,1);// envia dados
output_high(EN);
output_b('g'); //poe na linha 1 posicão 5
delay_us(2);
output_low(EN);
delay_us(5);
output_bit(RS,1);// envia dados
output_high(EN);
output_b('r'); //poe na linha 1 posicão 6
delay_us(2);
output_low(EN);
delay_us(5);
output_bit(RS,1);// envia dados
output_high(EN);
output_b('a'); //poe na linha 1 posicão 7
delay_us(2);
output_low(EN);
delay_us(5);
output_bit(RS,1);// envia dados
output_high(EN);
output_b('m'); //poe na linha 1 posicão 8
delay_us(2);
output_low(EN);
delay_us(5);
output_bit(RS,1);// envia dados
output_high(EN);
output_b('a'); //poe na linha 1 posicão 9
delay_us(2);
output_low(EN);
delay_us(5);
output_bit(RS,0);// envia comando
output_high(EN);
output_b(0xC0); //poe na linha 2 posicão 0
delay_us(2);
output_low(EN);
delay_us(5);
output_bit(RS,1);// envia dados
output_high(EN);
output_b(' '); //poe na linha 2 posicão 1
delay_us(2);
output_low(EN);
delay_us(5);
output_bit(RS,1);// envia dados
output_high(EN);
output_b(' '); //poe na linha 2 posicão 2
delay_us(2);
output_low(EN);
delay_us(5);
output_bit(RS,1);// envia dados
output_high(EN);
output_b('e'); //poe na linha 2 posicão 3
delay_us(2);
output_low(EN);
delay_us(5);
output_bit(RS,1);// envia dados
output_high(EN);
output_b('x'); //poe na linha 2 posicão 4
delay_us(2);
output_low(EN);
delay_us(5);
output_bit(RS,1);// envia dados
output_high(EN);
output_b('e'); //poe na linha 2 posicão 5
delay_us(2);
output_low(EN);
delay_us(5);
output_bit(RS,1);// envia dados
output_high(EN);
output_b('m'); //poe na linha 2 posicão 6
delay_us(2);
output_low(EN);
delay_us(5);
output_bit(RS,1);// envia dados
output_high(EN);
output_b('p'); //poe na linha 2 posicão 7
delay_us(2);
output_low(EN);
delay_us(5);
output_bit(RS,1);// envia dados
output_high(EN);
output_b('l'); //poe na linha 2 posicão 8
delay_us(2);
output_low(EN);
delay_us(5);
output_bit(RS,1);// envia dados
output_high(EN);
output_b('o'); //poe na linha 2 posicão 9
delay_us(2);
output_low(EN);
delay_us(5);

}

MODO 4 bits

#include <16F877A.h>
#fuses NOWDT,XT, PUT, NOPROTECT, DEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4M)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)


# include

void main ()
{

lcd_init ();
lcd_gotoxy (1,1);
lcd_putc ( " usando lcd :"); //escreve na primeira linha
lcd_putc ( "\n teste");//esccreve na linha 2
delay_ms(1000);
lcd_putc ( " \f "); //manda apagar
delay_ms(500);
lcd_putc ( " ok"); //manda voltar 1 pos
}
// \ f Limpar lcd
// \ n Ir ao início da segunda linha
/*
d0 en
d1 rs
d2 rw
d4 D4
d5 D5
d6 D6
d7 D7 */

usando RS485

programa do mestre

//****************************************************************************************************************************************************
// comunicação rs-485
//
// Data: 14/12/2007
// Autores: Aguivone
// descrição : quando receber a palavra "valor" acende um led.
//****************************************************************************************************************************************************
#include <16F628A.h>
#fuses NOWDT,XT,PUT, NOPROTECT,NOBROWNOUT, NOLVP, NOCPD,NOMCLR
#use delay(clock=4M)
#use rs232(baud=9600,parity=N,xmit=PIN_B2,rcv=PIN_B1,enable=PIN_B0)
#locate rx_reg = 0x1A
#include <string.h>
char rec[7],palavra[7]={"valor"},caracter;
int n,i;
//......................................
// interrupção
//......................................
#int_RDA
void recebido(void)
{
caracter = rx_reg;
if(caracter =='*')
{
n=2;
rec[i]=0;
}
if(n==1)
{
rec[i]=caracter;
i++;
}
if(caracter =='#')
{
n=1;
i=0;
}

}

//;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
// rotina principal
//;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
void main(void)
{
port_b_pullups(FALSE);
enable_interrupts(global);
enable_interrupts(int_rda); //interrupção de recebimento
for(;;)
{
if(n==2)
{
disable_interrupts(global);
if(strcmp(palavra,rec)==0)
{

output_high(PIN_B4);
delay_ms(500);
output_low(PIN_B4);
rec[0]=0;
rec[1]=0;
rec[2]=0;
rec[3]=0;
rec[4]=0;
rec[5]=0;
rec[6]=0;
n=0;
i=0;
enable_interrupts(global);
}
n=0;
i=0;
enable_interrupts(global);
}
else
{


}
}
}

programa do escravo:


// ****************************************************************************************************************************************************
// comunicação rs-485
//
// Data: 14/12/2007
// Autores: Aguivone
// descrição: envia a palavra "#valor*" a cada 1 segundo,
// ****************************************************************************************************************************************************
#include <16F628A.h>
#fuses NOWDT,XT,PUT, NOPROTECT,NOBROWNOUT, NOLVP, NOCPD,NOMCLR
#use delay(clock=4M)
#use rs232(baud=9600,parity=N,xmit=PIN_B2,rcv=PIN_B1,enable=PIN_B0)
#locate rx_reg = 0x1A
 #include <string.h>

//;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
// rotina principal
//;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
void main(void)
{
port_b_pullups(FALSE);
disable_interrupts(global);
for(;;)
{
printf("#valor*");
delay_ms(1000);
}
}
//;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Usando memoria eeprom do pic

// usando a memoria para armazenar uma variavel do tipo long
//autor: Aguivone
//data : 01/01/09
//
//
// note que foi preciso usar duas posiçoes de memoria(8+8 bits)
//
//...........................................................................
#include <12F675.h>
#device adc=8
#FUSES NOWDT,XT, NOCPD, NOPROTECT, NOMCLR, NOPUT, NOBROWNOUT
#use delay(clock=4M)
#use rs232(baud=9600,parity=N,xmit=PIN_A0,rcv=PIN_A1,bits=8)
#bit botao= 0x05.2
#bit botao2= 0x05.3
int contagem=0,contador=0;
long int valor;
void main()
{
contagem=read_eeprom(1);
contador=read_eeprom(2);
for(;;)
{
if(botao==0)
{
contagem++;
if(contagem==254)
{contador++;
contagem=0;}
write_eeprom(1,contagem);
write_eeprom(2,contador);
delay_ms(200);
while(botao==0);
delay_ms(200);
if(contador==0)
{
valor=contagem;
printf("\n\r botao pressionado = %lu",valor);
}
else
{
valor=(((long)contador*254) + ((long)contagem));
printf("\n\r botao precionado = %lu",valor);
}}
if(botao2==0)
{
contagem=0;
contador=0;
write_eeprom(1,0);
write_eeprom(2,0);
printf("\n\r memoria zerada!");
delay_ms(200);
while(botao==0);
delay_ms(200);
}
}
}

Pisca led usando o timer 0

//****************************************************************************************************************************************************
// pisca a cada 1s
//
// Data: 22/10/2007
// Autores: Aguivone
// Descrição: utiliza timer0 para fazer um led piscar a cada 30s
//
//****************************************************************************************************************************************************

#include <16F628A.h>
#fuses NOWDT,XT,PUT, NOPROTECT,NOBROWNOUT, NOLVP, NOCPD,NOMCLR
#use delay(clock=4M)

#int_timer0
void trata_t0 ()//note que a frequencia de cada interrupção é 1,56hz=0,064s cada interrupção(aproximadamente)
{
static boolean led;
static long int conta;
// reinicia o timer0 em 6 mais a contagem que já passou
set_timer0(6+get_timer0());
conta++;
// se já ocorreram 15 interrupções = 30s(aproximadamente (15,6 int.))
if (conta == 15)
{
conta=0;
led = !led; // inverte o led
output_bit (pin_b0,led);
}
}

void main(void)
{
// Configuração do programa
port_b_pullups(TRUE);
set_tris_A(0x00);
set_tris_B(0x02);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);//1mh
set_timer0(6);
enable_interrupts(global|int_timer0);
while(true);//não faz nada e fica esperando interrupção de timer0
}

Exemplo de uso da serial (rs232)

//****************************************************************************************************************************************************
//
//
// Data: 22/10/2007
// Autor: Aguivone
// Descrição: comunicando com PC via RS-232
//
//****************************************************************************************************************************************************

#include <12F675.h>
#device adc=8
#FUSES NOWDT, INTRC_IO, NOCPD, NOPROTECT, NOMCLR, NOPUT, NOBROWNOUT
#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_A0,rcv=PIN_A1,bits=8)
//qualquer pino do chip funciona como saida de dados
char teste;
void main()
{
delay_ms(100);
printf("Pronto para receber dados :");
for(;;)
{
teste=getc();
printf("tecla pressionada %c \r\n",teste);
}
}

o programa irá mostrar qual tecla foi precionada!

Voltimetro com pic

// Voltimetro via pc
//Autor: aguivone
//data :24-08-09
///............................................................................


#include <16f877A.h>
#fuses NOWDT,HS, PUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#device ADC=10 // define que o AD utilizado será de 10 bits
#use delay (clock=20M) // usado nos delays, define o CLOCK usado. No caso, 4MHz
#BYTE PORTC = 0x07 // define que PORTC é o file register no endereço 07H
#BYTE PORTD = 0x08 // idem para o PORTD no endereço 08H
#use RS232(baud=19200, parity=N, bits=8, xmit=PIN_C6,rcv=PIN_C7)

float LIDO,valor;



void main()

{

enable_interrupts(GLOBAL); //Estas linhas configuram o leitor AD

setup_adc_ports(ALL_ANALOG); //Configuração do conversor AD para pino RA0

setup_adc(ADC_CLOCK_INTERNAL);//Configuração do clock do conversor AD

set_adc_channel(0); //Congiguração do canal do conversor AD

set_tris_c(0); // define o port C como saída

set_tris_d(0); // define o port D como saída

while(1)

         {

          LIDO =read_adc() ; // busca o valor do AD, que vai de 0 a 1023. Usa uma função (subrotina) descrita anteriormente.

           valor=((LIDO+1)*(5))/1023 ;

           printf("\n\r%f volts ",valor);

           }

 

}



//pino de entrada pino 2