Дисплеи от мобильных телефонов- осцилограммы работы

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Аватара пользователя
da-nie
Говорящий с текстолитом
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.
Контактная информация:

Re: Дисплеи от мобильных телефонов- осцилограммы работы

Сообщение da-nie »

Тут когда-то спрашивали про команды lph9157-2. Насколько я видел в инете на easyelectronik, его система команд совпадает с ILI9163 (http://www.allshore.com/pdf/ILITEK_ILI9163.pdf).

Отдали мне ещё один дисплей от Siemens C75, но он почему-то не на зелёном текстолите. Работает ли он со стандартными командами не знаю, так как дисплей, возможно, не рабочий (телефон упал и больше не включился; поэтому-то мне дисплей и не отдали).

А фото вот какое:
display.jpg
(20.63 КБ) 780 скачиваний
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Foks
Поставщик валерьянки для Кота
Сообщения: 2108
Зарегистрирован: Пт авг 29, 2008 16:28:19
Откуда: Киев

Re: Дисплеи от мобильных телефонов- осцилограммы работы

Сообщение Foks »

Дисплей с желтым текстолитом совсем другой. Это не LPH9157-2, и он с ним ничего общего не имеет.

А у зеленого всё-равно команды не совсем совпадают с ILI9163. Подобная система команд используется в разных дисплеях разных производителей - я находил десятки даташитов с похожими командами, но ни один не совпал точно. Некоторые уточненные команды есть в моём длинном сообщении кажется около 8 страницы темы.
Giggity giggity goo!
lawr
Встал на лапы
Сообщения: 120
Зарегистрирован: Чт фев 16, 2012 15:22:06

Re: Дисплеи от мобильных телефонов- осцилограммы работы

Сообщение lawr »

Дисплей на желтом текстолите запущен здесь
Аватара пользователя
da-nie
Говорящий с текстолитом
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.
Контактная информация:

Re: Дисплеи от мобильных телефонов- осцилограммы работы

Сообщение da-nie »

О! Спасибо! А то я никак не могу найти на него даже названия. :( Зелёный-то у меня работает сходу, а вот этот буду пробовать оживить. :) Распайка, вроде, совпадает с зелёным. Хорошо.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Аватара пользователя
da-nie
Говорящий с текстолитом
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.
Контактная информация:

Re: Дисплеи от мобильных телефонов- осцилограммы работы

Сообщение da-nie »

Вот ещё есть про дисплеи с исходниками: http://www.superkranz.de/christian/S65_ ... tware.html
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Аватара пользователя
da-nie
Говорящий с текстолитом
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.
Контактная информация:

Re: Дисплеи от мобильных телефонов- осцилограммы работы

Сообщение da-nie »

Ну, вот программа для работы с дисплеем от Siemens C75 с жёлтым текстолитом.

Код: Выделить всё

//LCD-экран (жёлтый текстолит) от Siemens C75 подключён по SPI

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//настройки контактов LCD-экрана
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//линия ChipSelect
#define LCD_PORT_CS    PORTC
#define LCD_DDR_CS     DDRC
#define LCD_CS         0
//линия Reset
#define LCD_PORT_RESET PORTC
#define LCD_DDR_RESET  DDRC
#define LCD_RESET      1
//линия команда/данные
#define LCD_PORT_RS    PORTC
#define LCD_DDR_RS     DDRC
#define LCD_RS         2
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//базовые цвета LCD-экрана
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#define LCD_RED     0xF800
#define LCD_GREEN   0x07E0
#define LCD_BLUE    0x001F
#define LCD_BLACK   0x0000
#define LCD_WHITE   0xFFFF
#define LCD_YELLOW  0xFFE0
#define LCD_CYAN    0x07FF
#define LCD_MAGENTA 0xF81F
#define LCD_BLACK   0x0000
//----------
//глобальные переменные
//----------

//----------
//прототипы функций
//----------
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);
}
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Аватара пользователя
__Alexander
Потрогал лапой паяльник
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Re: Дисплеи от мобильных телефонов- осцилограммы работы

Сообщение __Alexander »

misha274 писал(а):Всем мяу, ребят, а вот с таким диспом никто не сталькивался? (37 pin)
двух симочный китаяц :))) с наружи написано Nokia, под аккумом S538 и все, даже распи не могу найти.



Контроллер какой? Они разные бывают.

Изображение
Аватара пользователя
Зукс
Вымогатель припоя
Сообщения: 564
Зарегистрирован: Чт июл 21, 2011 19:56:10

Re: Дисплеи от мобильных телефонов- осцилограммы работы

Сообщение Зукс »

Сколько смотрю и понять немогу откуда берутся LCD_Clk,LCD_Data,LCD_RS,LCD_CS,LCD_Reset и куда запихиваются? По программе мне восновном все понятно но не понятно как управлять этими выходами
Вот допустим кусок программы где напрямую подаются сигналы на отдельные выходы экрана:

