Помогите с дисплеем LPH9157-2 от Сименс С75
- Войдите на сайт для отправки комментариев
Ср, 30/04/2014 - 00:50
Помогите подключить LPH9157-2 к Arduino Uno R3. Ардуину юзаю только неделю, в программировании слабоват. По ссылке http://cxem.net/mc/mc221.php есть схема подключения и библиотеки а что с ними делать в ArduinoIDE и как прописать строку инициализации никак не пойму.
Мне хотябы простой пример скетча с подключенной либой с выводом "Привет мир!" или т.п., дальше я надеюсь, разберусь... Может возможно использовать либу UTFT? Нужно ли для Дуины Уно согласовывать сигнал? Ещё раз повторюсь я в AVR новичок, так что сильно не пинайте:)
Заранее СПАСИБО!
Desert2000, это задача не для новичка. Тренируйтесь на чём нибудь попроще.
Я понимаю, но всё нужно делать в первый раз когда нибудь. Я думаю для людей знающих написать один скетч не составит труда, тем более что я дал ссылку на библиотеки. А по скетчу, путём проб и ошибок буду пробовать что-либо изменить и смотреть на результат на экране. Человек так устроен, что практическую информацию воспринимает лучше.
Так бы и сказали "Мне лень вникать в програмирование и искать, ктонибудь дайте либу на дисплей, бесплатно и поскорее!!!"
Да либу я скачал, я же давал ссылку. А вот к каким пинам по этой либе к дуньке подключатся и как инициализировать дисп я, увы, не знаю. Вот и прошу помощи. Я не силён в С++. Если не можите помочь, буду пробовать искать на других форумах с более лаяльными и отзывчатыми людьми...
Видимо на этом форуме только критики, а людей, которые могут реально помочь, нет. Сколько тем перелопатил везде только критика.
//--------Библиотека дисплея Siemens C75, МЕ75--------- // Зеленый текстолит LPH9157-2 // 132х176 пикселей // ==== Кизим Игорь ==== //----------------------------------------------------- #include #include "Symbols.h" //#define _8_BIT_COLOR //Если закомментировано - 16-ти битный цвет #define _GEOMETRICAL //Использование функций вывода геометрических фигур //=============================================================== // Назначение выводов порта //=============================================================== #define LCD_CS PORTA.0 //Выбор чипа #define LCD_RESET PORTA.1 //Сброс #define LCD_RS PORTA.2 //CD - тип передаваемых данных #define LCD_CLK PORTA.3 //Синхронизация #define LCD_DATA PORTA.4 //Данные //************************************************************* //Команда/Данные #define CMD 0 #define DAT 1 char RS_old; //=============================================================== // Определение цветов //=============================================================== #ifdef _8_BIT_COLOR //8-ми битовая цветовая палитра (256 цветов) #define GREEN 0x1C #define DARK_GREEN 0x15 #define RED 0xE0 #define BLUE 0x1F #define DARK_BLUE 0x03 #define YELLOW 0xFC #define ORANGE 0xEC #define VIOLET 0xE3 #define WHITE 0xFF #define BLAGK 0x00 #define GREY 0x6D #else //16-ти битовая цветовая палитра (65536 цветов) #define BLACK 0x0000 #define WHITE 0xFFFF #define GRAY 0xE79C #define GREEN 0x07E0 #define BLUE 0x001F #define RED 0xF800 #define SKY 0x5d1c #define YELLOW 0xffe0 #define MAGENTA 0xf81f #define CYAN 0x07ff #define ORANGE 0xfca0 #define PINK 0xF97F #define BROWN 0x8200 #define VIOLET 0x9199 #define SILVER 0xa510 #define GOLD 0xa508 #define BEGH 0xf77b #define NAVY 0x000F #define DARK_GREEN 0x03E0 #define DARK_CYAN 0x03EF #define MAROON 0x7800 #define PURPLE 0x780F #define OLIVE 0x7BE0 #define LIGHT_GREY 0xC618 #define DARK_GREY 0x7BEF #endif //************************************************************* //ПРОТОТИПЫ ФУНКЦИЙ void LCD_init (void); void Send_to_lcd (unsigned char RS, unsigned char data); void SetArea (char x1, char x2, char y1, char y2); void Put_Pixel (char x, char y, unsigned int color); void Send_Symbol (unsigned char symbol, char x, char y, int t_color, int b_color, char zoom_width, char zoom_height, int rot); void LCD_Putchar (char symbol, char x, char y, int t_color, int b_color, char zoom_width, char zoom_height, int rot); void LCD_Puts(char *str, int x, int y, int t_color, int b_color, char zoom_width, char zoom_height, int rot); void LCD_Putsf(flash char *str, int x, int y, int t_color, int b_color, char zoom_width, char zoom_height, int rot); void Send_Symbol_Shadow (unsigned char symbol, char x, char y, int t_color, char zoom_width, char zoom_height, int rot); void LCD_Putchar_Shadow (char symbol, char x, char y, int t_color, char zoom_width, char zoom_height, int rot); void LCD_Puts_Shadow (char *str, int x, int y, int t_color, char zoom_width, char zoom_height, int rot); void LCD_Putsf_Shadow (flash char *str, int x, int y, int t_color, char zoom_width, char zoom_height, int rot); void LCD_FillScreen (unsigned int color); void LCD_Output_image (char x, char y, char width, char height, flash char *img, int rot); void Send_Image (char x, char y, char width, char height, flash char *img, int rot); #ifdef _GEOMETRICAL void LCD_DrawLine (char x1, char y1, char x2, char y2, int color); void LCD_DrawRect (char x1, char y1, char width, char height, char size, int color); void LCD_FillRect (char x1, char y1, char width, char height, int color); void LCD_DrawCircle (char xcenter, char ycenter, char rad, int color); void LCD_FillCircle (char xcenter, char ycenter, char rad, int color); void LCD_DrawTriangle (char x1, char y1, char x2, char y2, char x3, char y3, int color); void LCD_FillTriangle (char x1, char y1, char x2, char y2, char x3, char y3, int color); void LCD_FillTriangleA (char x1, char y1, char x2, char y2, char x3, char y3, int color); #endif //=============================================================== // ИНИЦИАЛИЗАЦИЯ //=============================================================== void LCD_init(void) { LCD_RESET = 0; delay_ms(500); LCD_RESET = 1; delay_ms(500); Send_to_lcd(CMD, 0x01); //Программный сброс Send_to_lcd(CMD, 0x36); //Memory Access Control (Направление заполнения области дисплея (памяти): 0bVHRXXXXX, V - заполнение по вертикали (0 - сверху-вниз, 1 - снизу-вверх), //H - заполнение по горизонтали (0 - слева-направо, 1 - справа-налево), R - меняются местами строки и столбцы (при этом заполнение остается сверху-вниз, слева-направо)) Send_to_lcd(DAT, 0x00); Send_to_lcd(CMD, 0x11); //Выход из спящего режима delay_ms(20); Send_to_lcd(CMD, 0x3a); //Установка цветовой палитры #ifdef _8_BIT_COLOR Send_to_lcd(DAT, 0x02); //Байт на пиксель 256 цветов #else Send_to_lcd(DAT, 0x05); //Два байта на пиксель 65536 цветов #endif delay_ms(20); Send_to_lcd(CMD, 0x29); //Включение дисплея } //=============================================================== //Функция записи команды/данных в LCD (RS==0 - команда, RS==1 - данные) //=============================================================== void Send_to_lcd (unsigned char RS, unsigned char data) { //unsigned char count; LCD_CLK = 0; LCD_DATA = 0; if ((RS_old != RS) || (!RS_old && !RS)) //проверяем старое значение RS (если поступают одни команды то дергаем CS) { LCD_CS=1; // Установка CS LCD_RS=RS; LCD_CS=0; // Сброс CS } //****************************************************************************** //Такой цикл обеспечивает более компактный код при записи байта в дисплей //****************************************************************************** /* for (count = 0; count < 8; count++) //Цикл передачи данных { if(data&0x80) LCD_DATA=1; else LCD_DATA=0; LCD_CLK=1; data <<= 1; LCD_CLK=0; } */ //****************************************************************************** //Такой прямой код (без цикла) обеспечивает более быструю запись байта в дисплей //****************************************************************************** LCD_DATA = 0; if ((data & 128) == 128) LCD_DATA = 1; LCD_CLK=1; LCD_CLK=0; LCD_DATA = 0; if ((data & 64) == 64) LCD_DATA = 1; LCD_CLK=1; LCD_CLK=0; LCD_DATA = 0; if ((data & 32) == 32) LCD_DATA = 1; LCD_CLK=1; LCD_CLK=0; LCD_DATA = 0; if ((data & 16) ==16) LCD_DATA = 1; LCD_CLK=1; LCD_CLK=0; LCD_DATA = 0; if ((data & 8) == 8) LCD_DATA = 1; LCD_CLK=1; LCD_CLK=0; LCD_DATA = 0; if ((data & 4) == 4) LCD_DATA = 1; LCD_CLK=1; LCD_CLK=0; LCD_DATA = 0; if ((data & 2) == 2) LCD_DATA = 1; LCD_CLK=1; LCD_CLK=0; LCD_DATA = 0; if ((data & 1) == 1) LCD_DATA = 1; LCD_CLK=1; LCD_CLK=0; RS_old=RS; //запоминаю значение RS LCD_DATA = 0; } //=============================================================== // Задание прямоугольной области экрана //=============================================================== void SetArea(char x1, char x2, char y1, char y2) { Send_to_lcd( CMD, 0x2A ); //задаем область по X Send_to_lcd( DAT, x1 ); //начальная Send_to_lcd( DAT, x2 ); //конечная Send_to_lcd( CMD, 0x2B ); //задаем область по Y Send_to_lcd( DAT, y1 ); //начальная Send_to_lcd( DAT, y2 ); //конечная Send_to_lcd( CMD, 0x2C ); //отправляем команду на начало записи в память и начинаем посылать данные } //=============================================================== // Рисуем точку //=============================================================== void Put_Pixel (char x, char y, unsigned int color) { signed char i; SetArea( x, x, y, y ); LCD_RS = 1; #ifdef _8_BIT_COLOR //(8-ми битовая цветовая палитра (256 цветов)) Send_to_lcd( DAT, color ); //Данные - задаём цвет пикселя #else //(16-ти битовая цветовая палитра (65536 цветов)) Send_to_lcd( DAT, (color >> 8) ); Send_to_lcd( DAT, color ); #endif } //=============================================================== // Функция прорисовки символа на дисплее //=============================================================== void Send_Symbol (unsigned char symbol, char x, char y, int t_color, int b_color, char zoom_width, char zoom_height, int rot) { unsigned char temp_symbol, a, b, zw, zh, mask; if (symbol>127) symbol-=64; //Убираем отсутствующую часть таблицы ASCII for ( a = 0; a < 5; a++) //Перебираю 5 байт, составляющих символ { temp_symbol = font_5x8[symbol-32][a]; zw = 0; while(zw != zoom_width) //Вывод байта выполняется zw раз { mask=0x01; switch(rot) { case 0: case 180: SetArea( x+zw, x+zw, y, y+(zoom_height*8)-1 ); break; case 90: case 270: SetArea( x, x+(zoom_height*8)-1, y+zw, y+zw ); break; } LCD_RS = 1; //Передаются данные for ( b = 0; b < 8; b++ ) //Цикл перебирания 8 бит байта { zh = zoom_height; //в zoom_height раз увеличится высота символа while(zh != 0) //Вывод пикселя выполняется z раз { if (temp_symbol&mask) { #ifdef _8_BIT_COLOR //(8-ми битовая цветовая палитра (256 цветов)) Send_to_lcd( DAT, t_color ); //Данные - задаём цвет пикселя #else //(16-ти битовая цветовая палитра (65536 цветов)) Send_to_lcd( DAT, (t_color >> 8) ); Send_to_lcd( DAT, t_color ); #endif } else { #ifdef _8_BIT_COLOR //(8-ми битовая цветовая палитра (256 цветов)) Send_to_lcd( DAT, b_color ); //Данные - задаём цвет пикселя #else //(16-ти битовая цветовая палитра (65536 цветов)) Send_to_lcd( DAT, (b_color >> 8) ); Send_to_lcd( DAT, b_color ); #endif } zh--; } mask<<=1; //Смещаю содержимое mask на 1 бит влево; } zw++; } switch(rot) { case 0: case 180: x=x+zoom_width; break; //Получить адрес начального пикселя по оси x для вывода очередного байта case 90: case 270: y=y+zoom_width; break; //Получить адрес начального пикселя по оси y для вывода очередного байта } } } //=============================================================== // Функция вывода одного символа ASCII-кода (из файла Symbols.h) //=============================================================== void LCD_Putchar(char symbol, char x, char y, int t_color, int b_color, char zoom_width, char zoom_height, int rot) { unsigned char m; if(zoom_width == 0) zoom_width = 1; if(zoom_height == 0) zoom_height = 1; switch (rot) { case 0: //Начальный адрес осей Х и У - левый верхний угол дисплея Send_Symbol( symbol, x, y, t_color, b_color, zoom_width, zoom_height, rot); break; //================================ case 90: m=y; y=x; x=m; Send_to_lcd(CMD, 0x36); Send_to_lcd(DAT, 0x40); //Начальный адрес осей Х и У - правый верхний угол дисплея Send_Symbol( symbol, x, y, t_color, b_color, zoom_width, zoom_height, rot); Send_to_lcd(CMD, 0x36); Send_to_lcd(DAT, 0x00); break; //================================ case 180: Send_to_lcd(CMD, 0x36); Send_to_lcd(DAT, 0xC0); //Начальный адрес осей Х и У - правый нижний угол дисплея Send_Symbol( symbol, x, y, t_color, b_color, zoom_width, zoom_height, rot); Send_to_lcd(CMD, 0x36); Send_to_lcd(DAT, 0x00); break; //================================ case 270: m=y; y=x; x=m; Send_to_lcd(CMD, 0x36); Send_to_lcd(DAT, 0x80); //Начальный адрес осей Х и У - левый нижний угол дисплея Send_Symbol( symbol, x, y, t_color, b_color, zoom_width, zoom_height, rot); Send_to_lcd(CMD, 0x36); Send_to_lcd(DAT, 0x00); break; //================================ default: Send_to_lcd(CMD, 0x36); Send_to_lcd(DAT, 0x00); //Начальный адрес осей Х и У - левый верхний угол дисплея Send_Symbol( symbol, x, y, t_color, b_color, zoom_width, zoom_height, rot); Send_to_lcd(CMD, 0x36); Send_to_lcd(DAT, 0x00); //================================= }; } //=============================================================== // Функция вывода строки, расположенной в ram //=============================================================== void LCD_Puts(char *str, int x, int y, int t_color, int b_color, char zoom_width, char zoom_height, int rot) { unsigned char i=0; if(zoom_width == 0) zoom_width = 1; if(zoom_height == 0) zoom_height = 1; while (str[i]) //x и y - адрес пикселя начальной позиции; с увеличением переменной i адрес вывода очередного символа смещается на i*6 (чем организуются столбцы дисплея) { LCD_Putchar(str[i], x+(i*6*zoom_width), y, t_color, b_color, zoom_width, zoom_height, rot); i++; } } //=============================================================== // Функция вывода строки, расположенной во flash //=============================================================== void LCD_Putsf(flash char *str, int x, int y, int t_color, int b_color, char zoom_width, char zoom_height, int rot) { unsigned char i=0; if(zoom_width == 0) zoom_width = 1; if(zoom_height == 0) zoom_height = 1; while (str[i]) //x и y - адрес пикселя начальной позиции; с увеличением переменной i адрес вывода очередного символа смещается на i*6 (чем организуются столбцы дисплея) { LCD_Putchar(str[i], x+(i*6*zoom_width), y, t_color, b_color, zoom_width, zoom_height, rot); i++; } } //=============================================================== // Функция прорисовки символа на дисплее без цвета фона //=============================================================== void Send_Symbol_Shadow (unsigned char symbol, char x, char y, int t_color, char zoom_width, char zoom_height, int rot) { unsigned char temp_symbol, a, b, zw, zh, mask; char m, n; m=x; n=y; if (symbol>127) symbol-=64; //Убираем отсутствующую часть таблицы ASCII for ( a = 0; a < 5; a++) //Перебираю 5 байт, составляющих символ { temp_symbol = font_5x8[symbol-32][a]; zw = 0; while(zw != zoom_width) //Вывод байта выполняется zw раз { switch(rot) { case 0: case 180: n=y; break; case 90: case 270: m=x; break; } mask=0x01; for ( b = 0; b < 8; b++ ) //Цикл перебирания 8 бит байта { zh = 0; //в zoom_height раз увеличится высота символа while(zh != zoom_height) //Вывод пикселя выполняется z раз { switch(rot) { case 0: case 180: if (temp_symbol&mask) { Put_Pixel (m+zw, n+zh, t_color); } break; case 90: case 270: if (temp_symbol&mask) { Put_Pixel (m+zh, n+zw, t_color); } break; //Получить адрес начального пикселя по оси y для вывода очередного байта } zh++; } mask<<=1; //Смещаю содержимое mask на 1 бит влево; switch(rot) { case 0: case 180: n=n+zoom_height; break; case 90: case 270: m=m+zoom_height; break; } } zw++; } switch(rot) { case 0: case 180: m=m+zoom_width; break; case 90: case 270: n=n+zoom_width; break; } } } //=============================================================== // Функция вывода одного символа ASCII-кода без цвета фона //=============================================================== void LCD_Putchar_Shadow (char symbol, char x, char y, int t_color, char zoom_width, char zoom_height, int rot) { unsigned char m; if(zoom_width == 0) zoom_width = 1; if(zoom_height == 0) zoom_height = 1; switch (rot) { case 0: //Начальный адрес осей Х и У - левый верхний угол дисплея Send_Symbol_Shadow( symbol, x, y, t_color, zoom_width, zoom_height, rot); break; //================================ case 90: m=y; y=x; x=m; Send_to_lcd(CMD, 0x36); Send_to_lcd(DAT, 0x40); //Начальный адрес осей Х и У - правый верхний угол дисплея Send_Symbol_Shadow( symbol, x, y, t_color, zoom_width, zoom_height, rot); Send_to_lcd(CMD, 0x36); Send_to_lcd(DAT, 0x00); break; //================================ case 180: Send_to_lcd(CMD, 0x36); Send_to_lcd(DAT, 0xC0); //Начальный адрес осей Х и У - правый нижний угол дисплея Send_Symbol_Shadow( symbol, x, y, t_color, zoom_width, zoom_height, rot); Send_to_lcd(CMD, 0x36); Send_to_lcd(DAT, 0x00); break; //================================ case 270: m=y; y=x; x=m; Send_to_lcd(CMD, 0x36); Send_to_lcd(DAT, 0x80); //Начальный адрес осей Х и У - левый нижний угол дисплея Send_Symbol_Shadow( symbol, x, y, t_color, zoom_width, zoom_height, rot); Send_to_lcd(CMD, 0x36); Send_to_lcd(DAT, 0x00); break; //================================ default: Send_to_lcd(CMD, 0x36); Send_to_lcd(DAT, 0x00); //Начальный адрес осей Х и У - левый верхний угол дисплея Send_Symbol_Shadow( symbol, x, y, t_color, zoom_width, zoom_height, rot); Send_to_lcd(CMD, 0x36); Send_to_lcd(DAT, 0x00); //================================= }; } //=============================================================== // Функция вывода строки, расположенной в ram без цвета фона //=============================================================== void LCD_Puts_Shadow(char *str, int x, int y, int t_color, char zoom_width, char zoom_height, int rot) { unsigned char i=0; if(zoom_width == 0) zoom_width = 1; if(zoom_height == 0) zoom_height = 1; while (str[i]) //x и y - адрес пикселя начальной позиции; с увеличением переменной i адрес вывода очередного символа смещается на i*6 (чем организуются столбцы дисплея) { LCD_Putchar_Shadow(str[i], x+(i*6*zoom_width), y, t_color, zoom_width, zoom_height, rot); i++; } } //=============================================================== // Функция вывода строки, расположенной во flash без цвета фона //=============================================================== void LCD_Putsf_Shadow(flash char *str, int x, int y, int t_color, char zoom_width, char zoom_height, int rot) { unsigned char i=0; if(zoom_width == 0) zoom_width = 1; if(zoom_height == 0) zoom_height = 1; while (str[i]) { LCD_Putchar_Shadow(str[i], x+(i*6*zoom_width), y, t_color, zoom_width, zoom_height, rot); i++; } } //=============================================================== // ЗАЛИВКА ЭКРАНА ЦВЕТОМ //=============================================================== void LCD_FillScreen (unsigned int color) { unsigned int x; signed char i; SetArea( 0, 131, 0, 175 ); //Область всего экрана LCD_RS = 1; //Данные - задаём цвет пикселя for (x = 0; x < 23232; x++) // 23232 - это 132 * 176 { #ifdef _8_BIT_COLOR //(8-ми битовая цветовая палитра (256 цветов)) Send_to_lcd( DAT, color ); //Данные - задаём цвет пикселя #else //(16-ти битовая цветовая палитра (65536 цветов)) Send_to_lcd( DAT, (color >> 8) ); Send_to_lcd( DAT, color ); #endif } } //=============================================================== // ФУНКЦИЯ ВЫВОДА ИЗОБРАЖЕНИЯ //=============================================================== void LCD_Output_image (char x, char y, char width, char height, flash char *img, int rot) { unsigned char m; switch (rot) { case 0: Send_Image (x, y, width, height, img, rot); break; //================================ case 90: m=y; y=x; x=m; Send_to_lcd(CMD, 0x36); Send_to_lcd(DAT, 0x40); //Начальный адрес осей Х и У - правый верхний угол дисплея Send_Image (x, y, width, height, img, rot); Send_to_lcd(CMD, 0x36); Send_to_lcd(DAT, 0x00); break; //================================ case 180: Send_to_lcd(CMD, 0x36); Send_to_lcd(DAT, 0xC0); //Начальный адрес осей Х и У - правый нижний угол дисплея Send_Image (x, y, width, height, img, rot); Send_to_lcd(CMD, 0x36); Send_to_lcd(DAT, 0x00); break; //================================ case 270: m=y; y=x; x=m; Send_to_lcd(CMD, 0x36); Send_to_lcd(DAT, 0x80); //Начальный адрес осей Х и У - левый нижний угол дисплея Send_Image (x, y, width, height, img, rot); Send_to_lcd(CMD, 0x36); Send_to_lcd(DAT, 0x00); break; //================================ default: Send_to_lcd(CMD, 0x36); Send_to_lcd(DAT, 0x00); //Начальный адрес осей Х и У - левый верхний угол дисплея Send_Image (x, y, width, height, img, rot); Send_to_lcd(CMD, 0x36); Send_to_lcd(DAT, 0x00); //================================= }; } //=============================================================== // Функция для обеспечения вывода изображения //=============================================================== //Вывод картинки с Image2Lcd и NokiaImageCreator должен выполняться слева-направо сверху-вниз. //x, y - начало области вывода изображения; width и height - ширина и высота изображения void Send_Image (char x, char y, char width, char height, flash char *img, int rot) { char x1, y1; switch (rot) { case 0: case 180: for(y1=y; y1<(y+height); y1++) { SetArea( x, x+(width-1), y1, y1 ); for(x1=x; x1> 8) ); Send_to_lcd( DAT, color ); #endif } } //=============================================================== // НАРИСОВАТЬ ОКРУЖНОСТЬ //=============================================================== void LCD_DrawCircle (char xcenter, char ycenter, char rad, int color) { signed char tswitch, x1=0, y1; char d; d = ycenter - xcenter; y1 = rad; tswitch = 3 - 2 * rad; while (x1 <= y1) { Put_Pixel(xcenter + x1, ycenter + y1, color); Put_Pixel(xcenter + x1, ycenter - y1, color); Put_Pixel(xcenter - x1, ycenter + y1, color); Put_Pixel(xcenter - x1, ycenter - y1, color); Put_Pixel(ycenter + y1 - d, ycenter + x1, color); Put_Pixel(ycenter + y1 - d, ycenter - x1, color); Put_Pixel(ycenter - y1 - d, ycenter + x1, color); Put_Pixel(ycenter - y1 - d, ycenter - x1, color); if (tswitch < 0) tswitch += (4 * x1 + 6); else { tswitch += (4 * (x1 - y1) + 10); y1--; } x1++; } } //=============================================================== // ЗАПОЛНИТЬ КРУГ ЦВЕТОМ COLOR //=============================================================== void LCD_FillCircle (char xcenter, char ycenter, char rad, int color) { signed int x1=0, y1, tswitch; y1 = rad; tswitch = 1 - rad; do { LCD_DrawLine(xcenter-x1, ycenter+y1, xcenter+x1, ycenter+y1, color); LCD_DrawLine(xcenter-x1, ycenter-y1, xcenter+x1, ycenter-y1, color); LCD_DrawLine(xcenter-y1, ycenter+x1, xcenter+y1, ycenter+x1, color); LCD_DrawLine(xcenter-y1, ycenter-x1, xcenter+y1, ycenter-x1, color); if(tswitch < 0) tswitch+= 3 + 2*x1++; else tswitch+= 5 + 2*(x1++ - y1--); } while(x1 <= y1); } //=============================================================== // НАРИСОВАТЬ ТРЕУГОЛЬНИК //=============================================================== void LCD_DrawTriangle(char x1, char y1, char x2, char y2, char x3, char y3, int color) { LCD_DrawLine(x1, y1, x2, y2, color); LCD_DrawLine(x3, y3, x1, y1, color); LCD_DrawLine(x3, y3, x2, y2, color); } //=============================================================== // ЗАПОЛНИТЬ ТРЕУГОЛЬНИК ЦВЕТОМ COLOR //=============================================================== void LCD_FillTriangle(char x1, char y1, char x2, char y2, char x3, char y3, int color) { LCD_FillTriangleA(x1, y1, x2, y2, x3, y3, color); LCD_FillTriangleA(x3, y3, x1, y1, x2, y2, color); LCD_FillTriangleA(x3, y3, x2, y2, x1, y1, color); } //=============================================================== void LCD_FillTriangleA(char x1, char y1, char x2, char y2, char x3, char y3, int color) { signed long x, y, addx, dx, dy; signed long P; int i; long a1,a2,b1,b2; if(y1>y2) {b1=y2; b2=y1; a1=x2; a2=x1;} else {b1=y1; b2=y2; a1=x1; a2=x2;} dx = a2 -a1; dy = b2 - b1; if(dx<0)dx=-dx; if(dy<0)dy=-dy; x = a1; y = b1; if(a1 > a2) addx = -1; else addx = 1; if(dx >= dy) { P = 2*dy - dx; for(i=0; i<=dx; ++i) { LCD_DrawLine((int)x, (int)y, x3, y3, color); if(P < 0) { P += 2*dy; x += addx; } else { P += 2*dy - 2*dx; x += addx; y ++; } } } else { P = 2*dx - dy; for(i=0; i<=dy; ++i) { LCD_DrawLine((int)x, (int)y, x3, y3, color); if(P < 0) { P += 2*dx; y ++; } else { P += 2*dx - 2*dy; x += addx; y ++; } } } } //=============================================================== #endif +width;>Эта либа для AVR, а для ардуино ее нужн переписать на использование аппаратного SPI
- этот кусок станет лишним. 3 пина нужно сделать переменными, функции членами класса, номера пинов устанавливать в конструкторе класса - присваивать в переменные.
А конструкции LCD_CS = 0; заменить на digitalWrite(LCD_CS, LOW);
Отправку битов заменить на SPI.write(); - вместо цикла с LCD_CLK и LCD_DATA
Тоесть по сути переписать надо 2 функции:
В том то и дело, что мне и сравнить то не с чем. Была бы для сранения для AVR и для дуньки одна и таже либа, я бы посмотрел где что и как менять... А так я за год не разберусь
3 пина нужно сделать переменными, функции членами класса, номера пинов устанавливать в конструкторе класса - присваивать в переменные.
А конструкции LCD_CS = 0; заменить на digitalWrite(LCD_CS, LOW);
Отправку битов заменить на SPI.write(); - вместо цикла с LCD_CLK и LCD_DATA
Тоесть по сути переписать надо 2 функции:
хоть пару строчек примера... Дальше постараюсь разобраться
Я так понимаю, никто помочь не может....
- этот кусок станет лишним. 3 пина нужно сделать переменными, функции членами класса, номера пинов устанавливать в конструкторе класса - присваивать в переменные.
А конструкции LCD_CS = 0; заменить на digitalWrite(LCD_CS, LOW);
Отправку битов заменить на SPI.write(); - вместо цикла с LCD_CLK и LCD_DATA
Тоесть по сути переписать надо 2 функции:
Вот попробывал переписать. Завтра посмотрю результат, нужно уровни согласовать.
#include <SPI.h> //#define _8_BIT_COLOR //Если закомментировано - 16-ти битный цвет //=============================================================== // Назначение выводов порта //=============================================================== #define LCD_CS 10 //Выбор чипа #define LCD_RESET 8 //Сброс #define LCD_RS 9 //CD - тип передаваемых данных //#define LCD_CLK 13 //Синхронизация //#define LCD_DATA 11 //Данные //************************************************************* //Команда/Данные #define CMD 0 #define DAT 1 char RS_old; //=============================================================== // Определение цветов //=============================================================== #ifdef _8_BIT_COLOR //8-ми битовая цветовая палитра (256 цветов) #define GREEN 0x1C #define DARK_GREEN 0x15 #define RED 0xE0 #define BLUE 0x1F #define DARK_BLUE 0x03 #define YELLOW 0xFC #define ORANGE 0xEC #define VIOLET 0xE3 #define WHITE 0xFF #define BLAGK 0x00 #define GREY 0x6D #else //16-ти битовая цветовая палитра (65536 цветов) #define BLACK 0x0000 #define WHITE 0xFFFF #define GRAY 0xE79C #define GREEN 0x07E0 #define BLUE 0x001F #define RED 0xF800 #define SKY 0x5d1c #define YELLOW 0xffe0 #define MAGENTA 0xf81f #define CYAN 0x07ff #define ORANGE 0xfca0 #define PINK 0xF97F #define BROWN 0x8200 #define VIOLET 0x9199 #define SILVER 0xa510 #define GOLD 0xa508 #define BEGH 0xf77b #define NAVY 0x000F #define DARK_GREEN 0x03E0 #define DARK_CYAN 0x03EF #define MAROON 0x7800 #define PURPLE 0x780F #define OLIVE 0x7BE0 #define LIGHT_GREY 0xC618 #define DARK_GREY 0x7BEF #endif void setup() { pinMode(LCD_CS,OUTPUT); pinMode(LCD_RESET,OUTPUT); pinMode(LCD_RS,OUTPUT); Serial.begin(9600); } void loop () { void LCD_init(void ); } //=============================================================== //Функция записи команды/данных в LCD (RS==0 - команда, RS==1 - данные) //=============================================================== void Send_to_lcd (unsigned char RS, unsigned char data) { //unsigned char count; if (RS==0) { digitalWrite(LCD_RS,LOW); } else digitalWrite(LCD_RS,HIGH); if ((RS_old != RS) || (!RS_old && !RS)) //проверяем старое значение RS (если поступают одни команды то дергаем CS) { digitalWrite(LCD_CS,HIGH); // Установка CS RS_old=RS; if (RS==0) { digitalWrite(LCD_RS,LOW); } else digitalWrite(LCD_RS,HIGH); digitalWrite(LCD_CS,LOW); // Сброс CS } SPI.transfer(data); //****************************************************************************** //Такой цикл обеспечивает более компактный код при записи байта в дисплей //****************************************************************************** /* for (count = 0; count < 8; count++) //Цикл передачи данных { if(data&0x80) LCD_DATA=1; else LCD_DATA=0; LCD_CLK=1; data <<= 1; LCD_CLK=0; } */ //****************************************************************************** //Такой прямой код (без цикла) обеспечивает более быструю запись байта в дисплей //****************************************************************************** /*LCD_DATA = 0; if ((data & 128) == 128) LCD_DATA = 1; LCD_CLK=1; LCD_CLK=0; LCD_DATA = 0; if ((data & 64) == 64) LCD_DATA = 1; LCD_CLK=1; LCD_CLK=0; LCD_DATA = 0; if ((data & 32) == 32) LCD_DATA = 1; LCD_CLK=1; LCD_CLK=0; LCD_DATA = 0; if ((data & 16) ==16) LCD_DATA = 1; LCD_CLK=1; LCD_CLK=0; LCD_DATA = 0; if ((data & 8) == 8) LCD_DATA = 1; LCD_CLK=1; LCD_CLK=0; LCD_DATA = 0; if ((data & 4) == 4) LCD_DATA = 1; LCD_CLK=1; LCD_CLK=0; LCD_DATA = 0; if ((data & 2) == 2) LCD_DATA = 1; LCD_CLK=1; LCD_CLK=0; LCD_DATA = 0; if ((data & 1) == 1) LCD_DATA = 1; LCD_CLK=1; LCD_CLK=0; RS_old=RS; //запоминаю значение RS LCD_DATA = 0; */ } void LCD_init() { digitalWrite(LCD_RESET,LOW); delay(500); digitalWrite(LCD_RESET,HIGH); delay(500); Send_to_lcd(CMD, 0x01); //Программный сброс Send_to_lcd(CMD, 0x36); //Memory Access Control (Направление заполнения области дисплея (памяти): 0bVHRXXXXX, V - заполнение по вертикали (0 - сверху-вниз, 1 - снизу-вверх), //H - заполнение по горизонтали (0 - слева-направо, 1 - справа-налево), R - меняются местами строки и столбцы (при этом заполнение остается сверху-вниз, слева-направо)) Send_to_lcd(DAT, 0x00); Send_to_lcd(CMD, 0x11); //Выход из спящего режима delay(20); Send_to_lcd(CMD, 0x3a); //Установка цветовой палитры #ifdef _8_BIT_COLOR Send_to_lcd(DAT, 0x02); //Байт на пиксель 256 цветов #else Send_to_lcd(DAT, 0x05); //Два байта на пиксель 65536 цветов #endif delay(20); Send_to_lcd(CMD, 0x29); //Включение дисплея }получилось включит дисплей?
подыму старую тему...
расспаял по схеме дисплей от с75, подключил по указанным выше скетче пинам - дисплей горит только посветка.
залил данный скетч и при библиотеке указанной там результат на дисплее ноль.
по форумам пишут, что нужна библиотека под данный дисплей, но найти что то не могу....
у кого нибудь осталась библиотека на данный дисплей?
Привет,
Я нашел у себя подобный дисплей, и тоже хочу прикрутить его к ардуино, но это весьма проблемотично для начального уровня, о чем выше уже сказали. Сейчас у меня несколько доступных дисплеев и пока я продолжаю серфить в надежде найти готовую библиотеку. Если результата не будет я отложу до момента надобности и буду переписывать.
А пока если кому интересно ссылка http://cxem.net/mc/mc221.php на печатную плату и библиотеку.
Перепилить под ардуину оказалось делом получаса, но я маленько прифигел от медленности и повыкидывал все тормоза, что только можно выкинуть.
Мерцания есть из-за отсутствия промежуточного буфера в оперативке.
Пользуйтесь.
https://github.com/skadiexe/LPH9157-2-display-arduino-library
поскольку тут лички нет, кажется, отвечу так. Надеюсь, пользователю Damask придет уведомление