Использование GLCD от Nokia 5100

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From Russian to

Threaded View
 Привет _All_ ! Пишет тебе *Vadim* !

Хочу использовать экран от Nokia 5100, есть вопросы.

1) Помогите определить, какой у меня контроллер к GLCD

Экран с обратной (со стороны платы сотового) стороны серебристый, шлейф -
зеленый. Hа серебристой поверхности
выгрировано "3110287", и наклеена наклейка "4P030346FS
3472890003". Разъём - стандартный, 10-контактный, по 5 контактов с каждой
стороны.
У меня контроллер S1D15G00 ?

2) Допустим хочу нарисовать красную точку на белом фоне. Я скачал два исходника
(на Си и на Бейсике) и
даташит на контроллер S1D15G00, но в даташите не все понятно, а исходники
неполные - некоторые из используемых
функций не описаны.

Правильно ли я понимаю, что для решения данной задачи должен осуществить
следующую последовательность действий:

1) LCD_Reset - сброс LCD
   LCD_CS (1); // Установить CS
   LCD_RST (1); // Установить RST
   LCD_CLK (1); // Установить CLK
   LCD_DAT_Set (1); // Установить данные
   LCD_CLK (0); // Сбросить CLK
   Time (200); // Задержка примерно 200 мкс
   LCD_RST (0); // Сбросить RST
   Time (10); // Задержка примерно 10 мкс
   LCD_RST (1); // Установить RST
2) LCD_Display_Control - Установить временные параметры
   LCD_COM (DISPLAY_CONTROL); // Установка времен задержки и
                     // частот, необходимых для работы
   LCD_DAT (0x03); // Передать код делителя частоты
   LCD_DAT (0x20); // Передать коэффициент заполнения
   LCD_DAT (0x0C); // Установить флаг инверсии
   LCD_DAT (0x00); // Завершить передачу частотных
             // параметров
3) LCD_Pin_Scan_Direction - Установить параметры сканирования выводов
   LCD_COM (COMMON_SCAN_DIRECTION); // Установка направления
   LCD_DAT (0x01); // Выбрать байт направления
4) LCD_Oscill_ON() - Включить внутренний генератор
   LCD_COM(INT_OSCILL_ON);
5) LCD_Sleep_Out() - Активировать LCD
   LCD_COM(SLEEP_OUT);
6) LCD_Electric_Control - Установить рекомендуемые яркость и контраст
   LCD_COM (ELEC_VOLUME_CONTROL); // Установить значения
   LCD_DAT (0x3f); // Рекомендуемый контраст =5
   LCD_DAT (0x01); // Рекомендуемая яркость =2
7) LCD_Power_Control - Включить цепи питания
   LCD_COM (POWER_CONTROL); // Включить все цепи питания LCD
   LCD_DAT (0x0f); // Передать код
8) Delay (100) - Задержка примерно 100 мс
8) LCD_Inverse_Mode() - Включить инверсный режим
   LCD_COM(DISPLAY_INVERSE)
9) LCD_Data_Control_Set(0,1,0,0,0x01) - Установить параметры данных
   register byte ch=0;
   LCD_COM (DATA_CONTROL); // Установка параметров
   ch|=0x02; // Hаправление столбцов
   LCD_DAT (ch); // Передать данные
   LCD_DAT (0); // Задать цветность
   LCD_DAT (0x01); // Задать градации серого
   LCD_DAT (0x00); // Завершить передачу
10)LCD_8Bit_Palette_Set() - Установить палитру
   LCD_COM (RGB_SET);
   LCD_DAT (0); LCD_DAT (2); LCD_DAT (4); LCD_DAT (6); LCD_DAT (8); LCD_DAT
(10); LCD_DAT (12); LCD_DAT (15);
   LCD_DAT (0); LCD_DAT (2); LCD_DAT (4); LCD_DAT (6); LCD_DAT (8); LCD_DAT