Код: Выделить всё

LCD_Data:=datt.B7;
    LCD_Clk:=1;
    datt:=datt shl 1;
    LCD_Clk:=0;

Ябы мог допустим забить на это и написать отдельно типа выход на порт но порт то один а тут на каждый вывод отдельно посылаются сигналы. Как это осуществить? У меня дисплей LPH9157-2, программирую на СИ (я начинающий такчто сильно не пинайте)

Обьясните пожалуйста чтоб было понятно. Вот сама программа взята с этой темы:

Код: Выделить всё

var
LCD_Clk,LCD_Data,LCD_RS,LCD_CS,LCD_Reset:sbit; sfr; external;
const
CMD:boolean=0;
DAT:boolean=1;
RED:word=0xF800;
GREEN:word=0x07E0;
BLUE:word=0x001F;
BLACK:word=0x0000;
WHITE:word=0xFFFF;
YELLOW:word=0xFFE0; //Желтый
CYAN:word=0x07FF; //Голубой
MAGENTA:word=0xF81F; //Фиолетовый

procedure write(w:boolean;datt:byte);
procedure writec(datt:word);
procedure koord(x,y:byte);
procedure pixel(x,y:byte; color:word);
procedure LCD_init();

implementation

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.
Шуруп забитый молотком держится намного лучше чем гвоздь закрученный отверткой!
Аватара пользователя
radiokot__
Мучитель микросхем
Сообщения: 454
Зарегистрирован: Вс янв 15, 2012 19:58:40

Re: Дисплеи от мобильных телефонов- осцилограммы работы

Сообщение radiokot__ »

Например я делаю так

Код: Выделить всё

#define LCD_RS            PORTB.0
#define LCD_RESET       PORTB.1
#define LCD_CS            PORTB.2
#define LCD_DATA        PORTB.3
#define LCD_CLK          PORTB.5


Ну и конечно эти порты надо настроить на выход

Код: Выделить всё

   PORTB = 0x00;
   DDRB = 0x3F;
Ни один домашний кот незнает что он домашний.
Аватара пользователя
Зукс
Вымогатель припоя
Сообщения: 564
Зарегистрирован: Чт июл 21, 2011 19:56:10

Re: Дисплеи от мобильных телефонов- осцилограммы работы

Сообщение Зукс »

radiokot__, это СИ или Паскаль?
Шуруп забитый молотком держится намного лучше чем гвоздь закрученный отверткой!
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Дисплеи от мобильных телефонов- осцилограммы работы

Сообщение Jack_A »

Ну какой может быть Си, если :=
Foks
Поставщик валерьянки для Кота
Сообщения: 2108
Зарегистрирован: Пт авг 29, 2008 16:28:19
Откуда: Киев

Re: Дисплеи от мобильных телефонов- осцилограммы работы

Сообщение Foks »

В Си надо использовать логические выражения

PORTB |= 1<<2 ; единицу на ножку 2 порта B
PORTB |= 1<<6 ; единицу на ножку 6 порта B
PORTB |= 1<<0 ; единицу на ножку 0 порта B
PORTB &= ~(1<<2) ; нуль на ножку 2 порта B
Giggity giggity goo!
Аватара пользователя
Зукс
Вымогатель припоя
Сообщения: 564
Зарегистрирован: Чт июл 21, 2011 19:56:10

Re: Дисплеи от мобильных телефонов- осцилограммы работы

Сообщение Зукс »

Спасибо Foks, а как быть с тем что на СИ нельзя обьявлять переменные типа byte? Нужно подавать двоичные данные а не десятичные
Шуруп забитый молотком держится намного лучше чем гвоздь закрученный отверткой!
Аватара пользователя
radiokot__
Мучитель микросхем
Сообщения: 454
Зарегистрирован: Вс янв 15, 2012 19:58:40

Re: Дисплеи от мобильных телефонов- осцилограммы работы

Сообщение radiokot__ »

Зукс писал(а):radiokot__, это СИ или Паскаль?

Это СИ.
Вам под какой микроконтроллер нужно?
И под какой компилятор?
С этими дисплеями LPH9157-2 я делал разные штучки, достойный дисплей.
Яркий, цвета нассыщеные, и шустрый.
Ни один домашний кот незнает что он домашний.
Аватара пользователя
Зукс
Вымогатель припоя
Сообщения: 564
Зарегистрирован: Чт июл 21, 2011 19:56:10

Re: Дисплеи от мобильных телефонов- осцилограммы работы

Сообщение Зукс »

контроллер Atmega8 пишу в AVR Studio 5.
Почему я пишу

Код: Выделить всё

LCD_RS = 0;
А оно мне выдает ошибку в этой строке:

Код: Выделить всё

