Библиотека для рабо...
 
Уведомления
Очистить все

Библиотека для работы с дисплеем 16*2 на Си под WinAVR

8 Посты
6 Пользователи
0 Likes
27.2 Тыс. Просмотры
Radioded
(@sergey)
Estimable Member Admin
Присоединился: 5 лет назад
Сообщения: 184
Topic starter  

Начнём-с, для затравки библиотека функций для работы с дисплеем 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);

}


Цитата
sanekerfort
(@sanekerfort)
New Member
Присоединился: 15 лет назад
Сообщения: 1
 

Спасибо, очень пригодилось. Простенько и понятно. То что надо для простых проектов, где надо только выводить на экран, без излишних заморочек.


ОтветитьЦитата
gr_JAVA
(@gr_java)
New Member
Присоединился: 14 лет назад
Сообщения: 1
 

Это исходники для подключения дисплея по 4-проводной или 8-проводной линии?


ОтветитьЦитата
Radioded
(@sergey)
Estimable Member Admin
Присоединился: 5 лет назад
Сообщения: 184
Topic starter  

Исходники для подключения дисплея HD44780 по 4-проводной линии.


ОтветитьЦитата
begun
(@begun)
New Member
Присоединился: 14 лет назад
Сообщения: 1
 

Здравствуйте!
Можки у кого нибудь есть то же самое на CVAVR ?
у меня проблема подключения LCD на разные пины разных портов.


ОтветитьЦитата
asad
 asad
(@asad)
New Member
Присоединился: 9 лет назад
Сообщения: 1
 

А где скачать LCD.h судя по демке все просто но в студии6 исходник выдает ошибки.


ОтветитьЦитата
SuperVnuk
(@supervnuk)
New Member
Присоединился: 9 лет назад
Сообщения: 1
 

А где скачать LCD.h судя по демке все просто но в студии6 исходник выдает ошибки.
под WinAvr
Этот код писался только для него.


ОтветитьЦитата
Radioded
(@sergey)
Estimable Member Admin
Присоединился: 5 лет назад
Сообщения: 184
Topic starter  

Прикрепляю сам файл библиотеки lcd.h


ОтветитьЦитата