Bibliotecas MikroC PRO for PIC: LCD 4Bits
O MikroC para quem não sabe, é um compilador de linguagem C para a programação de Microcontroladores.
Possui uma grande quantidade de bibliotecas que facilitam o desenvolvimento do projeto.
Nesse e nos próximos tutoriais mostrarei a função e códigos de cada biblioteca.
proporciona a comunicação com Lcds (com HD44780 controladores compatíveis) através da interface de 4 bits.
//Configura a saída dos Pinos do LCD.
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D4 at RB0_bit;
//Configura a direção dos pinos do LCD.
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D7_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB0_bit;
Rotinas: LCD_Init() - Inicializa o módulo LCD. LCD_Out(char row, char column, char text) -Escreve um texto qualquer no LCD. row - Em qual linha será inserido o texto. colunm - Em qual coluna será inserido o texto. text - Texto qualquer. LCD_Out_Cp(char text) - Escreve o texto na posição atual do cursor. LCD_Chr(char row, char column, char out_char) - Escreve uma caracter no LCD. row - Em qual linha será inserido o texto. colunm - Em qual coluna será inserido o texto. out_char - código do caracter a ser inserido (ver tabela ASCII). LCD_Chr_Cp(char out_char) - Escreve um caracter na posição atual do cursor. Lcd_Cmd(char out_char) - Envia um comando ao LCD. COMANDOS: _LCD_FIRST_ROW - Mover o cursor para a linha 1 _LCD_SECOND_ROW - Mover o cursor para a linha 2 _LCD_THIRD_ROW - Mover o cursor para a linha 3 _LCD_FOURTH_ROW - Mover o cursor para a linha 4 _LCD_CLEAR - Limpa o display _LCD_RETURN_HOME - Retorna o cursor para posição inicial. _LCD_CURSOR_OFF - Desliga o cursor. _LCD_UNDERLINE_ON - sublinha o cursor. _LCD_BLINK_CURSOR_ON - Liga o pisca-pisca do cursor. _LCD_MOVE_CURSOR_LEFT - Move o cursor para esquerda. _LCD_MOVE_CURSOR_RIGHT - Mover cursor para a direita. _LCD_TURN_ON - LCD Desligado. _LCD_TURN_OFF - LCD ligado. _LCD_SHIFT_LEFT - Move o texto todo para a esquerda. _LCD_SHIFT_RIGHT - Move o texto todo para a direita.
EXEMPLO:
// LCD module connections sbit LCD_RS at RB4_bit; sbit LCD_EN at RB5_bit; sbit LCD_D4 at RB0_bit; sbit LCD_D5 at RB1_bit; sbit LCD_D6 at RB2_bit; sbit LCD_D7 at RB3_bit; sbit LCD_RS_Direction at TRISB4_bit; sbit LCD_EN_Direction at TRISB5_bit; sbit LCD_D4_Direction at TRISB0_bit; sbit LCD_D5_Direction at TRISB1_bit; sbit LCD_D6_Direction at TRISB2_bit; sbit LCD_D7_Direction at TRISB3_bit; // End LCD module connections char txt1[] = "mikroElektronika"; char txt2[] = "EasyPIC6"; char txt3[] = "Lcd4bit"; char txt4[] = "example"; char i; // Loop variable void Move_Delay() { // Function used for text moving Delay_ms(500); // You can change the moving speed here} void main(){ ANSEL = 0; // Configure AN pins as digital I/O ANSELH = 0; C1ON_bit = 0; // Disable comparators C2ON_bit = 0; Lcd_Init(); // Initialize LCD Lcd_Cmd(_LCD_CLEAR); // Clear display Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off Lcd_Out(1,6,txt3); // Write text in first row Lcd_Out(2,6,txt4); // Write text in second row Delay_ms(2000); Lcd_Cmd(_LCD_CLEAR); // Clear display Lcd_Out(1,1,txt1); // Write text in first row Lcd_Out(2,5,txt2); // Write text in second row Delay_ms(2000); // Moving text for(i=0; i<4; i++) { // Move text to the right 4 times Lcd_Cmd(_LCD_SHIFT_RIGHT); Move_Delay(); } while(1) { // Endless loop for(i=0; i<8; i++) { // Move text to the left 7 times Lcd_Cmd(_LCD_SHIFT_LEFT); Move_Delay(); } for(i=0; i<8; i++) { // Move text to the right 7 times Lcd_Cmd(_LCD_SHIFT_RIGHT); Move_Delay(); } } }
É possível fazer uma leitura em um conversor A/D de 10 bits e enviar a leitura para um LCD de 8 bits? Existe algum truque pra isso?
ResponderExcluirÉ possivel sim, veja um exemplo:
Excluirvoid main()
{
int adc_read;
char string[8];
ADC_Init();
Lcd_Init();
while(1)
{
adc_read = ADC_Read(0);//leitura do canal 0
inttostr(adc_read, string);//converte int para string
lcd_out(1,1,string);//escreve no lcd o valor
delay_ms(100);
}
}
Boa tarde.
ResponderExcluirExiste uma maneira de diminuir as casas decimais de uma variável tipo float e enviar para o LCD? Por exemplo "234.3948" para "234.3". Uso o "FloatToStr" diminuo o número de caracteres dessa string na declaração, mas quando faço isso, aparece um caractere indesejado, um "$".
//Configura a saída dos Pinos do LCD.
sbit LCD_RS at RC0_bit;
sbit LCD_EN at RC2_bit;
sbit LCD_D7 at RC7_bit;
sbit LCD_D6 at RC6_bit;
sbit LCD_D5 at RC5_bit;
sbit LCD_D4 at RC4_bit;
//Configura a direção dos pinos do LCD.
sbit LCD_RS_Direction at TRISC0_bit;
sbit LCD_EN_Direction at TRISC2_bit;
sbit LCD_D7_Direction at TRISC7_bit;
sbit LCD_D6_Direction at TRISC6_bit;
sbit LCD_D5_Direction at TRISC5_bit;
sbit LCD_D4_Direction at TRISC4_bit;
char msg1[14];
char msg2[14];
char msg3[14];
float V;
void main() {
Trisa=0b11111111; //Port A como entrada
Trisc=0b00000000; //Port C como saída
Lcd_Init(); // Inicializa LCD
Lcd_Cmd(_Lcd_clear); // Limpa display
Lcd_Cmd(_Lcd_cursor_off); // Desliga cursor
V = ADC_Read(0)*0.00488*55.1126; //Leit. Canal 0*Resolução*Const q mantem 4Vcc=220Vac
FloatToStr (V,msg1);
lcd_out(1,1,msg1);
}
tem como mover apenas uma coluna para direita ou esquerda??
ResponderExcluiropa é uma LINHA* para direita ou esquerda
ResponderExcluiro comando SHIFT_RIGHT ou SHIFT_LEFT desloca TODAS as linhas ao mesmo tempo.
Excluire qual outro comando eu poderia usar para mover apenas uma linha?
ResponderExcluirOla amigo! Como eu faço para colocar o LCD no PORTD no meu PIC16F877A,
ResponderExcluirpois ele da erro ao compilar..
1 402 ; expected, but 'RD2_bit' found 16F877A_.c
1 402 ; expected, but 'RD2_bit' found 16F877A_.c
ExcluirEstá dizendo que você esqueceu de colocar Ponto-e-virgula(;)
Boa Tarde!
ResponderExcluirEstou utilizando PIC16F877A, com simulação no Proteus , meu código consiste em 3 etapas de mensagens para controlar motores de passo, a programação dos motores está OK, porém as 3 mensagens que deveriam ir pro LCD estão com problemas, quando eu executo o codigo inteiro ele passa a primeira mensagem normalmente, o segundo bloco de mensagem que é praticamente igual ao primeiro já embaralha tudo e vai pro fim do programa com tudo embaralhado....o estranho é que se eu coloco */ pra cancelar por exemplo o primeiro bloco, dai ele consegue executar o segundo normalmente porém depois ja embaralha de novo.....eu utilizei os codigos do lcd do proprio mikroc, igual que você passou, teria alguma solução? Obrigado!
Você tem o código aí?
ExcluirTentei utilizar a função LCD_Out em um código que contém interrupção do Timer1 Overflow, mas o PIC fica resetando. Alguém sabe o motivo? Obrigado.
ResponderExcluircomo faço para mover somente uma linha do LCD?????
ResponderExcluirEstou tentando exibir uma mensagem em um LCD 16x2 com o PIC18F2550 utilizando o PORTB, porém quando envio uma msg para o LCD a mensagem sai faltando algum caracter e as vezes exibe alguns caracteres indesejados em seguida da msg e até altera o valor de uma variável hexadecimal acrescentando +1 a cada carácter, por exemplo, AAF vira BB0.
ResponderExcluirO código compila normalmente, não sei o porque do erro.
Se alguém puder me ajudar eu agradeço.
Olá a todos do blog. Estou tentando fazer um scroll de uma array de 71 bytes em apenas uma linha do display LCD 20x4. Alguém de vocês poderia ajudar?
ResponderExcluirOnde eu baixo ela?
ResponderExcluir