and73y
Пункты: 1154
Регистрация: 25.11.2009
Хочу подключить дисплей HD44780. Как узнать есть ли в ядре уже готовый драйвер для сего девайса?
sasamy
Пункты: 83540
Регистрация: 14.08.2009
Есть - drivers/misc/arm-charlcd.c
and73y
Пункты: 1154
Регистрация: 25.11.2009
Чтобы подключить драйвер к плате, надо ковырять
Documentation/driver-model/...
?
sasamy
Пункты: 83540
Регистрация: 14.08.2009
Думаю там много нужно переработать. Кстати - возможно это не лучший вариант, где-то я видел подключение через LPT - его проще на GPIO адаптировать.
and73y
Пункты: 1154
Регистрация: 25.11.2009
sasamy
Пункты: 83540
Регистрация: 14.08.2009
and73y
Пункты: 1154
Регистрация: 25.11.2009
Пасиб!
Действительно интересный и полезный проект.
есть один нюанс)
Все варианты предполагают подключение через gpio, а у меня используется плата WS-RS232/B, которая позволяет подключать этот дисплей через COM порт. Преимущество в том, что надо меньше линий io.
Поэтому буду переделывать dtmf =)
DM
Пункты: 151
Регистрация: 06.03.2011
Вот я это использую-
Код #include "LPC23xx.h"
// D4-D7- P0.17-P0.20- на любые другие, только 4 подряд
#define D4_bit 17
#define D4 1<<D4_bit
#define D5 1<<18
#define D6 1<<19
#define D7 1<<20
#define E 1<<21
#define RS 1<<22
#define RW 1<<0
#define busyflag D7
void lcd_string(char *);
void lcd_line1(void);
void lcd_line2(void);
void lcd_cmd(unsigned char);
void lcd_char(unsigned char);
void lcd_nybble(unsigned char,unsigned char);
void lcd_init(void);
void strobe_e(void);
void delay_us(int);
void lcd_string(char *senpoint)
{
while(*senpoint != '\0')
{
lcd_char(*senpoint);
senpoint++;
}
}
void lcd_line1(void)
{
lcd_cmd(0x80);
}
void lcd_line2(void)
{
lcd_cmd(0xc0);
}
void lcd_cmd(unsigned char letter)
{
unsigned char temp;
temp=letter;
temp=temp>>4;
lcd_nybble(temp,0);
temp=letter;
temp=temp&0x0f;
lcd_nybble(temp,0);
}
void lcd_char(unsigned char letter)
{
unsigned char temp;
temp=letter;
temp=temp>>4;
lcd_nybble(temp,1);
temp=letter;
temp=temp&0x0f;
lcd_nybble(temp,1);
}
void lcd_nybble(unsigned char nyb,unsigned char rs)
{
int dat;
if(rs)
IOSET0 = RS;
else
IOCLR0 = RS;
dat = nyb;
IOCLR0 = (D4|D5|D6|D7); //сбросить D4-D7
IOPIN0 |= dat<<D4_bit; //двигаем влево до D4
strobe_e();
}
void lcd_init(void)
{
delay_us(500000);
lcd_nybble(0x03,0); //сброс LCD
strobe_e();
strobe_e();
lcd_nybble(0x02,0);
lcd_cmd(0x28); //4 бит 2 линии
lcd_cmd(0x10); //перемещать курсор и сдвиг влево
lcd_cmd(0x06); //инкремент
lcd_cmd(0x0e); //вкл.дисплей-курсор мигать
lcd_cmd(0x01); //очистить дисплей
}
clear_disp(){
lcd_cmd(0x01);
}
void lcd_busy(void)
{
IODIR0 = (E|RS|RW|D4|D5|D6); //D7- вход
IOCLR0 = RS;
IOSET0 = RW;
IOSET0 = E;
while(IOPIN0 & busyflag); //ждем флаг занятости
IOCLR0 = E;
IOCLR0 = RW;
IODIR0 = (E|RS|RW|D4|D5|D6|D7); //D7- выход
}
void strobe_e(void)
{
IOSET0 = E;
delay_us(1);
IOCLR0 = E;
lcd_busy();
}
void delay_us(int x)
{
int a,b;
for(a=0;a<x;a++){
for(b=0;b<3;b++);
}
}
Использование-
Код #include "LPC23xx.H"
#include <stdio.h>
char str[80];
int main (void)
{
IODIR0 = (D4|D5|D6|D7|RS|RW|E);
IOCLR0 = (D4|D5|D6|D7|RS|RW|E);
lcd_init();
while (1)
{
H1=19; H2=15;
sprintf(str, "%s%d:%d", "Time- ",H1,H2 );
lcd_line1();
lcd_string(str);
}
}