Полная версия этой страницы:
LCD128x64
zorromen
Dec 15 2006, 15:41
Прошу помочь..проблема чтения из памяти экрана массива байтов...это нада для оптимизации...так вот первый байт верный, а все остальные идут через один..т.есть в экране после чтения не +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
Dec 15 2006, 16:31
Я в свое время ковырялся с 122x32 и 128x64. Там при чтение из памяти дисплея есть тонкость:
"One dummy read is necessary right after the address setting."..
Вероятно где-то тут "собака порылась". В смысле, неправильный алгоритм считывания.
zorromen
Dec 15 2006, 17:06
Да дастала она меня эта сабака....пара её съесть)...дайте рабочую весию чтения...
Мне кажется, что ошибка здесь:
Код
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
Dec 15 2006, 18:37
Шото несильно помогло...так ведь верное значение должно выводиться после второго строба...
Цитата(zorromen @ Dec 15 2006, 15:37)

Шото несильно помогло...так ведь верное значение должно выводиться после второго строба...
Вы даёте два импульса Е, по-моему, надо один. Фиктивное чтение должно выполняться только один раз после установки начального адреса.
bodja74
Dec 15 2006, 19:38
А шо у нас здэсь LCD_WaitBusy(); ?
Кстати, операторы
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
Dec 15 2006, 21:05
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
Dec 15 2006, 21:51
Может и не так актуально,но все таки стоит сначала выставлять порт на чтение DDR=0 а потом сигналы на чтение.
Читаться должно на первом стробе (если считать что строб=1) при Е=1 ,естественно немного подождав сигнал после перехода Е с 0 на 1.
zorromen
Dec 16 2006, 08:44
Актуальность учел...с делал я её видно и правда два строба надо тока после установки адресса...а далее читаю одним стробом...
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;
}
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.