Страница 1 из 1

как подключит LCD на пины разных портов?

Добавлено: Вс апр 11, 2010 11:56:37
zsxdcf
товарищи!
Работаю в CVAVR, подключаю LCD 2x16 к ATmega8 в четыркх проводный режим передачи данных с помощью WIZARD, однако мне необходимо соединить выводы LCD на другие рины(на пины разных портов).
Мне когдато указали ,что нужно найти в папке CVAVR lcd, и там вести изменения .
С тех пор, как не стараюсь, самому это сделать не получается .
Помогите пожалуйсто примером ,или укажите ссылку, дге можно все это выйснить?
Т.е. как подлключить LCD на произвольные пины и инициализировать ,чтобы она также работала как при "стандартном" включении?
Заранее благодарен.

Re: как подключит LCD на пины разных портов?

Добавлено: Вс апр 11, 2010 12:57:08
ibiza11
Несколько вариантов:
1. править стандартную библиотеку (в том числе и команду вывода в портЫ, поскольку в стандартной используется только один)
2. писать свою библиотеку
3. переходи на асм:)

Re: как подключит LCD на пины разных портов?

Добавлено: Вс апр 11, 2010 13:57:46
zsxdcf
Конечно большое спасибо за отзыв ,но в том то и дело, что не знаю как пркточескй все это проделать.Куды хрестьянину податься.

Re: как подключит LCD на пины разных портов?

Добавлено: Вс апр 11, 2010 15:01:59
GP1
Тогда лепи как есть :roll:

Re: как подключит LCD на пины разных портов?

Добавлено: Вс апр 11, 2010 20:29:31
kontroller
Можешь воспользоваться моей библиотекой.
Может быть не совсем проффесионально выполнена, но работоспособна
Если необходимо, добавлю коментарии


#include <delay.h>
//здесь определяем какой пин куда
#define rs PORTB.4
#define ddr_rs DDRB.4
#define e PORTC.7
#define ddr_e DDRC.7

#define d0 PORTB.3
#define ddr_d0 DDRB.3
#define d1 PORTB.2
#define ddr_d1 DDRB.2
#define d2 PORTB.1
#define ddr_d2 DDRB.1
#define d3 PORTB.0
#define ddr_d3 DDRB.0
//сигнал rw не использую

//**********************************************************************
//строб записи
void pulse_e(void)
{
e=1;
delay_us(2);
e=0;
delay_us(2);
}

void lcd_out(char d)
{
d0=0;
d1=0;
d2=0;
d3=0;
if(d&0x01)d0=1;
if(d&0x02)d1=1;
if(d&0x04)d2=1;
if(d&0x08)d3=1;
pulse_e();
}
//посылка команды
void lcd_com(unsigned char d)
{
lcd_out(d>>4);
lcd_out(d&0b00001111);
delay_us(45);
}
//посылка данных
void lcd_dat(unsigned char d)
{
rs=1;//режим передачи данных
lcd_com(d);
rs=0;//вернуть режим передачи команды
}
//******************************************************************
void lcd_init(void)
{unsigned char r;
//инициализация выходов
e=0;
rs=0;
ddr_rs=1;
ddr_e=1;
ddr_d0=1;
ddr_d1=1;
ddr_d2=1;
ddr_d3=1;
delay_ms(15);
lcd_out(0x02);
delay_ms(15);
lcd_out(0x03);
delay_ms(15);
lcd_out(0x03);
delay_ms(15);
lcd_out(0x02);
delay_ms(45);
lcd_com(0x28);
lcd_com(0x01);
delay_us(1640);
lcd_com(0x0C);
delay_us(40);
}
//****************************************************
void lcd_pos (unsigned char x,unsigned char y)
{unsigned char k;
if (y==0) k=0x80|(x&0b00001111);
else k=0xC0|(x&0b00001111);
lcd_com(k);
delay_ms(1);
}
//****************************************************
//вывод числа в заданом месте
void LcdInt(unsigned int d,char x,char y)
{ char s[3];
s[0]=(d/100)%10+0x30;
s[1]=(d/10)%10+0x30;
s[2]=(d/1)%10+0x30;
if(s[0]=='0'){s[0]=' ';if(s[1]=='0')s[1]=' ';}
lcd_pos(x,y);
lcd_dat(s[0]);
lcd_dat(s[1]);
lcd_dat(s[2]);
}
//****************************************************
//Вывод строки
void LcdStr( flash char *p,char x,char y)
{char d,i;
lcd_pos(x,y);i=0;
while(*p)lcd_dat(*p++);
}
//****************************************************