Intenté conectar PIC16f722A con LM016L LCD en proteus. Había escrito el código C para inicializar (LCD) y mostrar los caracteres en la pantalla LCD. Los problemas son los siguientes:
1) Cuando transfiero X número de caracteres, solo muestra (X-1) número de caracteres, ignorando el último carácter.
2) La pantalla LCD muestra números y caracteres especiales, PERO NO ALFABETOS.
Aquí está la captura de pantalla del envío de cuatro caracteres, es decir (1,2,3,4) y solo muestra 1 2 3. Aquí está la captura de pantalla.
#include<stdio.h>#include<stdbool.h>#defineLCD_DATAPORTB#defineLCD_CTRLPORTAsbitLCD_ENatPORTA.B0;//LCDLatchpin(Enable)sbitLCD_RSatPORTA.B1;//Command/DataselectPIN|Command(RS=0)|DATA(RS=1)sbitLCD_RWatPORTA.B2;//READ/WRTIEpin|Read(1)|Write(0)#defineLCD_DATA_DIRECTIONTRISBsbitLCD_EN_DirectionatTRISA0_bit;sbitLCD_RS_DirectionatTRISA1_bit;sbitLCD_RW_DirectionatTRISA2_bit;#defineCHECK_High_BIT(var,pos)(((var)>>(pos))&1)//=========================LCDFUNCTIONS=========================voidlcd_ready(){LCD_DATA_DIRECTION=0xff;//DataportsinputLCD_RS=0;//CommandregisterLCD_RW=1;//ReadfromLCDDelay_ms(1);LCD_EN=0;Delay_ms(1);LCD_EN=1;Delay_ms(1);//ReadrequiresLow-to-Highsigwhile(CHECK_High_BIT(LCD_DATA,7));LCD_DATA_DIRECTION=0x00;//Dataportsoutput}voidlcd_Command_write(charvalue){LCD_RS=0;LCD_RW=0;LCD_DATA=value;Delay_ms(1);LCD_EN=1;delay_ms(1);LCD_EN=0;Delay_ms(1);}voidlcd_Data_write(charvalue){LCD_DATA_DIRECTION=0x00;LCD_RS=1;LCD_RW=0;LCD_DATA=value;Delay_ms(1);LCD_EN=1;delay_ms(1);LCD_EN=0;Delay_ms(1);}voidLCD_POWER(boolflag){if(flag){Delay_ms(250);//Powerupdelaylcd_ready();//IsLCDBUSY?waitherelcd_Command_write(0x38);//LCD2Lines,5x7characterslcd_ready();lcd_Command_write(0x0E);//DisplayON,CursorONlcd_ready();lcd_Command_write(0x01);//ClearLCDlcd_ready();lcd_Command_write(0x06);//ShiftCursorRightlcd_ready();lcd_Command_write(0x80);//Cursoratline1position1}else{lcd_ready();//IsLCDBUSY?waithereLCD_RS=0;//SelectCommandRegisterLCD_RW=0;//WriteoperationLCD_DATA=0x10;//CursorandDisplayoffDelay_us(1);LCD_EN=1;Delay_us(1);LCD_EN=0;//Latch}}voidmain(){LCD_DATA_DIRECTION=LCD_EN_Direction=LCD_RS_Direction=LCD_RW_Direction=0x00;LCD_POWER(1);LCD_ready();LCD_DATA_write('1');LCD_ready();LCD_DATA_write('2');LCD_ready();LCD_DATA_write('3');LCD_ready();LCD_DATA_write('4');}
Aquíestáel
NOTA: no estoy usando caracteres de transferencia de b / w de retardo, en lugar de eso uso el pin D7 de la pantalla LCD para monitorear si la pantalla LCD está ocupada o no.