дисплей 1602A подключен, выводит всё как положено.
Мне нужно прочитать то, что выведено на экран.
записать туда текст получается, и всё правильно.
А прочитать - нет. Все 16 символов типа = 'я', т.е. типа все биты выставлены.
Может у меня "глаз замылился", или чего-то не учёл, направьте по пути истинному.
Вот этой процедурой я читаю символ:
- Код: Выделить всё • Развернуть
char lcd2_read_byte(uint8_t lcd_num){
//прочитать текст на экране IMAXB6
//-1. записать ноль во все биты
//0. Установить позицию курсора первая строка первый символ
//1. Установить значение линии RS в 1
//2. Установить линию R/W = 1
//3. Установить линию Е = 1
//4. Считать значение старшей тетрады байта данных с линий шины DB4...DB7
//5. Установить линию Е = 0
//6. Установить линию Е = 1
//7. Считать значение младшей тетрады байта данных с линий шины DB4...DB7
//8. Установить линию Е = 0
//9. Установить линию R/W = 0
//10. Установить значение линии RS в 0 (отключить ножку)
volatile static uint8_t halfbyte1 = 0;
volatile static uint8_t halfbyte2 = 0;
volatile static uint8_t byte = 0;
//volatile static uint8_t byte2 = 0;
//volatile static uint8_t byte3 = 0;
volatile static uint8_t t1 = 0;
volatile static uint8_t t2 = 0;
volatile static uint8_t t3 = 0;
volatile static uint8_t t4 = 0;
GPIO_LOW( lcd_1602[lcd_num].port, lcd_1602[lcd_num].EN
| lcd_1602[lcd_num].DATA4
| lcd_1602[lcd_num].DATA5
| lcd_1602[lcd_num].DATA6
| lcd_1602[lcd_num].DATA7
);
GPIO_HIGH( lcd_1602[lcd_num].port, lcd_1602[lcd_num].RS
| lcd_1602[lcd_num].RW
);
//подождали
lcd_delay();
//переведём шину данных на чтение
GPIO_InitStructure.GPIO_Pin = lcd_1602[lcd_num].DATA4 | lcd_1602[lcd_num].DATA5 | lcd_1602[lcd_num].DATA6 | lcd_1602[lcd_num].DATA7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(lcd_1602[lcd_num].port, &GPIO_InitStructure);
//lcd_delay();
//выставили строб
GPIO_HIGH( lcd_1602[lcd_num].port, lcd_1602[lcd_num].EN);
//подождали
lcd_delay();
//считываем старшую тетраду
/*halfbyte1 = GPIO_ReadOutputDataBit(lcd_1602[lcd_num].port,
lcd_1602[lcd_num].DATA4
|lcd_1602[lcd_num].DATA5
|lcd_1602[lcd_num].DATA6
|lcd_1602[lcd_num].DATA7
); */
t1 = GPIO_ReadOutputDataBit(lcd_1602[lcd_num].port, lcd_1602[lcd_num].DATA4 );
t2 = GPIO_ReadOutputDataBit(lcd_1602[lcd_num].port, lcd_1602[lcd_num].DATA5 );
t3 = GPIO_ReadOutputDataBit(lcd_1602[lcd_num].port, lcd_1602[lcd_num].DATA6 );
t4 = GPIO_ReadOutputDataBit(lcd_1602[lcd_num].port, lcd_1602[lcd_num].DATA7 );
halfbyte1 = 0x08*t4 + 0x04*t3 +0x02*t2 + t1;
//сбросили строб
GPIO_LOW( lcd_1602[lcd_num].port, lcd_1602[lcd_num].EN);
lcd_delay();
//выставили строб
GPIO_HIGH( lcd_1602[lcd_num].port, lcd_1602[lcd_num].EN);
//подождали
lcd_delay();
//считываем младшую тетраду
/*halfbyte2 = GPIO_ReadOutputDataBit(lcd_1602[lcd_num].port,
lcd_1602[lcd_num].DATA4
|lcd_1602[lcd_num].DATA5
|lcd_1602[lcd_num].DATA6
|lcd_1602[lcd_num].DATA7
);*/
t1 = GPIO_ReadOutputDataBit(lcd_1602[lcd_num].port, lcd_1602[lcd_num].DATA4 );
t2 = GPIO_ReadOutputDataBit(lcd_1602[lcd_num].port, lcd_1602[lcd_num].DATA5 );
t3 = GPIO_ReadOutputDataBit(lcd_1602[lcd_num].port, lcd_1602[lcd_num].DATA6 );
t4 = GPIO_ReadOutputDataBit(lcd_1602[lcd_num].port, lcd_1602[lcd_num].DATA7 );
halfbyte2 = 0x08*t4 + 0x04*t3 +0x02*t2 + t1;
//сбросили строб
GPIO_LOW( lcd_1602[lcd_num].port, lcd_1602[lcd_num].EN);
lcd_delay();
//byte2 = halfbyte1 << 4 ;
//halfbyte1 = halfbyte1 << 4;
//byte3 = halfbyte1 | halfbyte2;
byte = (halfbyte1 << 4) | halfbyte2;
//переведём шину данных на чтение
GPIO_InitStructure.GPIO_Pin = lcd_1602[lcd_num].DATA4 | lcd_1602[lcd_num].DATA5 | lcd_1602[lcd_num].DATA6 | lcd_1602[lcd_num].DATA7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(lcd_1602[lcd_num].port, &GPIO_InitStructure);
//снимем флаг чтения
GPIO_LOW( lcd_1602[robot_lcd_num].port, lcd_1602[robot_lcd_num].RW);
return byte;
}
lcd_delay(); - используется и при записи (выводе) данных, поэтому полагаю не в задержках дело.
как перед записью, так и перед чтение дёргается функция lcd_set_xy(0,0); ,которая переводит "курсор" на первый символ первой строки.
ответ на вопрос - зачем тебе читать? = надо.