Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 11.06.2010, 20:06  
Uragan90
Почётный гражданин KAZUS.RU
 
Аватар для Uragan90
 
Регистрация: 20.09.2009
Сообщений: 1,899
Сказал спасибо: 470
Сказали Спасибо 408 раз(а) в 255 сообщении(ях)
Uragan90 на пути к лучшему
По умолчанию Библиотека LS020+LPC2368

Хочу сделать библиотеку чтоб слегка поиграть с этим дисплеем, начал немного редактировать чужое Вопрос будет ли работать вот так? Конечно хочится сделать прорисовку линий, кругов, 3D функции. Но боюсь не осилить, помогите
Вложения:
Тип файла: txt ls020.txt (9.8 Кб, 414 просмотров)
Реклама:
Uragan90 вне форума  
Непрочитано 11.06.2010, 21:13  
Uragan90
Почётный гражданин KAZUS.RU
 
Аватар для Uragan90
 
Регистрация: 20.09.2009
Сообщений: 1,899
Сказал спасибо: 470
Сказали Спасибо 408 раз(а) в 255 сообщении(ях)
Uragan90 на пути к лучшему
По умолчанию Re: Библиотека LS020+LPC2368

На самом деле вопроса три: как нарисовать линию х1 у1 х2 у2, нарисовать круг х у радиус, и как сделать прозрачный цвет?
Uragan90 вне форума  
Непрочитано 11.06.2010, 22:31  
MasterMushi
Вид на жительство
 
Регистрация: 14.10.2009
Сообщений: 338
Сказал спасибо: 35
Сказали Спасибо 92 раз(а) в 73 сообщении(ях)
MasterMushi на пути к лучшему
По умолчанию Re: Библиотека LS020+LPC2368

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

Затем если ширина больше превышения (x2-x1) › (y2-y1), то расстояние по ширине делится на расстояние по высоте - получаем количество прямоугольников в одну линию расположенных вдоль которых необходимо нарисовать прямоугольные области в 1px чтобы равномерно прочертить маленькими горизонтальными линиями.

и наоборот если ширина МЕНЬШЕ высоты (x2-x1) ‹ (y2-y1) то высоту делим на ширину и получаем количество столбцов необходимое чтобы начертить линию вертикальными штрихами.

После этого вычисления нужно только узнать длину линий горизонтальных или высоту столбцов. Для этого в случае (x2-x1) › (y2-y1) ширину делим на количество линий или d варианте (x1-x2) ‹ (y2-y1) высоту на количество столбцов.

теперь мы имеем длину отрезков, их количество и соответственно смещение одного столбца от другого.

Нам надо начертить линию на экране - для этого используя функцию экрана "заполнение области цветом" мы рисуем нашу линию в несколько команд, смещая за каждый проход цикла x и y на длину (высоту) прочерченного прямоугольника.
__________________
Найди путь или проложи сам!

Последний раз редактировалось MasterMushi; 12.06.2010 в 00:09.
MasterMushi вне форума  
Сказали "Спасибо" MasterMushi
Uragan90 (11.06.2010)
Непрочитано 11.06.2010, 22:59  
Uragan90
Почётный гражданин KAZUS.RU
 
Аватар для Uragan90
 
Регистрация: 20.09.2009
Сообщений: 1,899
Сказал спасибо: 470
Сказали Спасибо 408 раз(а) в 255 сообщении(ях)
Uragan90 на пути к лучшему
По умолчанию Re: Библиотека LS020+LPC2368

Спасибо! С кругом как быть?
Uragan90 вне форума  
Непрочитано 12.06.2010, 00:05  
MasterMushi
Вид на жительство
 
Регистрация: 14.10.2009
Сообщений: 338
Сказал спасибо: 35
Сказали Спасибо 92 раз(а) в 73 сообщении(ях)
MasterMushi на пути к лучшему
По умолчанию Re: Библиотека LS020+LPC2368

