Problema con la visualización de caracteres en la pantalla LCD

0

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 Código C

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.

    
pregunta Nouman Tajik

2 respuestas

4

Tiene un problema fundamental con la forma en que ha codificado la rutina de comprobación del indicador de ocupado del controlador LCD.

Haciendo referencia al modo de caracteres HD44780 hoja de datos de LCD que se encuentra en Sparkfun existe este cuadro de secuencia de tiempo:

Observará que es necesario tener el pin E alto para poder ver el bit de ocupado DB7. En su código, pulsa el pin E, pero el tiempo de espera 1 ms, incluso antes de mirar el DB7. En el momento en que se mire, cualquier dato válido se habrá ido. Desea muestrear DB7 mientras la E sigue siendo alta.

La forma típica en que codifico un controlador LCD es hacer rutinas de bajo nivel bajo para admitir WriteCmd, ReadSts, WriteDat y ReadDat. Luego, la comprobación de ocupado de la pantalla LCD es un bucle que llama a los ReadSts dentro de un bucle y verifica el valor D7 de la lectura de cada lectura.

Otra cosa a tener en cuenta es que el mejor momento para realizar la comprobación de ocupado de la pantalla LCD es ANTES de que intente realizar una transacción a la pantalla LCD. De esta manera, puede obtener un pequeño aumento de rendimiento porque su código puede irse a hacer otras cosas después de la última escritura en el controlador LCD.

    
respondido por el Michael Karas
3

Primera prueba si puedes mostrar '?' y no '@', entonces esto mostraría que el problema ocurre cuando pasas de 0x3F a 0x40 ('A' es 0x41), por lo que tu problema ocurre cuando quieres manejar D6 alto. Dado que D6 está conectado a RB6 / ICSPCLK, debe verificar tanto el estado TRIS del puerto B como los bits de configuración para usar ese pin como salida.

    
respondido por el Martin

Lea otras preguntas en las etiquetas