Tengo un ATMEGA16 con una pantalla LCD DEM 20486 SBH-PW-N ( hoja de datos ) conectado al puerto C como así
- C0 - RS
- C1 - RW
- C2 - E
- C3 - no establecido
- C4 - D4
- C5 - D5
- C6 - D6
- C7 - D7 D0-D3 están conectados a tierra
No he podido encontrar mucha información detallada sobre cómo trabajar con la pantalla LCD y he estado probando esto durante dos días, por lo que cualquier información sobre lo que he estado haciendo mal sería útil.
#define LCDPORT PORTC
#define LCDPIN PINC
#define LCDDDR DDRC
#define RS 0
#define RW 1
#define EN 2
#define D4 4
#define D5 5
#define D6 6
#define D7 7
#include <avr/io.h>
#include <util/delay.h>
void LcdFlash() { // Flash enable flag
LCDPORT |= (1<<EN);
_delay_ms(2);
LCDPORT &= ~(1<<EN);
_delay_ms(2);
}
void LcdSendNibble(char cmd, char rs) {
LCDPORT &= ~(1<<RW); // Write mode
if(rs)
LCDPORT &= ~(1<<RS); // Command mode
else
LCDPORT |= (1<<RS); // Data mode
LCDPORT |= (cmd<<D4);
LcdFlash();
}
void LcdInit() {
LCDDDR |= (1<<RS); // SET(LCDDDR, RS);
LCDDDR |= (1<<RW); // SET(LCDDDR, RW);
LCDDDR |= (1<<EN); // SET(LCDDDR, EN);
LCDDDR |= (0x0F<<D4); // ASSIGN(LCDDDR, D4, 0x0F);
_delay_ms(150); //Wait for boot
//Function set
LcdSendNibble(0b0010, 0);
LcdSendNibble(0b0010, 0);
LcdSendNibble(0b0100, 0); //N = 0, F = 1
_delay_ms(50);
// Display on/off control
LcdSendNibble(0b0000, 0);
LcdSendNibble(0b1100, 0); //D = 1, C = 0, B = 0
_delay_ms(50);
// Display clear
LcdSendNibble(0b0000, 0);
LcdSendNibble(0b0001, 0);
_delay_ms(50);
//Entry mode set
LcdSendNibble(0b0000, 0);
LcdSendNibble(0b0110, 0); //I/D = 1 SH = 0
_delay_ms(50);
}
int main() {
LcdInit();
while(1) {}
}
También agradecería la información sobre lo que significan algunas de las diferentes marcas durante la inicialización. específicamente el indicador de modo de línea N y el indicador de cambio SH.
Mi objetivo es simplemente hacer que la pantalla se ilumine, y luego escribir un carácter en la primera posición, aunque esto no se ha intentado en primer lugar