С кругом сложнее. Просто линиями не нарисовать, придется по точке отрисовывать
http://algolist.manual.ru/graphics/painting/circle.php
теория и функция метода такого рисования на С
PHP код:
void circle (int xint yint radius)
{
  
int dxdysum;

  
dx sum radius;
  for (
dy=0dxdy++)
  {
    
sum -= dy// Вычисляем следующий dx
    
while (sum ‹ 0sum += dx--;

    
setpixel (x+dxy+dy);
    
setpixel (x+dxy-dy);
    
setpixel (x-dxy+dy);
    
setpixel (x-dxy-dy);
  }



теперь отсебятина ....
Хотя если чертить не окружность а круг, то можно рисовать и вертикальными столбцами или построчно. Мы знаем ширину и высоту круга и знаем что начнем чертить от 1 пиксела. Поэтому используя функцию квадратного умножения от радиуса и умножая это дело на 2 мы будем иметь длинну линии на нужном расстоянии от центра окружности. НО!!! Нужно иметь в виду что у нас именно правый или левый край окружности это 0 координат прироста радиуса.

Тоесть надо начертить круг радиусом 10 пикселов

PHP код:
int x=70y=60radius=10x1x2y1y2color;

x1=x+radius;
x2=x-radius;

while (
radius--) //в цикле получаем линии
//Но не просто так а чертим от центра к краям постепенно уменьшая 
//значение высоты столбцов
{

y1=y+radius^2;
y2=y-radius^2;

fill_rect(x2+radiusx2+radiusy1y2color);
fill_rect(x1-radiusx1-radiusy1y2color);


както так ))))) может где ошибся, промоделируйте
__________________
Найди путь или проложи сам!

Последний раз редактировалось MasterMushi; 12.06.2010 в 02:00. Причина: Отлов багов
MasterMushi вне форума  
Сказали "Спасибо" MasterMushi
Uragan90 (12.06.2010)
Непрочитано 12.06.2010, 04:32  
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: Библиотека LS020+LPC2368

Сообщение от Uragan90 Посмотреть сообщение
С кругом как быть?
http://www.codenet.ru/progr/video/alg/alg4.php
kison вне форума  
Сказали "Спасибо" kison
Uragan90 (12.06.2010)
Непрочитано 12.06.2010, 09:02  
Uragan90
Почётный гражданин KAZUS.RU
 
Аватар для Uragan90
 
Регистрация: 20.09.2009
Сообщений: 1,899
Сказал спасибо: 470
Сказали Спасибо 408 раз(а) в 255 сообщении(ях)
Uragan90 на пути к лучшему
По умолчанию Re: Библиотека LS020+LPC2368

MasterMushi, Очень жаль что нельзя поставить за одно сообщение 10 или 20 плюсов, я бы поставил 100! Спасибо огромное, буду пробовать запихать эти функции в библиотеку... И уж раз такая пьянка пошла может вы знаете как сделать регулируемый, полупрозрачный цвет? Допустим у меня есть массив рисунков в памяти. Рисунок фона во весь экран и маленькие пиктограммы (ярлыки).. Как сделать так чтоб ярлык стал полупрозрачным и эта прозрачнось была регулируемая? Это наверно практически не исполнимо?
Uragan90 вне форума  
Непрочитано 12.06.2010, 11:22  
Uragan90
Почётный гражданин KAZUS.RU
 
Аватар для Uragan90
 
Регистрация: 20.09.2009
Сообщений: 1,899
Сказал спасибо: 470
Сказали Спасибо 408 раз(а) в 255 сообщении(ях)
Uragan90 на пути к лучшему
По умолчанию Re: Библиотека LS020+LPC2368

Тут видимо надо брать каждую точку ярлыка и сравнивать с точкой фона имеющей такую же кардинату. И смешивать цвета, градацию цвета. Для этого надо иметь не хилую палитру, да и смешивать голову сломаешь...
Uragan90 вне форума  
Непрочитано 12.06.2010, 12:02  
Uragan90
Почётный гражданин KAZUS.RU
 
Аватар для Uragan90
 
Регистрация: 20.09.2009
Сообщений: 1,899
Сказал спасибо: 470
Сказали Спасибо 408 раз(а) в 255 сообщении(ях)
Uragan90 на пути к лучшему
По умолчанию Re: Библиотека LS020+LPC2368

Вот поглядеть правильно?
PHP код:
void LCD_Line(int x1int y1int x2int y2);         //Рисуем линию



