Использование 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_WIDTH=132, SCREEN_HEIGHT=132, 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){delay(1);}, void _nop_ (void){delay(1);}

Всё верно?

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

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

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

Reply to
Vadim Tzirulnicov
Loading thread data ...

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.