expected ';' before numeric constant
?
Шуруп забитый молотком держится намного лучше чем гвоздь закрученный отверткой!
Аватара пользователя
da-nie
Говорящий с текстолитом
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.
Контактная информация:

Re: Дисплеи от мобильных телефонов- осцилограммы работы

Сообщение da-nie »

Сколько смотрю и понять немогу откуда берутся 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

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//настройки контактов LCD-экрана
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//линия ChipSelect
#define LCD_PORT_CS    PORTC
#define LCD_DDR_CS     DDRC
#define LCD_CS         0
//линия Reset
#define LCD_PORT_RESET PORTC
#define LCD_DDR_RESET  DDRC
#define LCD_RESET      1
//линия команда/данные
#define LCD_PORT_RS    PORTC
#define LCD_DDR_RS     DDRC
#define LCD_RS         2
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//базовые цвета LCD-экрана
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#define LCD_RED     0xF800
#define LCD_GREEN   0x07E0
#define LCD_BLUE    0x001F
#define LCD_BLACK   0x0000
#define LCD_WHITE   0xFFFF
#define LCD_YELLOW  0xFFE0
#define LCD_CYAN    0x07FF
#define LCD_MAGENTA 0xF81F
#define LCD_BLACK   0x0000
//----------
//глобальные переменные
//----------

//----------
//прототипы функций
//----------
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. Если, конечно, речь шла о Си. :)
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Аватара пользователя
Зукс
Вымогатель припоя
Сообщения: 564
Зарегистрирован: Чт июл 21, 2011 19:56:10

Re: Дисплеи от мобильных телефонов- осцилограммы работы

Сообщение Зукс »

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);
}


как осуществить стирание экрана?
Шуруп забитый молотком держится намного лучше чем гвоздь закрученный отверткой!
Foks
Поставщик валерьянки для Кота
Сообщения: 2108
Зарегистрирован: Пт авг 29, 2008 16:28:19
Откуда: Киев

Re: Дисплеи от мобильных телефонов- осцилограммы работы

Сообщение Foks »

Зукс, рановато Вам за дисплей браться. Типа данных byte в Си нету и в Си++ кстати тоже. Есть типы char и unsigned char.
Giggity giggity goo!
Аватара пользователя
da-nie
Говорящий с текстолитом
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.
Контактная информация:

Re: Дисплеи от мобильных телефонов- осцилограммы работы

Сообщение da-nie »

da-nie, спасибо огромное за код только я немогу понять почему допустим при прорисовке прямоугольника указываются координаты но не указывается цвет (и как его указывать?) и почему при выводе одного пикселя наоборот указывается только цвет но не указываются координаты??? Как задать текущий цвет и текущие координаты? Что значит функция послать по


Потому что эта команда задаёт прямоугольник в который будет осуществляться вывод цветов. Она его не закрашивает, а только задаёт и инициализирует начальные координаты вывода цветов. После этого каждая команда поставить точку определённого цвета ставит эту точку в этот прямоугольник по текущим координатам вывода, которые изменяются с каждой новой поставленной точкой. Проще говоря, вы сканируете этот прямоугольник и указываете для каждой его точки цвет. Вот и всё.

SPI-данные???


Да, дисплей должен быть подключён к линиям MOSI и SCK.


И еще... я так понял в этой программе используется только три вывода на дисплей с порта "С"? Почему так?


Потому что этому дисплею требуются линии:

1) CS - Chip Select - "выбор кристалла" - при низком уровне (т.е. при нуле) дисплей понимает, что сейчас будут работать с ним.
2) RS - эта линия определяет передаются ли данные или команды. Если на ней высокий уровень (т.е. 1), то передаются данные, если низкий (т.е. 0), то передаются команды.
3) Reset - линия сброса - низкий уровень осуществляет сброс дисплея.

Вы можете эти линии подключить на любые свободные порты (кроме SPI, конечно; к SPI подключаются другие линии).

Вот как можно подключить этот дисплей:

Изображение

В большом разрешении:
lcd.GIF
(45.61 КБ) 400 скачиваний


Диоды там практически любые (только не Шоттки!), микросхемы стабилизаторов 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
Вложения
lcd-mini.GIF
(13.68 КБ) 3644 скачивания
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Аватара пользователя
Зукс
Вымогатель припоя
Сообщения: 564
Зарегистрирован: Чт июл 21, 2011 19:56:10

Re: Дисплеи от мобильных телефонов- осцилограммы работы

Сообщение Зукс »

da-nie, при пошаговой симуляции дохожу до функции SPI_SendData и в строке while(!(SPSR&(1<<SPIF))); происходит бесконечное зацикливание и курсор дальше не двигается. Жал кнопку "step into" либо "Step over" раз 50, думал может цикл длинный но дальше не двигается. И дисплей кстати не запустился
Шуруп забитый молотком держится намного лучше чем гвоздь закрученный отверткой!
Ответить

Вернуться в «Периферия»