(10); LCD_DAT (12); LCD_DAT (15);
   LCD_DAT (0); LCD_DAT (5); LCD_DAT (10); LCD_DAT (15);
12)Delay (100); // Задержка примерно 100 мс
13)LCD_NOP()
   LCD_COM(NOP)
14)LCD_ON() - Включить LCD
   LCD_COM(DISPLAY_ON)
15)Delay (200) - Задержка примерно 200 мс
16)LCD_Set_BG_Color - Установить белый цвет фона
   int index=(SCREEN_HEIGHT-1)*(SCREEN_WIDTH-1),a;
   LCD_COM(SET_PAGE_ADDRESS); // Передать код задания
                     // диапазона по строке
                     // величина Х1 должна быть меньше Х2
   LCD_DAT(0); // Адрес начала зоны
   LCD_DAT(SCREEN_WIDTH-1); // Адрес конца зоны
   LCD_COM(SET_COLUMN_ADDRESS); // Передать код задания
                    // диапазона по столбцу
                    // величина Y1 должна быть меньше Y2
   LCD_DAT(0); // Адрес начала зона
   LCD_DAT(SCREEN_HEIGHT-1); // Адрес конца зоны
   for (a=0;a<index;a++){
      LCD_DAT(RGB(0xFF, 0xFF, 0xFF));
   }
17)LCD_PutPixel - Hарисовать красный пиксель по координатам 60,60
   LCD_COM(SET_PAGE_ADDRESS); // Передать код задания
                     // диапазона по строке
                     // величина Х1 должна быть меньше Х2
   LCD_DAT(60); // Адрес начала зоны
   LCD_DAT(60+1); // Адрес конца зоны
   LCD_COM(SET_COLUMN_ADDRESS); // Передать код задания
                    // диапазона по столбцу
                    // величина Y1 должна быть меньше Y2
   LCD_DAT(60); // Адрес начала зона
   LCD_DAT(60+1); // Адрес конца зоны
   LCD_COM(WRITING_TO_MEMORY); // Передать код записи в память
   LCD_DAT (RGB(0xFF, 0x00, 0x00)); // Записать байт цвета

где SCREEN_WIDTH13%2, SCREEN_HEIGHT13%2, RGB(r,g,b) - это
((r&0xE0)|((g&0xE0)>>3)|(b>>6)) (3 байта r,g,b плюс
     2 байта b переводим в 12-битное значение цвета)

где LCD_COM и LCD_DAT выполняют следующие функции:

// Переслать байт команды
void LCD_COM (byte COM){
   LCD_Send(COM,0);
}

// Переслать байт данных
void LCD_DAT (byte DAT){
   LCD_Send(DAT,1);
}
void LCD_Send (byte DAT, bit CB){
   register byte i;
   register byte mask = 0x80;
   LCD_CS (0); // Сбросить CS
   _nop_(); // Задержка на 1 такт MCU примерно 50 нс
   LCD_BitSend(CB); // Переслать бит признака операции
              // "0" - если далее следует байт команды
              // "1" - если далее следует байт данных
   for (i=0;i<8;i++){
      LCD_BitSend ( (DAT&mask)?1:0 ); // Переслать очередной бит
      mask=mask>>1; // Модифицировать маску (бит)
   }
   LCD_CS (1); // Установить CS
}
// **************************************
// Пересылка одного бита
// **************************************
void LCD_BitSend (bit B){
   _nop_(); // Задержка на 1 такт MCU примерно 50 нс
   LCD_DAT_Set (B); // Установить бит данных
   LCD_Pulse (); // Сгенерировать тактовый импульс
}
void LCD_Pulse (void){
   _nop_(); // Задержка на 1 такт MCU примерно 50 нс
   LCD_CLK(1); // Установить CLK
   _nop_(); // Задержка на 1 такт MCU примерно 50 нс
   LCD_CLK(0); // Сбросить CLK
}
void LCD_CS (bit A){ set_bit(LCD_CS_Bit,A); }
void LCD_RST (bit A) { set_bit(LCD_RST_Bit,A); }
void LCD_CLK (bit A) { set_bit(LCD_CLK_Bit,A); }
void LCD_DAT_Set (bit A) { set_bit(LCD_DAT_Bit,A); }
bit LCD_DAT_Get (void) { return get_bit(); }
void LCD_LED (bit A) { set_bit(LCD_LED_Bit,A); }
void set_bit(int mask,bit wbit){
   if (wbit)
      lpt_val|=mask;
   else
      lpt_val&=~mask;
   outportb(0x3F8,lpt_val);
}

