Tengo un DEM 16217 SYH-PY LCD de 2x16 caracteres y tengo problemas para inicializarlo.
Estoy usando AVR Studio 4. Las 8 líneas de datos están conectadas al puerto A del microcontrolador mientras que las 3 líneas de control están conectadas al puerto E. Habilitar es PE2, R / W es PE1 y S es PE0. Las conexiones del puerto A son DBn a PORTAn. Por lo que puedo ver en la hoja de datos, no parece que las instrucciones tomen más de 2 ms. Por alguna razón, la verificación de bandera ocupada no funciona correctamente, por lo que usé un retardo de 2 ms en su lugar.
Al principio, quería que parpadeara un LED después de cada paso, pero resultó ser mucho mejor tener una salida en un puerto serie.
Aquí está mi código:
#include <avr/io.h>
#include<util/delay.h>
#include "LED.h"
#include "Terminal.h"
void Screen_Execute(void)
{
_delay_us(2);
PORTE=PORTE | 4;
_delay_us(2);
PORTE=PORTE ^4;
_delay_us(2);
//_delay_us(2);
}
void Screen_busy(void)
{
_delay_ms(2);
//is the screen busy?
//PORTE=PORTE | 2;
//DDRA=0x7F;
//Screen_Execute();
//while ((PINA & 128))
//{
//Screen_Execute();
//BLINK_LED(500);
//}// wait until zero
//DDRA=0xFF;
//PORTE=PORTE ^ 2;
//Screen_Execute();
//no longer busy
}
void Screen_init(void)
{
//BLINK_LED(1000);
SEND_STRING("Starting initialization\r\n",0);
DDRE=0xFF;
PORTE=0x00;
DDRA=0xFF;
PORTA=0x30;
_delay_ms(250);
_delay_ms(1000);
SEND_STRING("Step 1 executing.\r\n",0);
Screen_Execute();//voltage stabilized
_delay_ms(5);//first output complete
SEND_STRING("Step 1 complete.\r\n",0);
//PORTA=0x30;
//Screen_Execute();//second time
//_delay_us(110);//end
//PORTA=0x30;//third time
//Screen_Execute();
SEND_STRING("Step 2 start.\r\n",0);
//BLINK_LED(1000);
Screen_busy();
PORTA=0x38;//two lines, 8 bits, 5*7 characters
SEND_STRING("Step 2 execute.\r\n",0);
Screen_Execute();
SEND_STRING("Step 2 complete.\r\n",0);
SEND_STRING("Step 3 start.\r\n",0);
//BLINK_LED(1000);
Screen_busy();
PORTA=0x08;//screen off
SEND_STRING("Step 3 execute.\r\n",0);
Screen_Execute();
SEND_STRING("Step 3 complete.\r\n",0);
SEND_STRING("Step 4 start.\r\n",0);
//BLINK_LED(1000);
Screen_busy();
PORTA=0x14;//cursor goes to home and screen is cleared
SEND_STRING("Step 4 execute.\r\n",0);
Screen_Execute();
SEND_STRING("Step 4 complete.\r\n",0);
//Screen_busy();
//PORTA=0x04;//
//Screen_Execute();//end of init
//Screen_busy();
SEND_STRING("Step 5 start.\r\n",0);
//BLINK_LED(1000);
PORTA=0x0F;
Screen_Execute();//cursor blinks, screen works
SEND_STRING("Step 5 execute.\r\n",0);
Screen_busy();
SEND_STRING("Step 5 complete.\r\n",0);
}
Mi problema es que después de la inicialización, el cursor aparece en una posición aleatoria en la pantalla.
Cuando trato de hacer la inicialización como se describe en la documentación, al enviar la línea PORTA=0x30;
3 veces, no funciona. Además, si trato de usar un tiempo más apretado, de nuevo no funciona.