MTC-16201X

Друкуємо на екран MTC-16201X з Atmega8

Вирішив спробувати підключити екран, після того, як дізнався, що використання МК без кварцевого резонатора даж похибку внутрішньої частоти на 1-10%, що багато, а от із кварцем 0,005%.

В інтернеті не знайшов коду для Atmega8 по підключенні екранів, тому змусив chatGPT написати код.

Спочатку код не працював, тому що я для зручності пайки сплутав виходи МК і входи MTC-16201X. Ось як :

#define D4 PD3
#define D5 PD4

А chatGPT це не врахував, і використовував зсуви регістрів для передачі команд.

Я осцилографом помітив, що по проводу PD3 взагалі не йдуть сигнали. Після тестів, я змусив “розумний чат” переписати код без використання зсувів бітів у байтах – і після цього сталося диво і екран запрацював як треба.

Викладаю код тут, щоб він був в інтернеті. Може ще хтось використовує стародавні дідівські мікроконтроллери Atmega8. Код з форматуванням можна переглянути тут https://ideone.com/JKSykc

#define F_CPU 8000000UL 
#include <avr/io.h>
#include <util/delay.h>


// Макроси для роботи з LCD
#define LCD_PORT PORTD
#define LCD_DDR  DDRD
#define RS PD0
#define E  PD2
#define D4 PD3
#define D5 PD4
#define D6 PD6
#define D7 PD7


// Функції
void lcd_pulse_enable() {
    LCD_PORT |= (1 << E); // Підняти E
    _delay_us(1);
    LCD_PORT &= ~(1 << E); // Опустити E
    _delay_us(100);
}

void lcd_send_nibble(unsigned char nibble) {
    if (nibble & 0x01) LCD_PORT |= (1 << D4); else LCD_PORT &= ~(1 << D4);
    if (nibble & 0x02) LCD_PORT |= (1 << D5); else LCD_PORT &= ~(1 << D5);
    if (nibble & 0x04) LCD_PORT |= (1 << D6); else LCD_PORT &= ~(1 << D6);
    if (nibble & 0x08) LCD_PORT |= (1 << D7); else LCD_PORT &= ~(1 << D7);
    lcd_pulse_enable();
}

void lcd_command(unsigned char cmd) {
    LCD_PORT &= ~(1 << RS); // RS = 0 (команда)
    lcd_send_nibble(cmd >> 4); // Старші 4 біти
    lcd_send_nibble(cmd & 0x0F); // Молодші 4 біти
    _delay_ms(2);
}

void lcd_data(unsigned char data) {
    LCD_PORT |= (1 << RS); // RS = 1 (дані)
    lcd_send_nibble(data >> 4); // Старші 4 біти
    lcd_send_nibble(data & 0x0F); // Молодші 4 біти
    _delay_ms(2);
}

void lcd_init() {
    LCD_DDR |= (1 << RS) | (1 << E) | (1 << D4) | (1 << D5) | (1 << D6) | (1 << D7); // Налаштування необхідних пінів як вихід
    _delay_ms(20); // Затримка після увімкнення

    lcd_command(0x02); // Перехід у 4-бітний режим
    lcd_command(0x28); // 4 біти, 2 лінії, 5x8 шрифт
    lcd_command(0x0C); // Увімкнути дисплей, без курсора
    lcd_command(0x06); // Автозсув курсора праворуч
    lcd_command(0x01); // Очистити дисплей
    _delay_ms(2);
}

void lcd_print(char *str) {
    while (*str) {
        lcd_data(*str++);
    }
}

void lcd_set_cursor(unsigned char row, unsigned char col) {
    unsigned char address = (row == 0) ? col : (0x40 + col);
    lcd_command(0x80 | address);
}


// Основна програма
int main(void) {
	_delay_ms(500);
    lcd_init(); // Ініціалізація LCD
	_delay_ms(10);
	lcd_set_cursor(0, 0); // Перехід на початок першого рядка
    lcd_print("Hello my chatGPT.");
    lcd_set_cursor(1, 0); // Перехід на початок другого рядка
    lcd_print("Row 2 Test!_>>*"); // Вивести текст на другому рядку
    while (1) {
		_delay_ms(200);
    }
}

Це написав блоггер з новим логіном Rylexmoon (раніше відомий як Salomoon).

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься.

Я spam бот