sexta-feira, 12 de novembro de 2010

ORGÃO ELETRÔNICO

Por Rafael Varango de Aguiar

                                                              
CÓDIGO FONTE:


/**************************************************************************
* Orção Eletronico *
***************************************************************************
* Rafael Varago de Aguiar Varago Automatics *
***************************************************************************
* Versão: 2.1 *
* Data: 21/08/2010 *
* *
* RAM: 5% ROM: 19% *
***************************************************************************
* Controla um alto-falante tocando o som de 9 notas musicais *
* selecionadas via teclado, além do som, a nota e a frequencia *
* serão exibidas no display LCD *
**************************************************************************/
#include <16f877a.h> // Informa o PIC
#device adc=10 // Configura conversor AD para 10 bits
#fuses XT,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP,NOCPD,NOWRT // Configs internas
#use delay (clock=4000000) // Seleciona delay para 4Mhz de clock
/**************************************************************************
**************************************************************************/
// Definições de pinos
#define bt0 pin_b0 // Nota DO
#define bt1 pin_b1 // " RE
#define bt2 pin_b2 // " MI
#define bt3 pin_b3 // " FA
#define bt4 pin_b4 // " SOL
#define bt5 pin_b5 // " LA
#define bt6 pin_b6 // " SI
#define bt7 pin_b7 // " DO1
#define bt8 pin_c7 // " RE1
#define fal pin_a0 // Alto-falante
/**************************************************************************
**************************************************************************/
/**************************************************************************
**************************************************************************/
// Estas são as definições dos pinos que o LCD utiliza.
// Definem quais pinos do PIC controlarão os pinos do LCD
#define lcd_enable pin_e0 // pino enable do LCD
#define lcd_rs pin_e1 // pino rs do LCD
#define lcd_db4 pin_d4 // pino de dados d4 do LCD
#define lcd_db5 pin_d5 // pino de dados d5 do LCD
#define lcd_db6 pin_d6 // pino de dados d6 do LCD
#define lcd_db7 pin_d7 // pino de dados d7 do LCD
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Definição e inicialização dos port's *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#use fast_io(a) // Inicialização rápida dos Pinos de I/O
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)
#byte porta = 0x05
#byte portb = 0x06
#byte portc = 0x07
#byte portd = 0x08
#byte porte = 0x09
/**************************************************************************
**************************************************************************/
// Variaveis globais
/***************************************************************************/
/* Rotinas para o LCD */
/***************************************************************************/
//Este é o bloco com as rotinas necessárias para manipular o LCD
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Envio de "Nibble" para o LCD *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//Esta rotina lê o "Nibble" inferior de uma variável e envia para o LCD.
void envia_nibble_lcd(int dado)
{
//Carrega as vias de dados (pinos) do LCD de acordo com o nibble lido
output_bit(lcd_db4, bit_test(dado,0)); //Carrega DB4 do LCD com o bit DADO<0>
output_bit(lcd_db5, bit_test(dado,1)); //Carrega DB5 do LCD com o bit DADO<1>
output_bit(lcd_db6, bit_test(dado,2)); //Carrega DB6 do LCD com o bit DADO<2>
output_bit(lcd_db7, bit_test(dado,3)); //Carrega DB7 do LCD com o bit DADO<3>
//Gera um pulso de enable
output_high(lcd_enable); // ENABLE = 1
delay_us(1); // Recomendado para estabilizar o LCD
output_low(lcd_enable); // ENABLE = 0
return; // Retorna ao ponto de chamada da função
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Envio de Byte para o LCD *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//Esta rotina irá enviar um dado ou um comando para o LCD conforme abaixo:
// ENDEREÇO = 0 -> a variável DADO será uma instrução
// ENDEREÇO = 1 -> a variável DADO será um caractere
void envia_byte_lcd(boolean endereco, int dado)
{
output_bit(lcd_rs,endereco); // Seta o bit RS para instrução ou caractere
delay_us(100); // Aguarda 100 us para estabilizar o pino do LCD
output_low(lcd_enable); // Desativa a linha ENABLE
envia_nibble_lcd(dado>>4); // Envia a parte ALTA do dado/coamndo
envia_nibble_lcd(dado & 0x0f);// Limpa a parte ALTA e envia a parte BAIXA do
// dado/comando
delay_us(40); // Aguarda 40us para estabilizar o LCD
return; // Retorna ao ponto de chamada da função
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Envio de caractere para o LCD *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// Esta rotina serve apenas como uma forma mais fácil de escrever um caractere
// no display. Ela pode ser eliminada e ao invés dela usaremos diretamente a
// função envia_byte_lcd(1,""); ou
// envia_byte_lcd(1,);
void escreve_lcd(char c)
// envia caractere para o display
{
envia_byte_lcd(1,c);
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Função para limpar o LCD *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// Como esta operação pode ser muito utilizada, transformando-a em função
// Faz com que o código compilado seja menor.
void limpa_lcd()
{
envia_byte_lcd(0,0x01); // Envia instrução para limpar o LCD
delay_ms(2); // Aguarda 2ms para estabilizar o LCD
return; // Retorna ao ponto de chamada da função
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Inicializa o LCD *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void inicializa_lcd()
{
output_low(lcd_db4); // Garante que o pino DB4 estão em 0 (low)
output_low(lcd_db5); // Garante que o pino DB5 estão em 0 (low)
output_low(lcd_db6); // Garante que o pino DB6 estão em 0 (low)
output_low(lcd_db7); // Garante que o pino DB7 estão em 0 (low)
output_low(lcd_rs); // Garante que o pino RS estão em 0 (low)
output_low(lcd_enable);// Garante que o pino ENABLE estão em 0 (low)
delay_ms(15); // Aguarda 15ms para estabilizar o LCD
envia_nibble_lcd(0x03);// Envia comando para inicializar o display
delay_ms(5); // Aguarda 5ms para estabilizar o LCD
envia_nibble_lcd(0x03);// Envia comando para inicializar o display
delay_ms(5); // Aguarda 5ms para estabilizar o LCD
envia_nibble_lcd(0x03);// Envia comando para inicializar o display
delay_ms(5); // Aguarda 5ms para estabilizar o LCD
envia_nibble_lcd(0x02);// CURSOR HOME - Envia comando para zerar o contador de
// caracteres e retornar à posição inicial (0x80).
delay_ms(1); // Aguarda 1ms para estabilizar o LCD
envia_byte_lcd(0,0x28);// FUNCTION SET - Configura o LCD para 4 bits,
// 2 linhas, fonte 5X7.
envia_byte_lcd(0,0x0c);// DISPLAY CONTROL - Display ligado, sem cursor
limpa_lcd(); // Limpa o LCD
envia_byte_lcd(0,0x06);// ENTRY MODE SET - Desloca o cursor para a direita
return; // Retorna ao ponto de chamada da função
}
/***************************************************************************/
/* Final das rotinas para o LCD */
/***************************************************************************/
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Configurações do Pic *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
main() // Rotina principal
{
int aux=0; // Auxiliar de laço
// Configura o PIC
setup_adc_ports(no_analogs);
port_b_pullups(true); // Ativa pull-ups do portb
// Reseta portas
portb = 0;
portc = 0;
portd = 0;
porte = 0;
// configura os tris
set_tris_a(0b00111110); // configuração da direção dos pinos de I/O
set_tris_b(0b11111111);
set_tris_c(0b11111110);
set_tris_d(0b00001111);
set_tris_e(0b11111100);
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Rotina principal *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
inicializa_lcd(); // Inicializa LCD
printf(escreve_lcd," VARAGO"); // Imprime VARAGO
envia_byte_lcd(0,0xc3); //Desloca o cursor para a segunda linha do LCD
printf(escreve_lcd,"AUTOMATICS"); // Imprime AUTOMATICS
while (true) // Laço Infinito
{
if(!input(bt0)){ // Botão letra DO
limpa_lcd(); // Limpa LCD
printf(escreve_lcd,"NOTA DO"); // Imprime a nota e a frequencia
envia_byte_lcd(0,0xc0); //Desloca o cursor para a segunda linha do LCD
printf(escreve_lcd,"FREQUENCIA 200Hz"); // Imprime a nota e a frequencia
while(aux != 100){ // Tempo de som
output_high(fal); // Joga nivel alto no pino
delay_ms(5); // Tempo para gerar frequencia de nivel alto
output_low(fal); // Joga nivel baixo no pino
delay_ms(5); // Tempo para gerar frequencia de nivel baixo
aux++; // Aumenta aux
}
aux=0; // Limpa aux
limpa_lcd(); // Limpa LCD
printf(escreve_lcd," VARAGO"); // Imprime VARAGO
envia_byte_lcd(0,0xc3); //Desloca o cursor para a segunda linha do LCD
printf(escreve_lcd,"AUTOMATICS"); // Imprime AUTOMATICS
} // Fim da tecla DO
/***************************************************************************/
if(!input(bt1)){ // Botão letra RE
limpa_lcd(); // Limpa LCD
printf(escreve_lcd,"NOTA RE"); // Imprime a nota e a frequencia
envia_byte_lcd(0,0xc0); //Desloca o cursor para a segunda linha do LCD
printf(escreve_lcd,"FREQUENCIA 246Hz"); // Imprime a nota e a frequencia
while(aux != 100){ // Tempo de som
output_high(fal); // Joga nivel alto no pino
delay_ms(4); // Tempo para gerar frequencia de nivel alto
delay_us(60);
output_low(fal); // Joga nivel baixo no pino
delay_ms(4); // Tempo para gerar frequencia de nivel baixo
delay_us(60);
aux++; // Aumenta aux
}
aux=0; // Limpa aux
limpa_lcd(); // Limpa LCD
printf(escreve_lcd," VARAGO"); // Imprime VARAGO
envia_byte_lcd(0,0xc3); //Desloca o cursor para a segunda linha do LCD
printf(escreve_lcd,"AUTOMATICS"); // Imprime AUTOMATICS
} // Fim da tecla RE
/***************************************************************************/
if(!input(bt2)){ // Botão letra MI
limpa_lcd(); // Limpa LCD
printf(escreve_lcd,"NOTA MI"); // Imprime a nota e a frequencia
envia_byte_lcd(0,0xc0); //Desloca o cursor para a segunda linha do LCD
printf(escreve_lcd,"FREQUENCIA 261Hz"); // Imprime a nota e a frequencia
while(aux != 100){ // Tempo de som
output_high(fal); // Joga nivel alto no pino
delay_ms(3); // Tempo para gerar frequencia de nivel alto
delay_us(800);
delay_us(30);
output_low(fal); // Joga nivel baixo no pino
delay_ms(3); // Tempo para gerar frequencia de nivel baixo
delay_us(800);
delay_us(30);
aux++; // Aumenta aux
}
aux=0; // Limpa aux
limpa_lcd(); // Limpa LCD
printf(escreve_lcd," VARAGO"); // Imprime VARAGO
envia_byte_lcd(0,0xc3); //Desloca o cursor para a segunda linha do LCD
printf(escreve_lcd,"AUTOMATICS"); // Imprime AUTOMATICS
} // Fim da tecla MI
/***************************************************************************/
if(!input(bt3)){ // Botão letra FA
limpa_lcd(); // Limpa LCD
printf(escreve_lcd,"NOTA FA"); // Imprime a nota e a frequencia
envia_byte_lcd(0,0xc0); //Desloca o cursor para a segunda linha do LCD
printf(escreve_lcd,"FREQUENCIA 293Hz"); // Imprime a nota e a frequencia
while(aux != 100){ // Tempo de som
output_high(fal); // Joga nivel alto no pino
delay_ms(3); // Tempo para gerar frequencia de nivel alto
delay_us(400);
delay_us(10);
output_low(fal); // Joga nivel baixo no pino
delay_ms(3); // Tempo para gerar frequencia de nivel baixo
delay_us(400);
delay_us(10);
aux++; // Aumenta aux
}
aux=0; // Limpa aux
limpa_lcd(); // Limpa LCD
printf(escreve_lcd," VARAGO"); // Imprime VARAGO
envia_byte_lcd(0,0xc3); //Desloca o cursor para a segunda linha do LCD
printf(escreve_lcd,"AUTOMATICS"); // Imprime AUTOMATICS
} // Fim da tecla FA
/***************************************************************************/
if(!input(bt4)){ // Botão letra SOL
limpa_lcd(); // Limpa LCD
printf(escreve_lcd,"NOTA SOL"); // Imprime a nota e a frequencia
envia_byte_lcd(0,0xc0); //Desloca o cursor para a segunda linha do LCD
printf(escreve_lcd,"FREQUENCIA 329Hz"); // Imprime a nota e a frequencia
while(aux != 100){ // Tempo de som
output_high(fal); // Joga nivel alto no pino
delay_ms(3); // Tempo para gerar frequencia de nivel alto
delay_us(30);
delay_us(9);
output_low(fal); // Joga nivel baixo no pino
delay_ms(3); // Tempo para gerar frequencia de nivel baixo
delay_us(30);
delay_us(9);
aux++; // Aumenta aux
}
aux=0; // Limpa aux
limpa_lcd(); // Limpa LCD
printf(escreve_lcd," VARAGO"); // Imprime VARAGO
envia_byte_lcd(0,0xc3); //Desloca o cursor para a segunda linha do LCD
printf(escreve_lcd,"AUTOMATICS"); // Imprime AUTOMATICS
} // Fim da tecla SOL
/***************************************************************************/
if(!input(bt5)){ // Botão letra LA
limpa_lcd(); // Limpa LCD
printf(escreve_lcd,"NOTA LA"); // Imprime a nota e a frequencia
envia_byte_lcd(0,0xc0); //Desloca o cursor para a segunda linha do LCD
printf(escreve_lcd,"FREQUENCIA 349Hz"); // Imprime a nota e a frequencia
while(aux != 100){ // Tempo de som
output_high(fal); // Joga nivel alto no pino
delay_ms(2); // Tempo para gerar frequencia de nivel alto
delay_us(800);
delay_us(60);
output_low(fal); // Joga nivel baixo no pino
delay_ms(2); // Tempo para gerar frequencia de nivel baixo
delay_us(800);
delay_us(60);
aux++; // Aumenta aux
}
aux=0; // Limpa aux
limpa_lcd(); // Limpa LCD
printf(escreve_lcd," VARAGO"); // Imprime VARAGO
envia_byte_lcd(0,0xc3); //Desloca o cursor para a segunda linha do LCD
printf(escreve_lcd,"AUTOMATICS"); // Imprime AUTOMATICS
} // Fim da tecla FA
/***************************************************************************/
if(!input(bt6)){ // Botão letra SI
limpa_lcd(); // Limpa LCD
printf(escreve_lcd,"NOTA SI"); // Imprime a nota e a frequencia
envia_byte_lcd(0,0xc0); //Desloca o cursor para a segunda linha do LCD
printf(escreve_lcd,"FREQUENCIA 392Hz"); // Imprime a nota e a frequencia
while(aux != 100){ // Tempo de som
output_high(fal); // Joga nivel alto no pino
delay_ms(2); // Tempo para gerar frequencia de nivel alto
delay_us(500);
delay_us(50);
output_low(fal); // Joga nivel baixo no pino
delay_ms(2); // Tempo para gerar frequencia de nivel baixo
delay_us(500);
delay_us(50);
aux++; // Aumenta aux
}
aux=0; // Limpa aux
limpa_lcd(); // Limpa LCD
printf(escreve_lcd," VARAGO"); // Imprime VARAGO
envia_byte_lcd(0,0xc3); //Desloca o cursor para a segunda linha do LCD
printf(escreve_lcd,"AUTOMATICS"); // Imprime AUTOMATICS
} // Fim da tecla SI
/***************************************************************************/
if(!input(bt7)){ // Botão letra DO1
limpa_lcd(); // Limpa LCD
printf(escreve_lcd,"NOTA DO#"); // Imprime a nota e a frequencia
envia_byte_lcd(0,0xc0); //Desloca o cursor para a segunda linha do LCD
printf(escreve_lcd,"FREQUENCIA 440Hz"); // Imprime a nota e a frequencia
while(aux != 100){ // Tempo de som
output_high(fal); // Joga nivel alto no pino
delay_ms(2); // Tempo para gerar frequencia de nivel alto
delay_us(200);
delay_us(70);
output_low(fal); // Joga nivel baixo no pino
delay_ms(2); // Tempo para gerar frequencia de nivel baixo
delay_us(200);
delay_us(70);
aux++; // Aumenta aux
}
aux=0; // Limpa aux
limpa_lcd(); // Limpa LCD
printf(escreve_lcd," VARAGO"); // Imprime VARAGO
envia_byte_lcd(0,0xc3); //Desloca o cursor para a segunda linha do LCD
printf(escreve_lcd,"AUTOMATICS"); // Imprime AUTOMATICS
} // Fim da tecla DO1
/***************************************************************************/
if(!input(bt8)){ // Botão letra RE1
limpa_lcd(); // Limpa LCD
printf(escreve_lcd,"NOTA RE#"); // Imprime a nota e a frequencia
envia_byte_lcd(0,0xc0); //Desloca o cursor para a segunda linha do LCD
printf(escreve_lcd,"FREQUENCIA 493Hz"); // Imprime a nota e a frequencia
while(aux != 100){ // Tempo de som
output_high(fal); // Joga nivel alto no pino
delay_ms(2); // Tempo para gerar frequencia de nivel alto
delay_us(20);
delay_us(8);
output_low(fal); // Joga nivel baixo no pino
delay_ms(2); // Tempo para gerar frequencia de nivel baixo
delay_us(20);
delay_us(8);
aux++; // Aumenta aux
}
aux=0; // Limpa aux
limpa_lcd(); // Limpa LCD
printf(escreve_lcd," VARAGO"); // Imprime VARAGO
envia_byte_lcd(0,0xc3); //Desloca o cursor para a segunda linha do LCD
printf(escreve_lcd,"AUTOMATICS"); // Imprime AUTOMATICS
} // Fim da tecla RE1
/***************************************************************************/
} // Fim do laço infinito
} // Fim do programa
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Fim do Programa *

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

Nenhum comentário :

Postar um comentário

olá,digite aqui seu comentário!