int get_bit(void){
   lpt_val=inportb(0x3F9);
   if ((lpt_val&128)!=0)
      return 1;
   else
      return 0;
}

bit и byte - определены через typedef как unsigned char

GLCD подключаем к LPT-порту, выводы D4-D0 этого порта соответствуют линиям RST,
DAT (только выход, через резистор
     2-2.2кОм), CLK, CS, LED
 (LED - на микросхему 1851 управления светодиодами GLCD), а вывод BUSY GLCD
подключаем в DAT (только вход) GLDC
//LPT <D7:D0> N N N RST DAT_OUT CLK CS LED
//LPT <BUSY> DAT_IN (Status 3F9 <7>)
//R on LPT IN=2-2.2кОм
// OUT->R->\___SDA
// IN<-----/
Delay, Time, _nop_ соответственно устанавливают задержку в миллисекундах,
микросекундах и наносекундах, но в тестовых
целях можно минимальную задержку равной 1мс сделать, вместо микросекунд и
наносекунд - void time (void),
void _nop_ (void)

Всё верно?

И ещё - мы тут везде тупо пишем в LCD, не дожидаясь никакого ответа. Т.е. если
что-то пойдет не так, то непонятно,
на какой стадии. Так и должно быть? :)

P.S. Помогая мне, вы я думаю поможете и остальным новичкам, решившим
использовать экран от Hокии
в своих поделках. :)

... Hу как тебе не стыдно

Re: Использование GLCD от Nokia 5100
 Привет _All_ ! Пишет тебе *Vadim* !

Хочу использовать экран от Nokia 5100, есть вопросы.

1) Помогите определить, какой у меня контроллер к GLCD

Экран с обратной (со стороны платы сотового) стороны серебристый, шлейф -
зеленый. Hа серебристой поверхности
выгрировано "3110287", и наклеена наклейка "4P030346FS
3472890003". Разъём - стандартный, 10-контактный, по 5 контактов с каждой
стороны.
У меня контроллер S1D15G00 ?

2) Допустим хочу нарисовать красную точку на белом фоне. Я скачал два исходника
(на Си и на Бейсике) и
даташит на контроллер S1D15G00, но в даташите не все понятно, а исходники
неполные - некоторые из используемых
функций не описаны.

Правильно ли я понимаю, что для решения данной задачи должен осуществить
следующую последовательность действий:

1) LCD_Reset - сброс LCD
   LCD_CS (1); // Установить CS
   LCD_RST (1); // Установить RST
   LCD_CLK (1); // Установить CLK
   LCD_DAT_Set (1); // Установить данные
   LCD_CLK (0); // Сбросить CLK
   Time (200); // Задержка примерно 200 мкс
   LCD_RST (0); // Сбросить RST
   Time (10); // Задержка примерно 10 мкс
   LCD_RST (1); // Установить RST
2) LCD_Display_Control - Установить временные параметры
   LCD_COM (DISPLAY_CONTROL); // Установка времен задержки и
                     // частот, необходимых для работы
   LCD_DAT (0x03); // Передать код делителя частоты
   LCD_DAT (0x20); // Передать коэффициент заполнения
   LCD_DAT (0x0C); // Установить флаг инверсии
   LCD_DAT (0x00); // Завершить передачу частотных
             // параметров
3) LCD_Pin_Scan_Direction - Установить параметры сканирования выводов
   LCD_COM (COMMON_SCAN_DIRECTION); // Установка направления
   LCD_DAT (0x01); // Выбрать байт направления
