Подключение LCD HD44780 к AVR Attiny85 через сдвиговой регистр 74HC595 — библиотека для CVAVR

В этом проекте  мы рассмотрим как подключить Attiny85(или другой AVR) через  сдвиговый регистр 74HC595(8-разрядный сдвиговый регистр с защелкой на выходе).

DSC_4612

Поиски такого подключения начались когда понадобилось подключить LCD к 8-ногому микроконтроллеру. Поиски такой библиотеки для CVAVR  не увенчались успехом, поэтому я нашёл библиотеку для AVRStudio и портировал её для своего компилятора.

Схема подключения.

l595

Подключение к регистру 74595:
Q0 — RS
Q1 — RW
Q2 — EN
Q3 — D4
Q4 — D5
Q5 — D6
Q6 — D7
Q7 — Подсветка.

В заголовочном файле есть описание функций и пример использования.

Скрин из симуляции.l595-2

В библиотеке присутствуют дополнительные фишки:

1 — управление подсветкой.

2 — Сдвиг текста вправо или влево бегущей строкой.

Если неохото делать плату то можно напаять микросхему прямо на дисплей, как сделал я — для быстрой проверки)

DSC_4609 DSC_4606 DSC_4607

 

Вообщем качайте и сами все увидите в симуляции) Файл протеуса прилагается)

Скачать проект и библиотеку подключение LCD HD44780 к AVR Attiny85 через сдвиговой регистр 74HC595 Скачали 985 раз

Обновление 25.10.2016

Для удобства изменил файл hd44780.h

  • Теперь можно назначать любые удобные выводы регистра на контакты LCD(в некоторых случаях упростит разводку платы).

Файл hd44780-new.h :

//**********************************************************
//LCD HDD44780 TO 74HC595  - 2016
////http://mega-avr.com.ua/
//**********************************************************

/*
Подключение к регистру 74595
 ВЫБИРАЕТСЯ В ДЕРИКТОРИИ
 PIN LCD CONFIG - 55 СТРОКА
*/

#ifndef LCD_HD44780
#define LCD_HD44780


//******* Подключение сигнальных линий *************
//DS
#define pin_DS	 0           
#define DDR_DS   DDRB
#define PORT_DS  PORTB
//STCP
#define pin_STCP 	1      
#define DDR_STCP  	DDRB
#define PORT_STCP  	PORTB
//SHCP
#define pin_SHCP	3    
#define DDR_SHCP  	DDRB
#define PORT_SHCP 	PORTB



//******* Задержка старта LCD *************
 //нужна для некоторых дисплеев
//#define LCD_START_DELAY_MS 20

//******* Управление линиями и команды  дисплею*************

#define DS_0   PORT_DS&= ~(1<<pin_DS)
#define DS_1   PORT_DS|=  (1<<pin_DS)
#define STCP_0 PORT_STCP&= ~(1<<pin_STCP)
#define STCP_1 PORT_STCP|=  (1<<pin_STCP)
#define SHCP_0 PORT_SHCP&= ~(1<<pin_SHCP)
#define SHCP_1 PORT_SHCP|=  (1<<pin_SHCP)

//PIN ADRESS 74HC595
#define Q0 0x01
#define Q1 0x02
#define Q2 0x04
#define Q3 0x08
#define Q4 0x10
#define Q5 0x20
#define Q6 0x40
#define Q7 0x80

//PIN LCD CONFIG
#define QRS Q0
#define QRW Q1
#define QE  Q2
#define QD4 Q3
#define QD5 Q4
#define QD6 Q5
#define QD7 Q6
#define QLD Q7

/* RS */
#define RS1      rejestr(QRS,LCDWRITE)
#define RS0      rejestr(QRS,LCDERASE)
/* RW */
#define RW1      rejestr(QRW,LCDWRITE)
#define RW0      rejestr(QRW,LCDERASE)
/* E */
#define E1       rejestr(QE,LCDWRITE)
#define E0       rejestr(QE,LCDERASE)
/* D4 */
#define D41      rejestr(QD4,LCDWRITE)
#define D40      rejestr(QD4,LCDERASE)
/* D5 */
#define D51      rejestr(QD5,LCDWRITE)
#define D50      rejestr(QD5,LCDERASE)
/* D6 */
#define D61      rejestr(QD6,LCDWRITE)
#define D60      rejestr(QD6,LCDERASE)
/* D7 */
#define D71      rejestr(QD7,LCDWRITE)
#define D70      rejestr(QD7,LCDERASE)
/* LED */
#define D81      rejestr(QLD,LCDWRITE)
#define D80      rejestr(QLD,LCDERASE)

#define LCD_NOP asm volatile("nop\n\t""nop\n\t" "nop\n\t" "nop\n\t" ::);

#define LCDWRITE 1
#define LCDERASE 0

#define LCDCOMMAND 0
#define LCDDATA    1

#define LCD_LOCATE(x,y)  WriteToLCD(0x80|((x)+((y)*0x40)), LCDCOMMAND)

#define LCD_CLEAR              WriteToLCD(0x01, LCDCOMMAND)
#define LCD_HOME               WriteToLCD(0x02, LCDCOMMAND)

/* IDS */
#define LCDINCREMENT           0x02
#define LCDDECREMENT           0x00
#define LCDDISPLAYSHIFT        0x01

#define LCD_ENTRY_MODE(IDS)    WriteToLCD(0x04|(IDS), LCDCOMMAND)

/* BCD */
#define LCDDISPLAY             0x04
#define LCDCURSOR              0x02
#define LCDBLINK               0x01

#define LCD_DISPLAY(DCB)       WriteToLCD(0x08|(DCB), LCDCOMMAND)

/* RL */
#define LCDLEFT                0x00
#define LCDRIGHT               0x04

#define LCD_SHIFT_DISPLAY(RL)  WriteToLCD(0x18|(RL), LCDCOMMAND)
#define LCD_SHIFT_CURSOR(RL)   WriteToLCD(0x10|(RL), LCDCOMMAND)

#define LCD_CGRAM_ADDRESS(A)   WriteToLCD(0x40|((A)&0x3f), LCDCOMMAND)
#define LCD_DDRDM_ADDRESS(A)   WriteToLCD(0x80|((A)&0x7f), LCDCOMMAND)

#define LCD_WRITE_DATA(D)      WriteToLCD((D),LCDDATA)

void rejestr(unsigned char data,unsigned char WriteOrErase);
void lcd_init(void);
void WriteToLCD(char v,unsigned char rs);
void lcd_puts(char *str);

volatile static unsigned char tempdata = 0;

#endif

Ножки назначаются в дериктории согласно обозначению 74HC595:

//PIN LCD CONFIG
#define QRS Q0
#define QRW Q1
#define QE  Q2
#define QD4 Q3
#define QD5 Q4
#define QD6 Q5
#define QD7 Q6
#define QLD Q7

Кстати вывод RW можно вообще посадить на землю, так как дисплей у нас работает только в режиме записи данных.

На этом все)

Подключение LCD HD44780 к AVR Attiny85 через сдвиговой регистр 74HC595 — библиотека для CVAVR: 3 комментария

  1. Ответы с LCD не войдут в конфликт с выводами 595? Или чтение регистра состояния не происходит?

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *