Всю ночь долбался не мог понять в чем проблема, а сейчас выяснил.
Надеюсь кому-то поможет.Адрес в 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);
Хотя должна была быть очистка дисплея, а появляется бред на экране.