4) LCD_Oscill_ON() - Включить внутренний генератор
   LCD_COM(INT_OSCILL_ON);
5) LCD_Sleep_Out() - Активировать LCD
   LCD_COM(SLEEP_OUT);
6) LCD_Electric_Control - Установить рекомендуемые яркость и контраст
   LCD_COM (ELEC_VOLUME_CONTROL); // Установить значения
   LCD_DAT (0x3f); // Рекомендуемый контраст =5
   LCD_DAT (0x01); // Рекомендуемая яркость =2
7) LCD_Power_Control - Включить цепи питания
   LCD_COM (POWER_CONTROL); // Включить все цепи питания LCD
   LCD_DAT (0x0f); // Передать код
8) Delay (100) - Задержка примерно 100 мс
8) LCD_Inverse_Mode() - Включить инверсный режим
   LCD_COM(DISPLAY_INVERSE)
9) LCD_Data_Control_Set(0,1,0,0,0x01) - Установить параметры данных
   register byte ch=0;
   LCD_COM (DATA_CONTROL); // Установка параметров
   ch|=0x02; // Hаправление столбцов
   LCD_DAT (ch); // Передать данные
   LCD_DAT (0); // Задать цветность
   LCD_DAT (0x01); // Задать градации серого
   LCD_DAT (0x00); // Завершить передачу
10)LCD_8Bit_Palette_Set() - Установить палитру
   LCD_COM (RGB_SET);
   LCD_DAT (0); LCD_DAT (2); LCD_DAT (4); LCD_DAT (6); LCD_DAT (8); LCD_DAT
(10); LCD_DAT (12); LCD_DAT (15);
   LCD_DAT (0); LCD_DAT (2); LCD_DAT (4); LCD_DAT (6); LCD_DAT (8); LCD_DAT
(10); LCD_DAT (12); LCD_DAT (15);
   LCD_DAT (0); LCD_DAT (5); LCD_DAT (10); LCD_DAT (15);
12)Delay (100); // Задержка примерно 100 мс
13)LCD_NOP()
   LCD_COM(NOP)
14)LCD_ON() - Включить LCD
   LCD_COM(DISPLAY_ON)
15)Delay (200) - Задержка примерно 200 мс
16)LCD_Set_BG_Color - Установить белый цвет фона
   int index=(SCREEN_HEIGHT-1)*(SCREEN_WIDTH-1),a;
   LCD_COM(SET_PAGE_ADDRESS); // Передать код задания
                     // диапазона по строке
                     // величина Х1 должна быть меньше Х2
   LCD_DAT(0); // Адрес начала зоны
   LCD_DAT(SCREEN_WIDTH-1); // Адрес конца зоны
   LCD_COM(SET_COLUMN_ADDRESS); // Передать код задания
                    // диапазона по столбцу
                    // величина Y1 должна быть меньше Y2
   LCD_DAT(0); // Адрес начала зона
   LCD_DAT(SCREEN_HEIGHT-1); // Адрес конца зоны
   for (a=0;a<index;a++){
      LCD_DAT(RGB(0xFF, 0xFF, 0xFF));
   }
17)LCD_PutPixel - Hарисовать красный пиксель по координатам 60,60
   LCD_COM(SET_PAGE_ADDRESS); // Передать код задания
                     // диапазона по строке
                     // величина Х1 должна быть меньше Х2
   LCD_DAT(60); // Адрес начала зоны
   LCD_DAT(60+1); // Адрес конца зоны
   LCD_COM(SET_COLUMN_ADDRESS); // Передать код задания
                    // диапазона по столбцу
                    // величина Y1 должна быть меньше Y2
   LCD_DAT(60); // Адрес начала зона
   LCD_DAT(60+1); // Адрес конца зоны
   LCD_COM(WRITING_TO_MEMORY); // Передать код записи в память
   LCD_DAT (RGB(0xFF, 0x00, 0x00)); // Записать байт цвета

