LCD1602_I2C Atmega88 (Arduino IDE)

Серия недорогих микроконтроллеров Atmega8, Atmega48, Atmega88 могут стать отличной заменой сильно подорожавших плат Arduino Nano. Большое кол-во проектов создаваемых на платах Arduino Nano часто используют небольшое объем памяти и применять Arduino Nano в данных проектах нецелесообразно. В Atmega8, Atmega48, Atmega88 имеют 8 кБ программируемой Flash памяти, 1кБ SRAM памяти и 512 байта EEPROM.

Микроконтроллеры Atmega8, Atmega48, Atmega88 поддерживаются средой программирования Arduino IDE, так же большинство библиотек совместимы с этими контроллерами.

На этой странице будет рассмотрен пример подключения дисплей LCD1602 оснащенным модулем на PCF8574, который позволяет подключить символьный дисплей 1602 к микроконтроллеру ATmega88 всего по двум проводам SDA и SCL (I2C). Будет использована нестандартная библиотека Lcd1602_i2c_low, она имеет основные функции для работы с дисплеем LCD1602_I2C и меньший размер по сравнению со стандартной библиотекой.

Atmega88

Для использования Atmega8, Atmega48, Atmega88 в Arduino IDE Вам необходимо собрать следующую схему:

Как добавить микроконтроллер Atmega88 в среду программирования Arduino IDE и прошивать микроконтроллер можно узнать из статьи http://rcl-radio.ru/?p=113040.

Для запуска LCD1602 c I2C модулем на PCF8574, Вам понадобятся две библиотеки:

  • Wire_low — библиотека для работы с шиной I2C (тестовая версия)
  • Lcd1602_i2c_low — библиотека для работы с LCD1602 I2C на PCF8574

Загрузите тестовый скетч:

// ATMEGA8 ATMEGA48 ATMEGA88 ATMEGA168 ATMEGA328

#include <avr/io.h>
#include <util/delay.h>
#include <Wire_low.h>
#include <Lcd1602_i2c_low.h>
  Lcd1602_i2c_low lcd(0x27);// адрес I2C

int main(){ 
  wire_set(12000000,100000); // тактовая частота контроллера, частота шины I2C
  lcd.setInit();
  lcd.Clear(); // очистка экрана
  lcd.led(1);  // включение и отключение подсветки экрана
 // собственные символы, 0...7  
  lcd.Write(0,    0b11111,
                  0b00000,
                  0b10001,
                  0b10001,
                  0b10001,
                  0b10001,
                  0b00000,
                  0b11111);
                  
  lcd.Write(1,    0b11111,
                  0b10001,
                  0b11111,
                  0b10001,
                  0b11111,
                  0b10001,
                  0b11111,
                  0b00000);                
   
while(1){
    lcd.Curs(0,0);                // номер строки, положение курсора 
    lcd.PrintString("ATMEGA88  ");// вывод String
    lcd.PrintFloat(1.227,3);      // вывод Float
    lcd.Curs(1,4);                // номер строки, положение курсора 
    lcd.PrintInt(-30125);         // вывод int
    lcd.PrintChar(0);             // вывод собственного символа 0
    lcd.PrintChar(1);             // вывод собственного символа 1
    _delay_ms(100);
    }}

Скетч использует 3600 байт (43%) памяти устройства. Всего доступно 8192 байт.
Глобальные переменные используют 14 байт (1%) динамической памяти, оставляя 1010 байт для локальных переменных. Максимум: 1024 байт.

После загрузки скетча на дисплее LCD1602 Вы увидите следующее:

Функции библиотеки Lcd1602_i2c_low

  • Lcd1602_i2c_low lcd(0x27) — подключение библиотеки, указание адреса модуля I2C
  • wire_set(12000000,100000) —  тактовая частота контроллера, частота шины I2C (функция библиотеки Wire_low)
  • lcd.setInit() — инициализация
  • lcd.Clear() — очистка дисплея
  • lcd.led(1) — включение (1) и отключение (0) подсветки дисплея
  • lcd.Write(а, b) — функция  собственных символов (8 символов)
    • а — номер символа
    • b — массив символа
  • lcd.Curs(0,0) — номер строки, положение курсора
  • lcd.PrintString() —  вывод String
  • lcd.PrintFloat(a, b) — вывод Float
    • a — число Float
    • b — кол-во чисел после запятой
  • lcd.PrintInt() — вывод int
  • lcd.PrintChar() — вывод собственного символа

Далее показан скетч со стандартной библиотекой который выводит на экран ту же информацию что и предыдущий скетч:

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей

  byte v1[8]={    0b11111,
                  0b00000,
                  0b10001,
                  0b10001,
                  0b10001,
                  0b10001,
                  0b00000,
                  0b11111};
                  
  byte v2[8]={    0b11111,
                  0b10001,
                  0b11111,
                  0b10001,
                  0b11111,
                  0b10001,
                  0b11111,
                  0b00000}; 

void setup(){
  lcd.init();                     
  lcd.backlight();// Включаем подсветку дисплея
  lcd.createChar(1, v1);lcd.createChar(2, v2);
}
void loop(){
  lcd.setCursor(0, 0);
  lcd.print("ATMEGA88  ");
  lcd.print(1.227,3);
  lcd.setCursor(4, 1);
  lcd.print(-30125);
  lcd.write((uint8_t)1);lcd.write((uint8_t)2);
  delay(100);
  }

Скетч использует 5280 байт (64%) памяти устройства. Всего доступно 8192 байт.
Глобальные переменные используют 295 байт (28%) динамической памяти, оставляя 729 байт для локальных переменных. Максимум: 1024 байт.

Как видно библиотека Lcd1602_i2c_low использует меньшее кол-во памяти, что позволяет более оптимально использовать микроконтроллеры Atmega8, Atmega48, Atmega88.

Форум — http://forum.rcl-radio.ru/viewtopic.php?pid=5511#p5511

Добавить комментарий

Войти с помощью: