реклама на сайте
подробности

 
 
> Свои символы hd44780
Specialist
сообщение Jul 29 2008, 09:23
Сообщение #1





Группа: Новичок
Сообщений: 6
Регистрация: 25-06-08
Пользователь №: 38 539



Привет. Пишу свои функции для управления дисплеем. Использую PIC, компилятор Hi-Tech C for PIC Вроде бы все работает нормально. Но как только загружаю свой символ в CGRAM у меня а дисплее абракадабра получается.

Записать 4 бита RS data
void mylcd_wdata4(char,char);

Делаю вот так, но я не полностью понял как пользовательские символы записывать туда.

Код
char user_gradus[16] = {0b0000,0b1110,0b0001,0b0001,0b0001,0b0001,0b0000,0b1110,0,0,0,0,0,0,0,0}; // Цельсий

mylcd_init();

mylcd_wdata4(0,0b0100);//Пока записываю по 4 бита, дальше не делал.
mylcd_wdata4(0,0b0001);//Тут я выбрал адрес в CGRAM

for (i=0; i<16; i++) mylcd_wdata4(1,user_gradus[i]);


Что тут не так ?

Сообщение отредактировал Specialist - Jul 29 2008, 09:25
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Specialist
сообщение Jul 29 2008, 10:57
Сообщение #2





Группа: Новичок
Сообщений: 6
Регистрация: 25-06-08
Пользователь №: 38 539



Всю ночь долбался не мог понять в чем проблема, а сейчас выяснил.
Надеюсь кому-то поможет.

Адрес в CGRAM нужно выбирать через 8, например 0x00, 0x08. Это в даташите написано. Сразу не понял почему.


То есть, чтоб записать свой символ нужно первым делом инициализировать дисплей
Код
mylcd_init();

Потом выбрать адрес

Код
mylcd_wdata4(0,0b0100);//Нулевой
mylcd_wdata4(0,0b0000);                 символ


Отправить данные
Код
for (i=0; i<16; i++) mylcd_wdata4(1,user_gradus[i]);


Поставить курсор в нужное место
Код
mylcd_goto(1,1);

И вывести символ

Код
mylcd_wdata4(1,0);
mylcd_wdata4(1,0);


Код
#define LCD_RS RC2
#define LCD_sync RC3
#define LCD_F4 RC7
#define LCD_F5 RC6
#define LCD_F6 RC5
#define LCD_F7 RC4

void mylcd_strobe(){
    LCD_sync = 1; // Синхронизация.
    DelayUs(250);// Задержка
    DelayUs(250);// Задержка
    LCD_sync = 0; // Синхронизация.
}

void mylcd_wdata4(short RS, short data){
    
    if(LCD_RS != RS)
    {
        LCD_RS = RS;// Выбор Регистра команд.
        DelayMs(1);// Задержка
    }
     //Данные
    if((data & 0b1) >= 1)    LCD_F7 = 1;    else    LCD_F7 = 0;
    if((data & 0b10) >= 1)    LCD_F6 = 1;    else    LCD_F6 = 0;
    if((data & 0b100) >= 1)    LCD_F5 = 1;    else    LCD_F5 = 0;
    if((data & 0b1000) >= 1)LCD_F4 = 1;    else    LCD_F4 = 0;
    
     //Данные
     DelayUs(250);// Задержка
     mylcd_strobe();
     DelayUs(50);// Задержка    

}

void mylcd_init(){
     PORTC = 0;
     DelayMs(100);// Задержка после включения
     mylcd_wdata4(0,0b0010);//4 Бита шина
     DelayMs(100);
     mylcd_wdata4(0,0b0000);
     mylcd_wdata4(0,0b1100);
     DelayMs(100);
     mylcd_wdata4(0,0b0000);
     mylcd_wdata4(0,0b0001);
     DelayMs(10);
     mylcd_wdata4(0,0b0000);
     mylcd_wdata4(0,0b0110);
     DelayMs(10);
     mylcd_wdata4(0,0b0010);
     mylcd_wdata4(0,0b1000);
     DelayMs(10);
}

void mylcd_goto(char row, char col)//Номер строки и символа начинаются с 1
{
    if (row == 1) mylcd_wdata4(0,0b1000); else mylcd_wdata4(0,0b1100);
    mylcd_wdata4(0, col - 1);
}


Абракадабра появляется когда я записываю данные
Код
mylcd_wdata4(0,0);
mylcd_wdata4(0,0b0001);

Хотя должна была быть очистка дисплея, а появляется бред на экране.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 12:50
Рейтинг@Mail.ru


Страница сгенерированна за 0.01377 секунд с 7
ELECTRONIX ©2004-2016