//==============================
void LCD_Line(int x1int y1int x2int y2)//========//Рисуем линию
{
  
int dx = (x2 x1 ›= : -1);
  
int dy = (y2 y1 ›= : -1);
  
  
int lengthX,lengthY,length;
  
//===============================================       
  
if (x2›=x1) {lengthX=x2-x1;} else  {lengthX=x1-x2;}     
  if (
y2›=y1) {lengthY=y2-y1;} else  {lengthY=y1-y2;}
  if (
lengthX › lengthY){length=lengthX;} else {length=lengthY;} 
//===============================================   
  
  
if (length == 0)
  {
    
LCD_PutPixel(x1y1RGB_BLUE);
  }
  
  if (
lengthY ‹= lengthX)
  {
    
//------------------ Начальные значения-------------------//
    
int x x1;
    
int y y1;
    
int d = -lengthX;
    
    
//------------------ Основной цикл -----------------------//
    
length++;
    while(
length--)
    {
      
LCD_PutPixel(xyRGB_BLUE);
      
+= dx;
      
+= lengthY;
      if (
› 0) {
        
-= lengthX;
        
+= dy;
      }
    }
  }
  else
  {
    
//------------------ Начальные значения-------------------//
    
int x x1;
    
int y y1;
    
int d = - lengthY;
    
    
//------------------ Основной цикл------------------------//
    
length++;
    while(
length--)
    {
      
LCD_PutPixel(xyRGB_BLUE);
      
+= dy;
      
+= lengthX;
      if (
› 0) {
        
-= lengthY;
        
+= dx;
      }
    }
  }
}
//============================================== 
Так рисуем линию

PHP код:
void LCD_Circle(unsigned char cxunsigned char cy ,unsigned char radius,unsigned color);     //Рисуем круг



//================================================
void LCD_Circle(unsigned char cxunsigned char cy ,unsigned char radius,unsigned color)//===//Рисуем круг
{
  
int xyxchangeychangeradiusError;
  
radius;
  
0;
  
xchange radius;
  
ychange 1;
  
radiusError 0;
  while(
›= y)
  {
    
LCD_PutPixel(cx+xcy+ycolor); 
    
LCD_PutPixel(cx-xcy+ycolor); 
    
LCD_PutPixel(cx-xcy-ycolor);
    
LCD_PutPixel(cx+xcy-ycolor); 
    
LCD_PutPixel(cx+ycy+xcolor); 
    
LCD_PutPixel(cx-ycy+xcolor); 
    
LCD_PutPixel(cx-ycy-xcolor); 
    
LCD_PutPixel(cx+ycy-xcolor); 
    
y++;
    
radiusError += ychange;
    
ychange += 2;
    if ( 
2*radiusError xchange › )
    {
      
x--;
      
radiusError += xchange;
      
xchange += 2;
    }
  }
}
//===================================== 
А вот так круг.
Uragan90 вне форума  
Сказали "Спасибо" Uragan90
MasterMushi (12.06.2010)
Непрочитано 12.06.2010, 22:18  
MasterMushi
Вид на жительство
 
Регистрация: 14.10.2009
Сообщений: 338
Сказал спасибо: 35
Сказали Спасибо 92 раз(а) в 73 сообщении(ях)
MasterMushi на пути к лучшему
По умолчанию Re: Библиотека LS020+LPC2368

Посмотри в даташте на экран как работает функция вывода массива из разного цвета сразу в область экрана. Этой функцией можно очень сильно упростить вывод и ускорить работу программы. Например горизонтальные и вертикальные линии можно прямо отрабатывать этой функцией без вычислений вообще. и на наклонные линии количество проходов на цикл уменьшится.

Философия тут вот в чем - при выводе лучше тратить процессорное время непосредственно на вывод данных а не на вычисления того, как вывести.

НО, твой код все же ОК, а оптимизировать можно до помешательства. Поэтому если в железе все заработает на ура, то можно и на этом варианте остановится.

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

Изменив состояние видеопамяти мы функцией заполнения прямоугольника СРАЗУ выводим всю видеопамять на экран. И О чудо, не смотря на внешнюю сложность, нам можно не мучится со многими вещами по экрану. Например для вывода вообще не нужно будет ничего кроме заполнения области. А все библиотечные функции пишем исключительно для работы с оперативой.

Плюс метода - просто и очень быстро

Минус - аппаратные средства лишние. Еще минус - выводить весь экран занимает время, но это решается выводом в цикле блоками (токенами) 8х8 по таймеру. Тоесть не мешая ни какой подпрограмме быстро пихаем куски на экран с частотой полного перезаполнения 3-4 кадра в секунду.


Хотя я могу и ошибаться насчет однонаправленности, надо смотреть даташит
__________________
Найди путь или проложи сам!
MasterMushi вне форума  
Сказали "Спасибо" MasterMushi
Uragan90 (12.06.2010)
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Плата LPC2368 Uragan90 Микроконтроллеры, АЦП, память и т.д 170 13.04.2010 13:03
библиотека HC12 для Proteus Fenolftalein Proteus, KiCAD и другие ECAD 0 12.01.2010 10:47


Часовой пояс GMT +4, время: 22:35.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot