Начнём-с, для затравки библиотека функций для работы с дисплеем 16x2 на контроллере HD44780. Изначально код писался под WinAVR.
Вот сам код, или качайте прикреплённый файл lcd.h:#define cbi(reg, bit) (reg&=~(1<<bit))
#define sbi(reg, bit) (reg|= (1<<bit))
#define LCDPORT PORTC
#define LCDDDR DDRC
#define RS 0
#define E 1
#define RS_0 cbi(LCDPORT,RS)
#define RS_1 sbi(LCDPORT,RS)
#define E_0 cbi(LCDPORT,E)
#define E_1 sbi(LCDPORT,E)
void clearlcd(void);
void lcddata(unsigned char temp);
void lcdcmd(unsigned char temp);
void showstr(unsigned char *s);
void shiftleft(void);
void shiftright(void);
void home(void);
const unsigned char lcdaddr[4] = {0X80, 0XC0, 0X94, 0XD4};
void setlcdposition(unsigned char row, unsigned char col){
lcdcmd(lcdaddr[row-1] + col);
}
void lcdcmd(unsigned char temp){
LCDPORT = (temp & 0xF0);
RS_0; // command
E_1;
_delay_us(2);
E_0;
LCDPORT = ((temp & 0x0F) << 4);
RS_0; // command
E_1;
_delay_us(2);
E_0;
_delay_ms(1);
}
void lcddata(unsigned char temp){
LCDPORT = (temp & 0xF0);
RS_1; // data
E_1;
_delay_us(2);
E_0;
LCDPORT = ((temp & 0x0F) << 4);
RS_1; // data
E_1;
_delay_us(2);
E_0;
_delay_us(50);
}
void lcdinit(void){
PORTC = 0x00;
DDRC = 0b11110011; // output
_delay_ms(60);
lcdcmd(0x30);
_delay_ms(5);
lcdcmd(0x30);
_delay_us(200);
lcdcmd(0x30);
_delay_us(200);
lcdcmd(0x02); // 4bit mode
lcdcmd(0x02); // 4bit mode
lcdcmd(0x28); // 4 bit, 2 lines, 5*7 font
lcdcmd(0x0C); // cursor OFF, display ON
lcdcmd(0x06); // -> inc
clearlcd();
}
void clearlcd(void){
lcdcmd(0x01); // clear LCD
_delay_ms(3); // max 1.53mS
}
void home(void){
lcdcmd(0x02);
_delay_ms(3); // max 1.53mS
}
void secondline(void){
lcdcmd(0xC0);
_delay_ms(3);
}
void shiftleft(void){
lcdcmd(0x04);
}
void shiftright(void){
lcdcmd(0x06);
}
void showstr(unsigned char *s){
while(*s != 0) lcddata(*s++);
_delay_ms(1);
}
Пример использования функций из библиотеки:
#include <avr/io.h>
#define F_CPU 1000000
#include <util/delay.h>
#include <avr/interrupt.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <lcd.h>
char word[]="Hello";
char banner[]="radioded.ru";
int main (void) {
lcdinit();
clearlcd();
showstr(word);
secondline();
showstr(banner);
}
Спасибо, очень пригодилось. Простенько и понятно. То что надо для простых проектов, где надо только выводить на экран, без излишних заморочек.
Это исходники для подключения дисплея по 4-проводной или 8-проводной линии?
Исходники для подключения дисплея HD44780 по 4-проводной линии.
Здравствуйте!
Можки у кого нибудь есть то же самое на CVAVR ?
у меня проблема подключения LCD на разные пины разных портов.
А где скачать LCD.h судя по демке все просто но в студии6 исходник выдает ошибки.
А где скачать LCD.h судя по демке все просто но в студии6 исходник выдает ошибки.
под WinAvr
Этот код писался только для него.