Хочу использовать экран от 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. Помогая мне, вы я думаю поможете и остальным новичкам, решившим использовать экран от Нокии
в своих поделках. :)
-
- Тут много интересного. - Ruslan(04.01.2009 15:30, ссылка, ссылка)
- Здесь читал? - General(03.01.2009 22:25, ссылка)
- Да. Это один из двух использованных мною источников. Весьма неполный, кстати. - Вадим-2(04.01.2009 01:55, )
- И всё равно, переговорить с автором не помешает. Его может заинтересовать "неполнота" материала. - General(04.01.2009 10:52)
- И как с ним связаться? :) - Вадим-2(04.01.2009 17:08, )
- Олег Николайчук onic@ch.moldpac.md - General(04.01.2009 19:19)
- И как с ним связаться? :) - Вадим-2(04.01.2009 17:08, )
- И всё равно, переговорить с автором не помешает. Его может заинтересовать "неполнота" материала. - General(04.01.2009 10:52)
- Да. Это один из двух использованных мною источников. Весьма неполный, кстати. - Вадим-2(04.01.2009 01:55, )