//*********************************************************************************** // Programa LCD_V1.C - escreve dados em um LCD de duas // linhas 16 x 2 // // Desenvolvido por Márcio José Soares // // Microcontrolador utilizado: M8 ou M16 Tato Equipamentos Eletrônicos // Compilador: TBasic M8 versão 1.2.0.2 // // PORT B - dados (nible mais significativo - PB4 - PB7) // PORTD - controle // - EN - PD3, RS - PD2 // // R/W - aterrado (pronto sempre para escrita) // RS - bit 2 - (0 comando, 1 dados) // E - bit 3 - (1 habilita display, 0 desabilita display) // // Este exemplo usa formato de dados em 4 bits de comunicação com LCD //*********************************************************************************** //*********************************************************************************** //Definições do módulo //*********************************************************************************** #define BYTE unsigned char #define TRUE 0x01 #define EN 0x03 #define RS 0x02 //*********************************************************************************** //Declaração das funções pertencentes ao módulo //*********************************************************************************** void main(void); void initM8(void); void LCDinit(void); void Command(BYTE val); void DataC(BYTE val); void strobe(void); void SendC(BYTE val); void Clear(void); void mudalinha(BYTE linha); //*********************************************************************************** //Inicializa Basic Step M8 //Entradas - nenhuma //Saidas - nenhuma //*********************************************************************************** void initM8(void){ outp(DDRB, 0xff); // PORTB saída outp(PORTB,0); // todos pinos em 0 outp(DDRD, 0xff); // PORTD saida outp(PORTD,0); // todos pinos em 0 } //*********************************************************************************** //Pulsa pino E (habilitação) no display - instruções em assembly //Entradas - nenhuma //Saidas - nenhuma //*********************************************************************************** void strobe(void){ #asm #define EN 0x03 //define pino dentro do código assembly sbi PORTD,EN // pulsa pino E no display cbi PORTD,EN // leva pino para 0 novamente #endasm } //*********************************************************************************** //Envia um byte para o display - dados ou comando //Entradas - byte a enviar //Saidas - nenhuma //*********************************************************************************** void SendC(BYTE val){ delayms(1); outp(PORTB, val); // envia nibble mais significativo strobe(); // strobe pino E outp(PORTB, val<<4); // envia nibble menos significativo strobe(); } //*********************************************************************************** //Envia dados para o display //Entradas - dado a enviar //Saidas - nenhuma //*********************************************************************************** void DataC(BYTE val){ sbip(PORTD,RS); // pino RS no estado 1 SendC(val); } //*********************************************************************************** //Envia comandos para o display //Entradas - byte de comando //Saidas - nenhuma //*********************************************************************************** void Command(BYTE val){ cbip(PORTD,RS); // abaixa pino RS SendC(val); } //*********************************************************************************** //Apaga LCD //Entradas - nenhuma //Saidas - nenhuma //*********************************************************************************** void Clear(void){ Command(0x01); // apaga LCD delayms(15); // espera 15 ms } //*********************************************************************************** //Inicializa LCD //Entradas - nenhuma //Saidas - nenhuma //*********************************************************************************** void LCDinit(void){ delayms(400); // power on em espera de 400ms Command(0x28); // modo 4-bits, 2-linha, caracter 5x7 Command(0x28); //repete comando Command(0x06); // incrementa caracter a direita, desliga display shift Command(0x0F); // display ligado, cursor ligado, cursor blink Clear(); //apague display } //*********************************************************************************** //Muda linha no LCD //Entradas - linha (1 ou 2) //Saidas - nenhuma //*********************************************************************************** void mudalinha(BYTE linha){ if (linha==1) Command(0x80); //muda para linha 1 if (linha==2) Command(0xC0); //muda para linha 2 } //*********************************************************************************** //Função principal (main) - apenas para testes do móulo LCD //Entradas - nenhuma //Saidas - nenhuma //*********************************************************************************** void main(void){ BYTE *m1; //ponteiros para mensagens BYTE *m2; m1 = " Bem vindo ao "; //mensagens para o display m2 = " mundo do arne "; initM8(); //inicializa M8 - apenas parte necessária para o LCD LCDinit(); //inicializa LCD while(*m1) //envia primeira mensagem DataC(*m1++); mudalinha(2); //muda de linha while(*m2) //envia segunda mensagem DataC(*m2++); mudalinha(1); //volta cursor na linha 1, coluna 1 while (TRUE) ; //não faz nada... fica preso! }