roboforum.ru

Технический форум по робототехнике.

не могу прочитать из lcd 1602 (HD44780)

не могу прочитать из lcd 1602 (HD44780)

Илдар » 13 июн 2014, 11:51

привет друзья.
дисплей 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); ,которая переводит "курсор" на первый символ первой строки.
ответ на вопрос - зачем тебе читать? = надо.

Re: не могу прочитать из lcd 1602 (HD44780)

Илдар » 15 июн 2014, 11:19

млин, GPIO_ReadInputDataBit же.
Заработало.


Rambler\'s Top100 Mail.ru counter