Olá ELO,
Olhando agora com mais calma, percebi que concluí incorretamente que o código estaria baseado em acesso de 8bits, mas o que voce fez está certo mesmo, é de 4bits, te peço desculpa pelo engano. As pinagens do hardware, aproveitei e observei que também estão coerentes, não parece ter nenhum problema no circuito.
O Display LM016L que voce utilizou, possui como controlador o HD44780, que de fato é o mesmo utilizado pela biblioteca
Lcd_Init() do compilador
MicroC, conforme está no seu programa, e assim eliminamos também essa possibildade de problema.
Pra tentar eliminar mais uma possibilidade por partes, deixa de lado temporariamente o seu programa original, e tenta compilar esse aqui abaixo, que foi extraído diretamente do site da MikroC, e depois vamos encaixando as demais funções aos poucos, já que são simples, já que o LCD é a parte mais chata:
cpp code
// 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();
}
}
}
Se nem esse código aí acima funcionar, aí meu palpite á que os FUSES do microcontrolador devem estar mal configurados no PROTEUS, e teria de rever se por exemplo o Oscilador está á cristal e na faixa correta.
No mais, reforço a dica anterior: Por incrível que pareça, o ajuste no contraste do LCD pelo trimpot, mesmo no PROTEUS, faz os caracteres aparecerem saturados como quadrados pretos, ou até mesmo desaparecer, e por isso eu se fosse voce tambem testaria essa possibilidade, ajustando valores.
+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."