quarta-feira, 8 de setembro de 2010

usando lcd com atmega8 - avr studio

///************************************************************************/
// usando LCD
// Version : 1.0
// microcontrolador : AVR ATMega8
// Autor : Aguivone
// descrição : usando lcd interface de 8 bits
// data : 02/09/2010.
//
//************************************************************************/
#define F_CPU 1000000UL // 1 MHz
#include
#include

/////////////////////////////////////variaveis usada no lcd ///////////////////////////////////////////
#define LCD PORTD //dados a ser escrito
#define CMD PORTC //será usado só o bit0 é o bit1 desta porta
//o pino r/w é conectado ao terra pois não é feita nenhuma leitura no display
/////////////////////////////////////////////////Funções usadas/////////////////////////////////////////////

void inicializa_LCD(void)
{
_delay_ms(20);
CMD = 0X01;
LCD = 0X38;//modo de 8 bits
_delay_ms(1);//tempo para escrever no lcd
CMD = 0X00;//ao passar do nivel alto para o nivel baixo ele faz leitura
_delay_ms(5);
CMD = 0X01;
LCD = 0X38;//modo de 8 bits
_delay_ms(1);//tempo para escrever no lcd
CMD = 0X00;
_delay_ms(5);
CMD = 0X01;
LCD = 0X0C;//cursor desligado
_delay_ms(1);//tempo para escrever no lcd
CMD = 0X00;
_delay_ms(5);//substitui a leitura do busy flag
CMD = 0X01;
LCD = 0X06;;//direção de movimento
_delay_ms(1);
CMD = 0X00;
_delay_ms(5);//substitui a leitura do busy flag
CMD = 0X01;
LCD = 0X01;//limpa display
_delay_ms(3);
CMD = 0X00;
_delay_ms(15);//substitui a leitura do busy flag
}
void impri_lcd(char frase[20])
{
unsigned int indice=0;
unsigned int us_controle=0;
while(us_controle<2)///veja que o programa pode travar se aqui não tiver as duas aspas
{
if(frase[indice]=='"')
{

if(us_controle==0)//identifica inicio e fim de transmissão
{
us_controle=1;
}
else
{
us_controle=2;
}
}
else
{
if(frase[indice]=='\n')
{
CMD = 0X01;//escreve comando
LCD = 0X80;//poe na linha 1 posicão 0
_delay_us(20);//para garantir sucesso , ao mexer com funcão é melhor deixar um tempo maior que 15us
CMD = 0X00;
_delay_us(20);//escreve dados
}
if(frase[indice]=='\r')
{
CMD = 0X01;//escreve comando
LCD = 0XC0;//poe na linha 2 posicão 0
_delay_us(20);//para garantir sucesso , ao mexer com funcão é melhor deixar um tempo maior que 15us
CMD = 0X00;
_delay_us(20);//escreve dados
}
if((frase[indice]!='\r') && (frase[indice]!='\n') && (indice<18))
{
CMD = 0X03; //prepara escrita de dados
LCD = frase[indice]; // coloca caracter para escrita
_delay_us(20);//tempo de estabilizar o valor na porta de saida
CMD = 0X02; //manda escrever
_delay_us(20);//tempo para escreve dados
}
}
indice++;
}
}
//////////////////////////////////////////////função principal///////////////////////////////////////////
int main(void)
{
DDRC = 0XFF; //inicializa portC
DDRD = 0XFF; //inicicializa portD como saida
inicializa_LCD();
impri_lcd("\n teste");
impri_lcd("\r DE LCD");
for(;;)
{
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////

Nenhum comentário :

Postar um comentário

olá,digite aqui seu comentário!