|
Lcd12864, Какие есть идеи...или пишем видеодрайвер... |
|
|
|
Nov 21 2006, 22:21
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(zorromen @ Nov 22 2006, 02:02)  Про ссылку не знал... а тайминги это для экрана 122х32? да Цитата(zorromen @ Nov 22 2006, 02:02)  для 128х64 пойдет?(не тайминги а программа без особых изменений) Так как команды, в принципе, одинаковые, то, человеку, хорошо знакомому с Си переделать под 128х64, ИМХО, большого труда не стоит. Кстати, на странице по ссылке выше, есть и безвозмездно(те даром)))) предлагаемый драйвер с описателями всех команд ЖКИ 122х32 на базе SED1520. Можете сравнить... Цитата(zorromen @ Nov 22 2006, 02:02)  мне чесно понравился размер!..но это без знакогенератора..ведь массив знаков место занимает немалое...это скока еще места... канечно спасибо за новые идеи...хотя и размер будет больше (у меня)...но это ведь внешний видеодрайвер...и можна подзавязку его заполнить всякими функциями... ИМХО лучше применить контроллер подешевле, а все константы хранить во внешней ЕЕПРОМе. Может быть М48 + 25256А или 45DBxxx Цитата(zorromen @ Nov 22 2006, 02:02)  странно у тебя очистка всего экрана занимает почти столько сколько и инвертирование всего экрана... Так как экран графический, в любом случае приходится считывать весь байт, потом накладывать маску поля, с которым мы работаем, потом производить модификацию (инверсия или закраска, какая разница?), потом возвращать модифицированный байт на место
--------------------
|
|
|
|
|
Nov 21 2006, 22:43
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(zorromen @ Nov 22 2006, 02:32)  Панятна...у тебя одна функция на очистку и на инверсию...но ведь на очистку целого экрана ненадо считывать байт...а просто записать 0х00, а это ведь экономия времени в 2 раза. Конечно. Можно написать отдельную функцию, которая будет очищать весь экран. Это тривиальная задача. Но если есть необходимость закрачить не весь экран а какую то область, заданную координатами? Для такой функции и даны тайминги. Функция имеет вид LCD_SetScreen(x1, x2, y1, y2, option), где x1,y1 - верхний левый угол в пикселах, x2,y2 - нижний правый, option - действие (закраска, очистка, инверсия). Кстати, здесь, на форуме, где то были исходники, не поленитесь, поищите. Но скроллинга и вывода графики там, по моему нет
--------------------
|
|
|
|
|
Nov 21 2006, 23:58
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(bodja74 @ Nov 22 2006, 03:32)  >>закрашиваемая или очищаемая область помещается в одной странице Тоесть влазит в 512байт ,тоесть в оперативку м8\м16,тоесть читать можно из РАМ а не из ЛСД. ЗЫ у МТ12864 две страницы. Значит так: в МТ12864 есть 8 (восемь) страниц  , а не две, распередленных поровну между двумя кристаллами. Один управляет левой стороной, другой - как вы догадались, правой. У каждого кристалла таким образом четыре страницы. Каждая страница шириной в 64 пиксела и высотой в 8, т.о. байты в одной странице размещены вертикально. Я написал свой драйвер так, что при желании его можно впихнуть даже в тини2313. ИМХО, использовать под ЖКИ 512 байт (для 122х32, для 128х64 - 1024 кБайт) расточительно, выйгрыш же по скорости (ИМХО) не значительный, поверьте - опыт есть)))
--------------------
|
|
|
|
|
Nov 22 2006, 00:33
|
Знающий
   
Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984

|
Цитата(prottoss @ Nov 21 2006, 23:58)  Значит так: в МТ12864 есть 8 (восемь) страниц  , а не две, распередленных поровну между двумя кристаллами. Один управляет левой стороной, другой - как вы догадались, правой. У каждого кристалла таким образом четыре страницы. Каждая страница шириной в 64 пиксела и высотой в 8, т.о. байты в одной странице размещены вертикально. Неа,то что вы называете левой\правой стороной -называется страницами А то что вы называете страницей,является строчкой. Даже если рассуждать логичеки ,оно так и есть. Цитата Я написал свой драйвер так, что при желании его можно впихнуть даже в тини2313. ИМХО, использовать под ЖКИ 512 байт (для 122х32, для 128х64 - 1024 кБайт) расточительно, выйгрыш же по скорости (ИМХО) не значительный, поверьте - опыт есть))) Согласен полностью,но подобное я к сожалению не смог применить для своего драйвера,мне нужно было принять данные по шине на приличной скорости не дожидаясь вывода на ЛСД,тоесть буфером служила РАМ.
|
|
|
|
|
Nov 22 2006, 01:21
|

Участник

Группа: Свой
Сообщений: 72
Регистрация: 27-06-06
Из: Msk
Пользователь №: 18 401

