В этом проекте мы рассмотрим как подключить Attiny85(или другой AVR) через сдвиговый регистр 74HC595(8-разрядный сдвиговый регистр с защелкой на выходе).
Поиски такого подключения начались когда понадобилось подключить LCD к 8-ногому микроконтроллеру. Поиски такой библиотеки для CVAVR не увенчались успехом, поэтому я нашёл библиотеку для AVRStudio и портировал её для своего компилятора.
Схема подключения.
Подключение к регистру 74595:
Q0 — RS
Q1 — RW
Q2 — EN
Q3 — D4
Q4 — D5
Q5 — D6
Q6 — D7
Q7 — Подсветка.
В заголовочном файле есть описание функций и пример использования.
В библиотеке присутствуют дополнительные фишки:
1 — управление подсветкой.
2 — Сдвиг текста вправо или влево бегущей строкой.
Если неохото делать плату то можно напаять микросхему прямо на дисплей, как сделал я — для быстрой проверки)
Вообщем качайте и сами все увидите в симуляции) Файл протеуса прилагается)
Скачать проект и библиотеку подключение LCD HD44780 к AVR Attiny85 через сдвиговой регистр 74HC595 Скачали раз
Обновление 25.10.2016
Для удобства изменил файл hd44780.h
- Теперь можно назначать любые удобные выводы регистра на контакты LCD(в некоторых случаях упростит разводку платы).
Файл hd44780-new.h :
//**********************************************************
//LCD HDD44780 TO 74HC595 - 2016
////https://mega-avr.ru/
//**********************************************************
/*
Подключение к регистру 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 можно вообще посадить на землю, так как дисплей у нас работает только в режиме записи данных.
На этом все)






not working on atmel studio 6
Ответы с LCD не войдут в конфликт с выводами 595? Или чтение регистра состояния не происходит?
Чтение регистров LCD тут не реализовано. Драйвер работает только на запись — поэтому конфликтов не будет.