В этом проекте мы рассмотрим как подключить 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 Скачали 4045 раз
Обновление 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 тут не реализовано. Драйвер работает только на запись — поэтому конфликтов не будет.