|
Порылся нашел алгоритмы для расования линий и окружностей что такое glcd_put_pixel(x, y, color); думаю понятно  (color != 0 - черная точка) Код /************************************************************************* Рисование 8-связной развертки отрезка методом Брэзенхема
Начало в точке (x1,y1), конец в (x2,y2) *************************************************************************/ void glcd_line(int x1, int y1, int x2, int y2,unsigned char color) { int x; int y; int dx; int dy; int sx; int sy; int z; int e; int i; bit ch;
x = x1; y = y1; dx = abs(x2-x1); dy = abs(y2-y1); sx = sign((double)(x2-x1)); sy = sign((double)(y2-y1)); if( dx==0&&dy==0 ) { glcd_put_pixel(x1, y1, color); return; } if( dy>dx ) { z = dx; dx = dy; dy = z; ch = true; } else { ch = false; } e = 2*dy-dx; i = 1; do { glcd_put_pixel(x, y, color); while(e>=0) { if( ch ) { x += sx; } else { y += sy; } e -= 2*dx; } if( ch ) { y += sy; } else { x += sx; } e += 2*dy; ++i; } while(i<=dx); glcd_put_pixel(x, y, color); }
/************************************************************************* Рисование развертки круга методом Брэзенхема
Центр в точке (xc, yc), радиус r. *************************************************************************/ void glcd_circle(int xc, int yc, int r,char color) { int x; int y; int d;
x = 0; y = r; d = 3-2*r; while(y>=x) { glcd_put_pixel((x+xc), (y+yc), color); glcd_put_pixel((x+xc), (-y+yc), color); glcd_put_pixel((-x+xc), (y+yc), color); glcd_put_pixel((-x+xc), (-y+yc), color); glcd_put_pixel((y+xc), (x+yc), color); glcd_put_pixel((y+xc), (-x+yc), color); glcd_put_pixel((-y+xc), (x+yc), color); glcd_put_pixel((-y+xc), (-x+yc), color); if( d<0 )d += 4*x+6; else{ d += 4*(x-y)+10; --y; } ++x; } }
|
|
|
|
|
Nov 22 2006, 01:30
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(vooon @ Nov 22 2006, 05:21)  Порылся нашел алгоритмы для расования линий и окружностей... Код /************************************************************************* Рисование развертки круга методом Брэзенхема
Центр в точке (xc, yc), радиус r. *************************************************************************/ void glcd_circle(int xc, int yc, int r,char color) { int x; int y; int d;
x = 0; y = r; d = 3-2*r; while(y>=x) { glcd_put_pixel((x+xc), (y+yc), color); glcd_put_pixel((x+xc), (-y+yc), color); glcd_put_pixel((-x+xc), (y+yc), color); glcd_put_pixel((-x+xc), (-y+yc), color); glcd_put_pixel((y+xc), (x+yc), color); glcd_put_pixel((y+xc), (-x+yc), color); glcd_put_pixel((-y+xc), (x+yc), color); glcd_put_pixel((-y+xc), (-x+yc), color); if( d<0 )d += 4*x+6; else{ d += 4*(x-y)+10; --y; } ++x; } } Вот хоть один человек в тему ответил ...Да уж, функция glcd_put_pixel не из быстрых...
--------------------
|
|
|
|
|
Nov 22 2006, 08:26
|

Знающий
   
Группа: Свой
Сообщений: 866
Регистрация: 31-03-05
Из: Краснодар
Пользователь №: 3 814

|
Вот выкладываю библиотеку GLCD для контроллера ks0108. Такой вроде стоит в MT12864. Там есть куча функций рисования и отображения шрифтов. Может пригодится!
--------------------
<<Первая производная от чужой идеи - уже твоя идея.>>
|
|
|
|
|
Nov 22 2006, 08:52
|

Местный
  
Группа: Свой
Сообщений: 322
Регистрация: 13-12-05
Пользователь №: 12 147

|
тоже метод...я использую... void LCD_DrawLine(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2, unsigned char set) { int x,y,count,xs,ys,xm,ym;
x = (int)x1; y = (int)y1; xs = (int)x2 - (int)x1; ys = (int)y2 - (int)y1; if(xs < 0) xm = -1; else if(xs > 0) xm = 1; else xm = 0; if(ys < 0) ym = -1; else if(ys > 0) ym = 1; else ym = 0; if(xs < 0) xs = -xs; if(ys < 0) ys = -ys;
LCD_SetDot ((unsigned char)x,(unsigned char)y, 1);
if(xs > ys) // Ëèíèÿ < 45 ãðàäóñîâ { count = -(xs/2); while(x != x2) { count = count + ys; x = x + xm; if(count > 0) { y = y + ym; count = count - xs; } LCD_SetDot ((unsigned char)x,(unsigned char)y, set); } } else // Ëèíèÿ >= 45 ãðàäóñîâ { count = -(ys/2); while(y != y2) { count = count + xs; y = y + ym; if(count > 0) { x = x + xm; count = count - ys; } LCD_SetDot ((unsigned char)x,(unsigned char)y, set); } } }
Сообщение отредактировал zorromen - Nov 22 2006, 08:54
|
|
|
|
|
Nov 24 2006, 21:05
|
Знающий
   
Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984

|
Молодец ,prottos, давно так не смеялся .  :D А лучше проверять флаг занятости,сколько можно выжать по скорости ,столько и будет, хотя 10милисекунд это уже 100 обновлений в сек,кристаллы не будут успевать разворачиватся, я приходилось почти постоянно "тормозить" загрузку картинки на ЛСД
Сообщение отредактировал bodja74 - Nov 24 2006, 21:17
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|