ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
5 июля
143749
Вадим-2 (03.01.2009 22:19, просмотров: 3408)
Хочу использовать экран от Nokia 5100, есть вопросы. 1) Помогите определить, какой у меня контроллер к GLCD Экран с обратной (со стороны платы сотового) стороны серебристый, шлейф - зеленый. На серебристой поверхности выгрировано "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; // Направление столбцов 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 - Нарисовать красный пиксель по координатам 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. Помогая мне, вы я думаю поможете и остальным новичкам, решившим использовать экран от Нокии в своих поделках. :)