где SCREEN_WIDTH13%2, SCREEN_HEIGHT13%2, RGB(r,g,b) - это
((r&0xE0)|((g&0xE0)>>3)|(b>>6)) (3 байта r,g,b плюс
     2 байта b переводим в 12-битное значение цвета)

где LCD_COM и LCD_DAT выполняют следующие функции:

// Переслать байт команды
void LCD_COM (byte COM){
   LCD_Send(COM,0);
}

// Переслать байт данных
void LCD_DAT (byte DAT){
   LCD_Send(DAT,1);
}
void LCD_Send (byte DAT, bit CB){
   register byte i;
   register byte mask = 0x80;
   LCD_CS (0); // Сбросить CS
   _nop_(); // Задержка на 1 такт MCU примерно 50 нс
   LCD_BitSend(CB); // Переслать бит признака операции
              // "0" - если далее следует байт команды
              // "1" - если далее следует байт данных
   for (i=0;i<8;i++){
      LCD_BitSend ( (DAT&mask)?1:0 ); // Переслать очередной бит
      mask=mask>>1; // Модифицировать маску (бит)
   }
   LCD_CS (1); // Установить CS
}
// **************************************
// Пересылка одного бита
// **************************************
void LCD_BitSend (bit B){
   _nop_(); // Задержка на 1 такт MCU примерно 50 нс
   LCD_DAT_Set (B); // Установить бит данных
   LCD_Pulse (); // Сгенерировать тактовый импульс
}
void LCD_Pulse (void){
   _nop_(); // Задержка на 1 такт MCU примерно 50 нс
   LCD_CLK(1); // Установить CLK
   _nop_(); // Задержка на 1 такт MCU примерно 50 нс
   LCD_CLK(0); // Сбросить CLK
}
void LCD_CS (bit A){ set_bit(LCD_CS_Bit,A); }
void LCD_RST (bit A) { set_bit(LCD_RST_Bit,A); }
void LCD_CLK (bit A) { set_bit(LCD_CLK_Bit,A); }
void LCD_DAT_Set (bit A) { set_bit(LCD_DAT_Bit,A); }
bit LCD_DAT_Get (void) { return get_bit(); }
void LCD_LED (bit A) { set_bit(LCD_LED_Bit,A); }
void set_bit(int mask,bit wbit){
   if (wbit)
      lpt_val|=mask;
   else
      lpt_val&=~mask;
   outportb(0x3F8,lpt_val);
}

int get_bit(void){
   lpt_val=inportb(0x3F9);
   if ((lpt_val&128)!=0)
      return 1;
   else
      return 0;
}

bit и byte - определены через typedef как unsigned char

GLCD подключаем к LPT-порту, выводы D4-D0 этого порта соответствуют линиям RST,
DAT (только выход, через резистор
     2-2.2кОм), CLK, CS, LED
 (LED - на микросхему 1851 управления светодиодами GLCD), а вывод BUSY GLCD
подключаем в DAT (только вход) GLDC
//LPT <D7:D0> N N N RST DAT_OUT CLK CS LED
//LPT <BUSY> DAT_IN (Status 3F9 <7>)
//R on LPT IN=2-2.2кОм
// OUT->R->\___SDA
// IN<-----/
Delay, Time, _nop_ соответственно устанавливают задержку в миллисекундах,
микросекундах и наносекундах, но в тестовых
целях можно минимальную задержку равной 1мс сделать, вместо микросекунд и
наносекунд - void time (void),
void _nop_ (void)

Всё верно?

И ещё - мы тут везде тупо пишем в LCD, не дожидаясь никакого ответа. Т.е. если
что-то пойдет не так, то непонятно,
на какой стадии. Так и должно быть? :)

P.S. Помогая мне, вы я думаю поможете и остальным новичкам, решившим
использовать экран от Hокии
в своих поделках. :)

... Hу как тебе не стыдно

Site Timeline