Дисплеи от мобильных телефонов- осцилограммы работы
- da-nie
- Говорящий с текстолитом
- Сообщения: 1590
- Зарегистрирован: Вс июн 24, 2012 16:07:00
- Откуда: Лен.Обл.
- Контактная информация:
Re: Дисплеи от мобильных телефонов- осцилограммы работы
Тут когда-то спрашивали про команды lph9157-2. Насколько я видел в инете на easyelectronik, его система команд совпадает с ILI9163 (http://www.allshore.com/pdf/ILITEK_ILI9163.pdf).
Отдали мне ещё один дисплей от Siemens C75, но он почему-то не на зелёном текстолите. Работает ли он со стандартными командами не знаю, так как дисплей, возможно, не рабочий (телефон упал и больше не включился; поэтому-то мне дисплей и не отдали).
А фото вот какое:
Отдали мне ещё один дисплей от Siemens C75, но он почему-то не на зелёном текстолите. Работает ли он со стандартными командами не знаю, так как дисплей, возможно, не рабочий (телефон упал и больше не включился; поэтому-то мне дисплей и не отдали).
А фото вот какое:
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Мои программки: 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: Дисплеи от мобильных телефонов- осцилограммы работы
Дисплей с желтым текстолитом совсем другой. Это не LPH9157-2, и он с ним ничего общего не имеет.
А у зеленого всё-равно команды не совсем совпадают с ILI9163. Подобная система команд используется в разных дисплеях разных производителей - я находил десятки даташитов с похожими командами, но ни один не совпал точно. Некоторые уточненные команды есть в моём длинном сообщении кажется около 8 страницы темы.
А у зеленого всё-равно команды не совсем совпадают с ILI9163. Подобная система команд используется в разных дисплеях разных производителей - я находил десятки даташитов с похожими командами, но ни один не совпал точно. Некоторые уточненные команды есть в моём длинном сообщении кажется около 8 страницы темы.
Giggity giggity goo!
Re: Дисплеи от мобильных телефонов- осцилограммы работы
Дисплей на желтом текстолите запущен здесь
- da-nie
- Говорящий с текстолитом
- Сообщения: 1590
- Зарегистрирован: Вс июн 24, 2012 16:07:00
- Откуда: Лен.Обл.
- Контактная информация:
Re: Дисплеи от мобильных телефонов- осцилограммы работы
О! Спасибо! А то я никак не могу найти на него даже названия.
Зелёный-то у меня работает сходу, а вот этот буду пробовать оживить.
Распайка, вроде, совпадает с зелёным. Хорошо.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Мои программки: 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: Дисплеи от мобильных телефонов- осцилограммы работы
Вот ещё есть про дисплеи с исходниками: 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
Мои программки: 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: Дисплеи от мобильных телефонов- осцилограммы работы
Ну, вот программа для работы с дисплеем от 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
Мои программки: 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: Дисплеи от мобильных телефонов- осцилограммы работы
misha274 писал(а):Всем мяу, ребят, а вот с таким диспом никто не сталькивался? (37 pin)
двух симочный китаяцс наружи написано Nokia, под аккумом S538 и все, даже распи не могу найти.
Контроллер какой? Они разные бывают.

Re: Дисплеи от мобильных телефонов- осцилограммы работы
Сколько смотрю и понять немогу откуда берутся LCD_Clk,LCD_Data,LCD_RS,LCD_CS,LCD_Reset и куда запихиваются? По программе мне восновном все понятно но не понятно как управлять этими выходами
Вот допустим кусок программы где напрямую подаются сигналы на отдельные выходы экрана:
Ябы мог допустим забить на это и написать отдельно типа выход на порт но порт то один а тут на каждый вывод отдельно посылаются сигналы. Как это осуществить? У меня дисплей LPH9157-2, программирую на СИ (я начинающий такчто сильно не пинайте)
Обьясните пожалуйста чтоб было понятно. Вот сама программа взята с этой темы:
Вот допустим кусок программы где напрямую подаются сигналы на отдельные выходы экрана:
Код: Выделить всё
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: Дисплеи от мобильных телефонов- осцилограммы работы
Например я делаю так
Ну и конечно эти порты надо настроить на выход
Код: Выделить всё
#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;
Ни один домашний кот незнает что он домашний.
Re: Дисплеи от мобильных телефонов- осцилограммы работы
radiokot__, это СИ или Паскаль?
Шуруп забитый молотком держится намного лучше чем гвоздь закрученный отверткой!
Re: Дисплеи от мобильных телефонов- осцилограммы работы
Ну какой может быть Си, если :=
-
Foks
- Поставщик валерьянки для Кота
- Сообщения: 2108
- Зарегистрирован: Пт авг 29, 2008 16:28:19
- Откуда: Киев
Re: Дисплеи от мобильных телефонов- осцилограммы работы
В Си надо использовать логические выражения
PORTB |= 1<<2 ; единицу на ножку 2 порта B
PORTB |= 1<<6 ; единицу на ножку 6 порта B
PORTB |= 1<<0 ; единицу на ножку 0 порта B
PORTB &= ~(1<<2) ; нуль на ножку 2 порта B
PORTB |= 1<<2 ; единицу на ножку 2 порта B
PORTB |= 1<<6 ; единицу на ножку 6 порта B
PORTB |= 1<<0 ; единицу на ножку 0 порта B
PORTB &= ~(1<<2) ; нуль на ножку 2 порта B
Giggity giggity goo!
Re: Дисплеи от мобильных телефонов- осцилограммы работы
Спасибо Foks, а как быть с тем что на СИ нельзя обьявлять переменные типа byte? Нужно подавать двоичные данные а не десятичные
Шуруп забитый молотком держится намного лучше чем гвоздь закрученный отверткой!
- radiokot__
- Мучитель микросхем
- Сообщения: 454
- Зарегистрирован: Вс янв 15, 2012 19:58:40
Re: Дисплеи от мобильных телефонов- осцилограммы работы
Зукс писал(а):radiokot__, это СИ или Паскаль?
Это СИ.
Вам под какой микроконтроллер нужно?
И под какой компилятор?
С этими дисплеями LPH9157-2 я делал разные штучки, достойный дисплей.
Яркий, цвета нассыщеные, и шустрый.
Ни один домашний кот незнает что он домашний.
Re: Дисплеи от мобильных телефонов- осцилограммы работы
контроллер Atmega8 пишу в AVR Studio 5.
Почему я пишу А оно мне выдает ошибку в этой строке: ?
Почему я пишу
Код: Выделить всё
LCD_RS = 0;Код: Выделить всё
expected ';' before numeric constantШуруп забитый молотком держится намного лучше чем гвоздь закрученный отверткой!
- da-nie
- Говорящий с текстолитом
- Сообщения: 1590
- Зарегистрирован: Вс июн 24, 2012 16:07:00
- Откуда: Лен.Обл.
- Контактная информация:
Re: Дисплеи от мобильных телефонов- осцилограммы работы
Сколько смотрю и понять немогу откуда берутся 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
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
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: Дисплеи от мобильных телефонов- осцилограммы работы
Зукс, рановато Вам за дисплей браться. Типа данных byte в Си нету и в Си++ кстати тоже. Есть типы char и unsigned char.
Giggity giggity goo!
- da-nie
- Говорящий с текстолитом
- Сообщения: 1590
- Зарегистрирован: Вс июн 24, 2012 16:07:00
- Откуда: Лен.Обл.
- Контактная информация:
Re: Дисплеи от мобильных телефонов- осцилограммы работы
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
- Вложения
-
- 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
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Re: Дисплеи от мобильных телефонов- осцилограммы работы
da-nie, при пошаговой симуляции дохожу до функции SPI_SendData и в строке while(!(SPSR&(1<<SPIF))); происходит бесконечное зацикливание и курсор дальше не двигается. Жал кнопку "step into" либо "Step over" раз 50, думал может цикл длинный но дальше не двигается. И дисплей кстати не запустился
Шуруп забитый молотком держится намного лучше чем гвоздь закрученный отверткой!