Отдали мне ещё один дисплей от Siemens C75, но он почему-то не на зелёном текстолите. Работает ли он со стандартными командами не знаю, так как дисплей, возможно, не рабочий (телефон упал и больше не включился; поэтому-то мне дисплей и не отдали).
Дисплей с желтым текстолитом совсем другой. Это не LPH9157-2, и он с ним ничего общего не имеет.
А у зеленого всё-равно команды не совсем совпадают с ILI9163. Подобная система команд используется в разных дисплеях разных производителей - я находил десятки даташитов с похожими командами, но ни один не совпал точно. Некоторые уточненные команды есть в моём длинном сообщении кажется около 8 страницы темы.
О! Спасибо! А то я никак не могу найти на него даже названия. Зелёный-то у меня работает сходу, а вот этот буду пробовать оживить. Распайка, вроде, совпадает с зелёным. Хорошо.
//---------- //прототипы функций //---------- void LCD_Init(void);//инициализация LCD-экрана inline unsigned char SPI_SendData(unsigned char value);//послать по SPI-данные unsigned char LCD_SendData8(unsigned char value);//послать 8-бит данных LCD-экрану unsigned short LCD_SendData16(unsigned short value);//послать 16-бит данных LCD-экрану unsigned char LCD_SendCommand(unsigned char command);//послать 8-бит команды LCD-экрану void LCD_SetOutputRectangle(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2);//указать LCD-экрану прямоугольник вывода и начать процесс вывода void LCD_SetPixel(unsigned short color);//установить пиксель в текущую позицию вывода LCD-экрана void LCD_Enable(void);//включение управления LCD-экраном void LCD_Disable(void);//выключение управления LCD-экраном //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //общие функции //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//---------- //инициализация LCD-экрана //---------- void LCD_Init(void) { //настраиваем порты LCD_DDR_CS|=(1<<LCD_CS); LCD_DDR_RS|=(1<<LCD_RS); LCD_DDR_RESET|=(1<<LCD_RESET); //инициализируем экран LCD_PORT_CS|=(1<<LCD_CS); LCD_PORT_RS&=(0xff^(1<<LCD_RS)); LCD_PORT_RESET&=(0xff^(1<<LCD_RESET)); LCD_Enable(); _delay_ms(500); LCD_PORT_RESET|=(1<<LCD_RESET); _delay_ms(500); LCD_SendCommand(0x00);//неизвестная команда LCD_SendData16(0x0001);//неизвестный параметр LCD_SendCommand(0x10);//неизвестная команда LCD_SendData16(0x1F92);//неизвестный параметр LCD_SendCommand(0x11);//неизвестная команда LCD_SendData16(0x0014);//неизвестный параметр LCD_SendCommand(0x00);//неизвестная команда LCD_SendData16(0x0001);//неизвестный параметр LCD_SendCommand(0x10);//неизвестная команда LCD_SendData16(0x1F92);//неизвестный параметр LCD_SendCommand(0x11);//неизвестная команда LCD_SendData16(0x001C);//неизвестный параметр LCD_SendCommand(0x28);//неизвестная команда LCD_SendData16(0x0006);//неизвестный параметр LCD_SendCommand(0x02);//неизвестная команда LCD_SendData16(0x0000);//неизвестный параметр
LCD_SendCommand(0x12);//неизвестная команда LCD_SendData16(0x040F);//неизвестный параметр
LCD_SendCommand(0x01); LCD_SendData16(0x31AF);
LCD_SendCommand(0x07); LCD_SendData16(0x0033); LCD_Disable(); } //---------- //послать по SPI-данные //---------- inline unsigned char SPI_SendData(unsigned char value) { SPDR=value; while(!(SPSR&(1<<SPIF))); return(SPDR); } //---------- //послать 8-бит данных LCD-экрану //---------- inline unsigned char LCD_SendData8(unsigned char value) { LCD_PORT_RS|=(1<<LCD_RS); return(SPI_SendData(value)); } //---------- //послать 16-бит данных LCD-экрану //---------- inline unsigned short LCD_SendData16(unsigned short value) { LCD_PORT_RS|=(1<<LCD_RS); unsigned short r=SPI_SendData((value>>8)&0xff); r=r<<8; r|=SPI_SendData(value&0xff); return(r); } //---------- //послать 8-бит команды LCD-экрану //---------- inline unsigned char LCD_SendCommand(unsigned char command) { LCD_PORT_RS&=(0xff^(1<<LCD_RS)); return(SPI_SendData(command)); } //---------- //указать LCD-экрану прямоугольник вывода и начать процесс вывода //---------- inline void LCD_SetOutputRectangle(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2) { //устанавливаем первый и последний столбцы записи в память LCD_SendCommand(0x47); LCD_SendData8(y2); LCD_SendData8(y1); LCD_SendCommand(0x44); LCD_SendData8(x2); LCD_SendData8(x1); //и текущие координаты вывода LCD_SendCommand(0x21); LCD_SendData8(x1); LCD_SendData8(y1); //устанавливаем направление вывода LCD_SendCommand(0x03);//установить режим вывода LCD_SendData16(0x7820);//понятия не имею, что это за биты, но 20 - вывод сверху-вниз //запускаем процесс вывода пикселей LCD_SendCommand(0x22); } //---------- //установить пиксель в текущую позицию вывода LCD-экрана //---------- inline void LCD_SetPixel(unsigned short color) { LCD_SendData16(color); } //---------- //включение управления LCD-экраном //---------- inline void LCD_Enable(void) { LCD_PORT_CS&=0xff^(1<<LCD_CS); } //---------- //выключение управления LCD-экраном //---------- inline void LCD_Disable(void) { LCD_PORT_CS|=(1<<LCD_CS); }
Всем мяу, ребят, а вот с таким диспом никто не сталькивался? (37 pin) двух симочный китаяц с наружи написано Nokia, под аккумом S538 и все, даже распи не могу найти.
Сколько смотрю и понять немогу откуда берутся LCD_Clk,LCD_Data,LCD_RS,LCD_CS,LCD_Reset и куда запихиваются? По программе мне восновном все понятно но не понятно как управлять этими выходами Вот допустим кусок программы где напрямую подаются сигналы на отдельные выходы экрана:
Ябы мог допустим забить на это и написать отдельно типа выход на порт но порт то один а тут на каждый вывод отдельно посылаются сигналы. Как это осуществить? У меня дисплей LPH9157-2, программирую на СИ (я начинающий такчто сильно не пинайте)
Обьясните пожалуйста чтоб было понятно. Вот сама программа взята с этой темы:
procedure write(w:boolean;datt:byte); //запись данных или команды 8 бит в LCD var i:byte; begin if w=1 then LCD_RS:=w else begin LCD_CS:=1; LCD_RS:=w; LCD_CS:=0; end; LCD_Clk:=0; for i:=0 to 7 do begin LCD_Data:=datt.B7; LCD_Clk:=1; datt:=datt shl 1; LCD_Clk:=0; end; end; procedure writec(datt:word); //запись данных 16 бит в LCD var i,h,l:byte; begin h:=Hi(datt); l:=Lo(datt); LCD_RS:=1; LCD_Clk:=0; for i:=0 to 7 do begin LCD_Data:=h.B7; LCD_Clk:=1; h:=h shl 1; LCD_Clk:=0; end; for i:=0 to 7 do begin LCD_Data:=l.B7; LCD_Clk:=1; l:=l shl 1; LCD_Clk:=0; end; end; procedure koord(x,y:byte); //Установка координаты на дисплее begin write(cmd,0x2a); write(dat,y); write(dat,132); write(cmd,0x2b); write (dat,x); write(dat,176); end; procedure pixel(x,y:byte; color:word); //рисование пикселя опрю цвета на дисплее begin koord(x,y); write(cmd,0x2c); writec(color); end; procedure LCD_init(); begin LCD_RS:=0; LCD_CS:=1; LCD_RESET:=0; delay_ms(500); LCD_RESET:=1; delay_ms(500); Write(cmd,0x01); delay_ms(20); write(cmd,0x36);//Memory Access Control write(dat,0x80); Write(cmd,0x11); //sleep out delay_ms(20); write(cmd,0x3a); //interfase pixel format Write(dat,0x55); delay_ms(20); write(cmd,0x29); //Display ON end; end.
_________________ Шуруп забитый молотком держится намного лучше чем гвоздь закрученный отверткой!
PORTB |= 1<<2 ; единицу на ножку 2 порта B PORTB |= 1<<6 ; единицу на ножку 6 порта B PORTB |= 1<<0 ; единицу на ножку 0 порта B PORTB &= ~(1<<2) ; нуль на ножку 2 порта B
Это СИ. Вам под какой микроконтроллер нужно? И под какой компилятор? С этими дисплеями LPH9157-2 я делал разные штучки, достойный дисплей. Яркий, цвета нассыщеные, и шустрый.
_________________ Ни один домашний кот незнает что он домашний.
Сколько смотрю и понять немогу откуда берутся LCD_Clk,LCD_Data,LCD_RS,LCD_CS,LCD_Reset и куда запихиваются?
Их задают сами программисты. Это макросы. Т.е., это слова, которые заменяются при компиляции на что-то иное. Например, #define LCD_PORT_CS PORTC означает, что вместо LCD_PORT_CS будет подставлено PORTC. Итого, запись LCD_PORT_C=0; означает PORTC=0; А что такое PORTC компилятор знает из каких-то библиотек, где описан доступ к этому регистру.
Цитата:
Как это осуществить? У меня дисплей LPH9157-2, программирую на СИ (я начинающий такчто сильно не пинайте)
Могу предложить так для вашего дисплея:
Код:
//LCD-экран от Siemens C75 (зелёный текстолит) подключён по SPI
//---------- //прототипы функций //---------- void LCD_Init(void);//инициализация LCD-экрана unsigned char SPI_SendData(unsigned char value);//послать по SPI данные unsigned char LCD_SendData8(unsigned char value);//послать 8-бит данных LCD-экрану unsigned short LCD_SendData16(unsigned short value);//послать 16-бит данных LCD-экрану unsigned char LCD_SendCommand(unsigned char command);//послать 8-бит команды LCD-экрану void LCD_SetOutputRectangle(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2);//указать LCD-экрану прямоугольник вывода и начать процесс вывода void LCD_SetPixel(unsigned short color);//установить пиксель в текущую позицию вывода LCD-экрана //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //общие функции //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//---------- //инициализация LCD-экрана //---------- void LCD_Init(void) { //настраиваем порты LCD_DDR_CS|=(1<<LCD_CS); LCD_DDR_RS|=(1<<LCD_RS); LCD_DDR_RESET|=(1<<LCD_RESET); //инициализируем экран LCD_PORT_CS|=(1<<LCD_CS); LCD_PORT_RS&=(0xff^(1<<LCD_RS)); LCD_PORT_RESET&=(0xff^(1<<LCD_RESET)); LCD_PORT_CS&=(0xff^(1<<LCD_CS)); _delay_ms(500); LCD_PORT_RESET|=(1<<LCD_RESET); _delay_ms(500); LCD_SendCommand(0x01);//программный сброс _delay_ms(20); LCD_SendCommand(0x36);//Установка направлений заполнения прямоугольника CASET x PASET LCD_SendData8(0x80); LCD_SendCommand(0x11); //выход из спящего режима _delay_ms(20); LCD_SendCommand(0x3a); //установка глубины цвета LCD_SendData8(0x5);//режим 16-бит /* Один параметр 0bXXXXXABC ABC: 010 - 8bit/pixel (0bRRRGGGBB), 011 - 12bit/pixel (0bRRRRGGGG 0bBBBBRRRR 0bGGGGBBBB), 101 - 16bit/pixel (0bRRRRRGGG 0bGGGBBBBB) */ _delay_ms(20); LCD_SendCommand(0x29); //включаем дисплей } //---------- //послать по SPI-данные //---------- inline unsigned char SPI_SendData(unsigned char value) { SPDR=value; while(!(SPSR&(1<<SPIF))); return(SPDR); } //---------- //послать 8-бит данных LCD-экрану //---------- inline unsigned char LCD_SendData8(unsigned char value) { LCD_PORT_RS|=(1<<LCD_RS); return(SPI_SendData(value)); } //---------- //послать 16-бит данных LCD-экрану //---------- inline unsigned short LCD_SendData16(unsigned short value) { LCD_PORT_RS|=(1<<LCD_RS); unsigned short r=SPI_SendData((value>>8)&0xff); r=r<<8; r|=SPI_SendData(value&0xff); return(r); } //---------- //послать 8-бит команды LCD-экрану //---------- inline unsigned char LCD_SendCommand(unsigned char command) { LCD_PORT_RS&=(0xff^(1<<LCD_RS)); return(SPI_SendData(command)); } //---------- //указать LCD-экрану прямоугольник вывода и начать процесс вывода //---------- inline void LCD_SetOutputRectangle(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2) { //устанавливаем первый и последний столбцы записи в память LCD_SendCommand(0x2a); LCD_SendData8(x1); LCD_SendData8(x2); LCD_SendCommand(0x2b); LCD_SendData8(y1); LCD_SendData8(y2); //устанавливаем направление вывода LCD_SendCommand(0x36); LCD_SendData8(0);//сверху-вниз слева-направо, без инверсии //запускаем процесс вывода пикселей LCD_SendCommand(0x2c); } //---------- //установить пиксель в текущую позицию вывода LCD-экрана //---------- inline void LCD_SetPixel(unsigned short color) { LCD_SendData16(color); }
Цитата:
а как быть с тем что на СИ нельзя обьявлять переменные типа byte? Нужно подавать двоичные данные а не десятичные
А вы инициализируйте переменную как 0b01010101010 и т.д. Я не помню, что такое тип byte в паскале, но предположу, что это аналог unsigned char в Си.
Цитата:
LCD_RS = 0;
Потому что у вас LCD_RS - макрос. Это слово будет заменено на то, что у вас ему приписано в #define. Если, конечно, речь шла о Си.
da-nie, спасибо огромное за код только я немогу понять почему допустим при прорисовке прямоугольника указываются координаты но не указывается цвет (и как его указывать?) и почему при выводе одного пикселя наоборот указывается только цвет но не указываются координаты??? Как задать текущий цвет и текущие координаты? Что значит функция послать по SPI-данные??? И еще... я так понял в этой программе используется только три вывода на дисплей с порта "С"? Почему так? Если я напишу функцию вывода пикселей таким образом(код ниже) я смогу за одну команду выводить пиксель в указанные координаты и присваивать свой цвет?:
Код:
inline void LCD_SetPixel(unsigned char x, unsigned char y, unsigned short color) { LCD_SendData16(color); LCD_SendCommand(0x2a); LCD_SendData8(x); LCD_SendCommand(0x2b); LCD_SendData8(y); LCD_SendCommand(0x2c); }
как осуществить стирание экрана?
_________________ Шуруп забитый молотком держится намного лучше чем гвоздь закрученный отверткой!
da-nie, спасибо огромное за код только я немогу понять почему допустим при прорисовке прямоугольника указываются координаты но не указывается цвет (и как его указывать?) и почему при выводе одного пикселя наоборот указывается только цвет но не указываются координаты??? Как задать текущий цвет и текущие координаты? Что значит функция послать по
Потому что эта команда задаёт прямоугольник в который будет осуществляться вывод цветов. Она его не закрашивает, а только задаёт и инициализирует начальные координаты вывода цветов. После этого каждая команда поставить точку определённого цвета ставит эту точку в этот прямоугольник по текущим координатам вывода, которые изменяются с каждой новой поставленной точкой. Проще говоря, вы сканируете этот прямоугольник и указываете для каждой его точки цвет. Вот и всё.
Цитата:
SPI-данные???
Да, дисплей должен быть подключён к линиям MOSI и SCK.
Цитата:
И еще... я так понял в этой программе используется только три вывода на дисплей с порта "С"? Почему так?
Потому что этому дисплею требуются линии:
1) CS - Chip Select - "выбор кристалла" - при низком уровне (т.е. при нуле) дисплей понимает, что сейчас будут работать с ним. 2) RS - эта линия определяет передаются ли данные или команды. Если на ней высокий уровень (т.е. 1), то передаются данные, если низкий (т.е. 0), то передаются команды. 3) Reset - линия сброса - низкий уровень осуществляет сброс дисплея.
Вы можете эти линии подключить на любые свободные порты (кроме SPI, конечно; к SPI подключаются другие линии).
Диоды там практически любые (только не Шоттки!), микросхемы стабилизаторов LM7805 и 2950A CS-3.3. Их можно заменить на аналогичные.
Цитата:
Если я напишу функцию вывода пикселей таким образом(код ниже) я смогу за одну команду выводить пиксель в указанные координаты и присваивать свой цвет?:
Нет, не сможете. Сможете вот как:
Код:
//устанавливаем первый и последний столбцы записи в память LCD_SendCommand(0x2a); LCD_SendData8(x); LCD_SendData8(131); LCD_SendCommand(0x2b); LCD_SendData8(y); LCD_SendData8(175); //устанавливаем направление вывода LCD_SendCommand(0x36); LCD_SendData8(0);//сверху-вниз слева-направо, без инверсии //запускаем процесс вывода пикселей LCD_SendCommand(0x2c);
LCD_SendData16(color);
Но это нерационально.
Цитата:
как осуществить стирание экрана?
Вот как:
Код:
LCD_SetOutputRectangle(0,0,131,175); for(unsigned short n=0;n<132*176;n++) LCD_SetPixel(LCD_BLACK);
Цитата:
Что значит функция послать по SPI-данные???
Эта функция используя интерфейс SPI отправляет дисплею данные или команды. Вот и всё. Настраивается SPI так:
Код:
SPCR=(0<<SPIE)|(1<<SPE)|(0<<DORD)|(1<<MSTR)|(0<<CPOL)|(0<<CPHA)|(0<<SPR1)|(0<<SPR0); SPSR=(1<<SPI2X);//удвоенная скорость SPI
da-nie, при пошаговой симуляции дохожу до функции SPI_SendData и в строке while(!(SPSR&(1<<SPIF))); происходит бесконечное зацикливание и курсор дальше не двигается. Жал кнопку "step into" либо "Step over" раз 50, думал может цикл длинный но дальше не двигается. И дисплей кстати не запустился
_________________ Шуруп забитый молотком держится намного лучше чем гвоздь закрученный отверткой!
Сейчас этот форум просматривают: Kapitoska и гости: 15
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения