Witam. Mam problem z wyświetlaczem 2x8 na Atmedze88. PD0 jest podłączony do RS, PD1 jest podłączony do E, PD2 procesora jest podłączony do DB4, PD3 jest podłączony do DB5, PD4 jest podłączony do DB6, PD5 jest podłączony do DB7. Na ekranie pojawiają się tylko czarne pola. Przetestowałem różne programatory oraz kable. Wgrywa wszystko na układ żadnych błędów nie wyświetla i nic. Sprawdziłem też połączenia z wyświetlaczem, kontrast, większe opóźnienia, sterowniki, różne procesory i ekrany. Brak mi już pomysłów co to może być
L 0x62
H 0xDF
E 0xF9
LB 0xFF
L 0x62
H 0xDF
E 0xF9
LB 0xFF
#include <avr/io.h>
#include <util/delay.h>
// Definicje dla portów i pinów
#define LCD_PORT PORTD
#define RS PD0
#define E PD1
#define DB4 PD2
#define DB5 PD3
#define DB6 PD4
#define DB7 PD5
// Funkcje pomocnicze
void LCD_command(unsigned char cmd) {
LCD_PORT = (LCD_PORT & 0x3F) | (cmd & 0xC0); // Wysłanie starszych 4 bitów
LCD_PORT |= (1 << E); // Włączenie linii E
_delay_us(1); // Krótkie opóźnienie
LCD_PORT &= ~(1 << E); // Wyłączenie linii E
_delay_us(100); // Czekanie na stabilizację wyświetlacza
LCD_PORT = (LCD_PORT & 0x3F) | ((cmd << 4) & 0xC0); // Wysłanie młodszych 4 bitów
LCD_PORT |= (1 << E); // Włączenie linii E
_delay_us(1); // Krótkie opóźnienie
LCD_PORT &= ~(1 << E); // Wyłączenie linii E
_delay_us(200); // Czekanie na stabilizację wyświetlacza
}
void LCD_init() {
// Inicjalizacja wyświetlacza
LCD_PORT &= ~((1 << RS) | (1 << E) | (1 << DB4) | (1 << DB5) | (1 << DB6) | (1 << DB7));
_delay_ms(20);
// Ustawienie trybu 4-bitowego
LCD_PORT = (LCD_PORT & 0x3F) | (0x20 & 0xC0); // Wysłanie starszych 4 bitów
LCD_PORT |= (1 << E); // Włączenie linii E
_delay_us(1); // Krótkie opóźnienie
LCD_PORT &= ~(1 << E); // Wyłączenie linii E
_delay_us(100); // Czekanie na stabilizację wyświetlacza
// Kontynuacja inicjalizacji
LCD_command(0x28); // Tryb 4-bitowy, 2 linie, 5x8 pikseli
LCD_command(0x0C); // Wyłączenie kursora
LCD_command(0x06); // Przesunięcie kursora w prawo
LCD_command(0x01); // Wyczyść ekran
_delay_ms(2);
}
void LCD_sendChar(unsigned char data) {
LCD_PORT = (LCD_PORT & 0x3F) | (data & 0xC0); // Wysłanie starszych 4 bitów
LCD_PORT |= (1 << RS); // Ustawienie bitu RS na 1 (przesyłamy dane)
LCD_PORT |= (1 << E); // Włączenie linii E
_delay_us(1); // Krótkie opóźnienie
LCD_PORT &= ~(1 << E); // Wyłączenie linii E
_delay_us(100); // Czekanie na stabilizację wyświetlacza
LCD_PORT = (LCD_PORT & 0x3F) | ((data << 4) & 0xC0); // Wysłanie młodszych 4 bitów
LCD_PORT |= (1 << RS); // Ustawienie bitu RS na 1 (przesyłamy dane)
LCD_PORT |= (1 << E); // Włączenie linii E
_delay_us(1); // Krótkie opóźnienie
LCD_PORT &= ~(1 << E); // Wyłączenie linii E
_delay_us(200); // Czekanie na stabilizację wyświetlacza
}
void LCD_sendString(char *str) {
int i = 0;
while (str[i] != '\0') {
LCD_sendChar(str[i]);
i++;
}
}
int main(void) {
// Inicjalizacja
DDRD = 0xFF; // Ustawienie portu D jako wyjście
LCD_init();
// Wysłanie przykładowego napisu
LCD_sendString("Hello, LCD!");
while (1) {
// Główna pętla programu
}
return 0;
}[/i][/i]