Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: LCD128x64
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
zorromen
Прошу помочь..проблема чтения из памяти экрана массива байтов...это нада для оптимизации...так вот первый байт верный, а все остальные идут через один..т.есть в экране после чтения не +1 а +2 адресса...Дайте рабочий код чтения байта из экрана..даю свой...

unsigned char LCD_Read_Byte(void)
{
unsigned char data;
LCD_WaitBusy();
RS=1;
RW=1;
DATADDR=0x00;
DATAOUT=0x00;
//delay_us(5);//5
E=1;
delay_us(3);//4
E=0;
delay_us(5);//5
E=1;
delay_us(3);//3
E=0;
data=DATAIN;
DATADDR=0xff;
return data;
}
Jury093
Я в свое время ковырялся с 122x32 и 128x64. Там при чтение из памяти дисплея есть тонкость:
"One dummy read is necessary right after the address setting."..
Вероятно где-то тут "собака порылась". В смысле, неправильный алгоритм считывания.
zorromen
Да дастала она меня эта сабака....пара её съесть)...дайте рабочую весию чтения...
vooon
Мне кажется, что ошибка здесь:
Код
    E=1;
    delay_us(3);//4
    E=0;
    delay_us(5);//5
    E=1;
    delay_us(3);//3
    E=0;
    data=DATAIN;


Ведь указатель смещается при каждом стробе.
И чтение должно быть во время 1.
Код
    E=1;
    delay_us(3);
    data=DATAIN;
    E=0;
zorromen
Шото несильно помогло...так ведь верное значение должно выводиться после второго строба...
=GM=
Цитата(zorromen @ Dec 15 2006, 15:37) *
Шото несильно помогло...так ведь верное значение должно выводиться после второго строба...

Вы даёте два импульса Е, по-моему, надо один. Фиктивное чтение должно выполняться только один раз после установки начального адреса.
bodja74
А шо у нас здэсь LCD_WaitBusy(); ?
=GM=
Кстати, операторы
DATADDR=0x00;

DATAOUT=0x00;

DATADDR=0xff;

не работают, т.к. для них надо установить RW=0 и подрыгать Е.

Цитата(zorromen @ Dec 15 2006, 12:41) *
Прошу помочь..проблема чтения из памяти экрана массива байтов...это надо для оптимизации...так вот первый байт верный, а все остальные идут через один..т.есть в экране после чтения не +1 а +2 адресса...Дайте рабочий код чтения байта из экрана..даю свой...

unsigned char LCD_Read_Byte(void)
{
unsigned char data;
LCD_WaitBusy();
RS=1;
RW=1;
DATADDR=0x00;
DATAOUT=0x00;
E=1; delay_us(3);//4
E=0; delay_us(5);//5
E=1; delay_us(3);//3
E=0;
data=DATAIN;
DATADDR=0xff;
return data;
}
zorromen
void LCD_WaitBusy(void)
{
unsigned char data;
RW=1;
RS=0;
DATADDR=0;
do
{
E=1;
#asm
nop
nop
nop
nop
#endasm
data=DATAIN;
}
while (data>>7);
E=0;
}

Я непонял что значит
""""""
Кстати, операторы
DATADDR=0x00;

DATAOUT=0x00;

DATADDR=0xff;

не работают, т.к. для них надо установить RW=0 и подрыгать Е.
"""""""""
Можна подробнее или пример?
bodja74
Может и не так актуально,но все таки стоит сначала выставлять порт на чтение DDR=0 а потом сигналы на чтение.

Читаться должно на первом стробе (если считать что строб=1) при Е=1 ,естественно немного подождав сигнал после перехода Е с 0 на 1.
zorromen
Актуальность учел...с делал я её видно и правда два строба надо тока после установки адресса...а далее читаю одним стробом...

unsigned char LCD_Read_Byte_E(void)
{
unsigned char data;
LCD_WaitBusy();
DATADDR=0x00;
DATAOUT=0x00;
RS=1;
RW=1;
E=1;
delay_us(1);
E=0;
data=DATAIN;
DATADDR=0xff;
return data;
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.