Подключаем экран WH1604A по шине I2C на микроконтроллере Atmega8.

Сегодня мы рассмотрим подключение экрана WH1604A по шине I2C.  В качестве переходника между экраном и микроконтроллером  у нас будет плата  PCF8574:

Экран WH2004 впаивается в данный переходник:

Настройка I2C шины и подключение возьмем с предыдущего урока: Урок №7. Подключаем шину I2C.

Программный код будет состоять из нескольких частей:

  1. Уже написанной библиотеке I2C.
  2. Библиотеке самого экрана, которая использует ранее написанные функции в библиотеке I2C.
  3. Пример использования.

Программный код самого экрана:

Заголовочный файл:

#define LCD_H_
#include «main.h»

#define e1 I2C_SendByteAdres(portlcd|=0x04,0b01001110) // устанавливаем ножку E в 1
#define e0 I2C_SendByteAdres(portlcd&=~0x04,0b01001110) // устанавливаем E в 0
#define rs1 I2C_SendByteAdres(portlcd|=0x01,0b01001110) // устанавливаем RS в 1
#define rs0 I2C_SendByteAdres(portlcd&=~0x01,0b01001110) // устанавливаем RS в 0
#define setled() I2C_SendByteAdres(portlcd|=0x08,0b01001110) // включаем подсветку экрана.
#define setwrite() I2C_SendByteAdres(portlcd&=~0x02,0b01001110) // записываем байт по адресу

void LCD_ini(void); // инициализация экрана 
void setpos(unsigned char x, unsigned y); // установка курсора в заданное место
void str_lcd (char str1[]); // отправляем слово
void clearlcd(void); // очистка экрана
void sendcharlcd(unsigned char c); // отправляем символ

#endif /* LCD_H_ */

Код экрана:

#include «LCD.h»

unsigned char portlcd = 0; //переменная в которой храним команды
//—————————————-
void sendhalfbyte(unsigned char c)
{
c<<=4;
e1; //разрешаем запись данных
_delay_us(50);
I2C_SendByteAdres(portlcd|c,0b01001110);
e0; //запрещаем запись данных
_delay_us(50);
}
//—————————————-
void sendbyte(unsigned char c, unsigned char mode)
{
if (mode==0) rs0;
else rs1;
unsigned char hc=0;
hc=c>>4;
sendhalfbyte(hc); sendhalfbyte(c);
}
//—————————————-
void sendcharlcd(unsigned char c)
{
sendbyte(c,1);
}
//—————————————-
void setpos(unsigned char x, unsigned y) // установка позиции курсора
{
switch(y)
{
case 0:
sendbyte(x|0x80,0);
break;
case 1:
sendbyte((0x40+x)|0x80,0);
break;
case 2:
sendbyte((0x10+x)|0x80,0);
break;
case 3:
sendbyte((0x50+x)|0x80,0);
break;
}
}
//—————————————-
void LCD_ini(void) // инициализация
{
_delay_ms(15); 
//переводим экран в 4 битный рабочий режим
sendhalfbyte(0b00000011);
_delay_ms(4);
sendhalfbyte(0b00000011);
_delay_us(100);
sendhalfbyte(0b00000011);
_delay_ms(1);
sendhalfbyte(0b00000010);
_delay_ms(1);
sendbyte(0b00101000, 0); //включаем режим работы
_delay_ms(1);
sendbyte(0b00000001, 0);// очищаем экран
_delay_ms(1);
sendbyte(0b00000110, 0); //Прячем отображения курсора 
_delay_ms(1);
sendbyte(0b00000010, 0); //ставим курсор в начальное положение
_delay_ms(1);
sendbyte(0b00001100, 0); //включаем экран
_delay_ms(1);
setled();//включаем светодиод
setwrite();//Стартовое положение экрана 
}
//—————————————-
void clearlcd(void) // очистка экрана
{
sendbyte(0b00000001, 0);
_delay_us(1500);
}
//—————————————-
void str_lcd (const char str1[]) // отправка текста
{
uint8_t n;
for(n=0;str1[n]!=’\0′;n++)
sendcharlcd(str1[n]);
}

Заголовочный файл основной программы:

#ifndef MAIN_H_
#define MAIN_H_
#define F_CPU 4000000UL // частота кварца 
#include «I2C.h»
#include «LCD.h»
#include «avr/delay.h»
#include <avr/io.h>
#endif /* MAIN_H_ */
 
Основная программа с примером использования экрана.
int main(void)
{
I2C_init(); // настройка I2C
LCD_ini();// Инициализация экрана
clearlcd();//Очистка экрана
setpos(0,0); // установка курсора в начало экрана
str_lcd(«Hello World!»); // вывод текста
/* Replace with your application code */
while (1)
{
}
}