Дисплей от Siemens S65

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Встал на лапы
Сообщения: 130
Зарегистрирован: Пт мар 06, 2009 22:54:37
Откуда: Курган

Сообщение vlad145 »

mr_smit писал(а):Немного переделал функцию put_char, теперь можно выводить текст с масштабированием от 1 до 4. 8)

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

// поместить символ в графическую память дисплея
// m - масштаб текста. 1-самый маленький
void put_char(char x, char y, char c, unsigned int color, char m) {
  
  char h,ch,p,mask,tt;
  x=DISP_H - CHAR_H - x;
  WRCMD(0xEF90);
  WRCMD(0x0504);
  WRCMD(0x0800+y);
  WRCMD(0x0A00+x);
  WRCMD(0x0900+y+CHAR_H*m-1);
  WRCMD(0x0B00+x+CHAR_W*m-1);
  for (h=CHAR_H; h>0; h--) {    // every column of the character
    for(tt=0;tt<m;tt++) {
      ch=ascii_tab[ c-32 ][CHAR_H-h];
      mask=0x01;
      for (p=0; p<CHAR_W; p++) {  // write the pixels
        if (ch&mask) {
          WRDATA(color);
          if(m==2) {
            WRDATA(color);
            }
          if (m==3) {
            WRDATA(color);
            WRDATA(color);
          }
          if (m==4) {
            WRDATA(color);
            WRDATA(color);
            WRDATA(color);
          }
        }
        else {
          WRDATA(bgcolor);
          if(m==2) { 
            WRDATA(bgcolor);
            }
          if (m==3) {
            WRDATA(bgcolor);
            WRDATA(bgcolor);
          }
          if (m==4) {
            WRDATA(bgcolor);
            WRDATA(bgcolor);
            WRDATA(bgcolor);
          }
        }
      mask=mask*2;
      }
    }
  }
}
А для LPH8836 можно такое сделать? Вот код put_char.
Вложения
put_char.txt
(1.3 КБ) 438 скачиваний
Владимир
Контактная информация:
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Сообщение mr_smit »

Так там то же самое. Практически один в один. Чуть изменить.

// поместить символ в графическую память дисплея
void put_char(char x, char y, char c, unsigned int color, char rot, char m)

И кусок функции переправить:

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

...
for (p=0; p<CHAR_W; p++)  // write the pixels
{
if (ch&mask)
{
  lcd_write(color); 
  if(m==2) {
    lcd_write(color);
    }
  if (m==3) {
    lcd_write(color);
    lcd_write(color);
    }
  if (m==4) {
    lcd_write(color);
    lcd_write(color);
    lcd_write(color);
    }            
}
else
{
  lcd_write(bgcolor);
  if(m==2) {
    lcd_write(bgcolor);
    }
  if (m==3) {
    lcd_write(bgcolor);
    lcd_write(bgcolor);
    }
  if (m==4) {
    lcd_write(bgcolor);
    lcd_write(bgcolor);
    lcd_write(bgcolor);
    }
  }
mask=mask/2;
}
...
Переделывал прям в браузере поэтому может где скобку какую не закрыл
Нельзя всё знать, достаточно понимать.
Реклама
Встал на лапы
Сообщения: 130
Зарегистрирован: Пт мар 06, 2009 22:54:37
Откуда: Курган

Сообщение vlad145 »

А в функции put_string что то изменять(добавлять) нужно? У меня ругался на данную функцию пока не добавил char m. В результате на экране вместо символов мусор.
Это функция put_char:

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

// поместить символ в графическую память дисплея
void put_char(char x, char y, char c, unsigned int color, char rot, char m)
{
  char h,ch,p,mask;

  CS= 0;
 
  switch(rot)
  {
    default:
    case 0:
      lcd_reg(0x05);lcd_dat(0x0038);
      lcd_reg(0x17);lcd_dat8(x+CHAR_W-1, x);
      lcd_reg(0x16);lcd_dat8(y+CHAR_H-1, y);
      lcd_reg(0x21);lcd_dat8(x,y);
      lcd_reg(0x22);
      lcd_write8(0x76); 
      break;
    case 1:
      lcd_reg(0x05);lcd_dat(0x0030);
      lcd_reg(0x16);lcd_dat8(x+CHAR_W-1, x);
      lcd_reg(0x17);lcd_dat8(y+CHAR_H-1, y);
      lcd_reg(0x21);lcd_dat8(y, x);
      lcd_reg(0x22);
      lcd_write8(0x76); 
      break;
  }
     if (c>127) {
     c=c-57;          //убираем отсутствующую часть таблицы ASCII
     };
     
  for (h=0; h<CHAR_H; h++) // every column of the character
  {       
       if (rot==1)
          ch=ascii_tab[ c-32 ][h];   
          else
          ch=ascii_tab[ c-32 ][CHAR_H-h-1];
   
        mask=0x80;
     for (p=0; p<CHAR_W; p++)  // write the pixels
     {
       if (ch&mask)
       {
         lcd_write(color);
         
           if(m==2) {
           lcd_write(color);
           } 
           
           if (m==3) {
           lcd_write(color);
           lcd_write(color);
           }
           
           if (m==4) {
            lcd_write(color);
            lcd_write(color);
            lcd_write(color);
           }           
       }
      else
       {
            lcd_write(bgcolor);
            
            if(m==2) {
            lcd_write(bgcolor);
            } 
            
            if (m==3) {
            lcd_write(bgcolor);
            lcd_write(bgcolor);
            } 
            
            if (m==4) {
            lcd_write(bgcolor);
            lcd_write(bgcolor);
            lcd_write(bgcolor);
            }
       }
       mask=mask/2;
     }
  }
   
CS= 1;  // deselect display   

}
Это функция put_string:

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

// записать строку, начиная с координат x, y, цветом color и ориентацией orient
// если orient=0, то горизонтально, если =1, то вертикально
void put_string(unsigned char x, unsigned char y, char *str, unsigned int color, unsigned char orient, char m)
{
  j=0;
  while (j<strlen(str))
  {
    put_char(x+j*CHAR_W,y,str[j],color,orient,m);   //  0 deg. rotated
    j++;
  }
}
Может где ошибся или не дописал?
Вложения
DSC00029.JPG
(68.97 КБ) 744 скачивания
Владимир
Контактная информация:
Встал на лапы
Сообщения: 130
Зарегистрирован: Пт мар 06, 2009 22:54:37
Откуда: Курган

Сообщение vlad145 »

После очередного колдовства с кодом, получилось следующее. Код вывода символа и строки прилагаю. Почему то увеличение происходит только по вертикали.
Вложения
my_put_char.txt
(1.94 КБ) 443 скачивания
DSC00031.JPG
(34.21 КБ) 758 скачиваний
Владимир
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Сообщения: 130
Зарегистрирован: Пт мар 06, 2009 22:54:37
Откуда: Курган

Сообщение vlad145 »

Наконец удалось увеличить по вертикали, но как то не так. Символы получаются как бы через строчку. Подскажиге уважаемые гуру, где косяк.
Вложения
Фото107-2.jpg
(97.24 КБ) 790 скачиваний
my_put_char.txt
(2.32 КБ) 434 скачивания
Владимир
Контактная информация:
Реклама
Встал на лапы
Сообщения: 130
Зарегистрирован: Пт мар 06, 2009 22:54:37
Откуда: Курган

Сообщение vlad145 »

Решено. Нужно было изменить следующий код:

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

for (h=0; h<CHAR_H*m; h++) // every column of the character
  {
       if (rot==1)
       ch=ascii_tab[ c-32 ][h/m];
       else
       ch=ascii_tab[ c-32 ][CHAR_H-h/m];
Владимир
Контактная информация:
Реклама
Встал на лапы
Сообщения: 130
Зарегистрирован: Пт мар 06, 2009 22:54:37
Откуда: Курган

Сообщение vlad145 »

Доброго времени суток.
Есть вот такой код вывода на дисплей окружности, как закрасить её?

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

//// Рисуем окружность 
void lcd_circle(char xcenter, char ycenter, signed int rad, int color)
 {
  signed int tswitch,y1,x1 = 0;
  signed char d;
  CS=0;
  
  xcenter = DISP_H - xcenter;
  d = ycenter - xcenter;
  y1 = rad;
  tswitch = 3 - 2 * rad;
  
  while (x1 <= y1) 
  {
    lcd_pixel(xcenter + x1, ycenter + y1, color); 
    lcd_pixel(xcenter + x1, ycenter - y1, color);
    lcd_pixel(xcenter - x1, ycenter + y1, color);   
    lcd_pixel(xcenter - x1, ycenter - y1, color);
    lcd_pixel(ycenter + y1 - d, ycenter + x1, color); 
    lcd_pixel(ycenter + y1 - d, ycenter - x1, color);
    lcd_pixel(ycenter - y1 - d, ycenter + x1, color);
    lcd_pixel(ycenter - y1 - d, ycenter - x1, color);
    
    if (tswitch < 0) tswitch += (4 * x1 + 6);
     else 
      {
      tswitch += (4 * (x1 - y1) + 10);
      y1--;
      }
    x1++;
  }            
  CS=1;
 }  
Я сделал через цикл, перебором радиуса, но мне кажется должен быть другой способ.

P.S. От использования окружности оказался в пользу квадратных индикаторов, быстро и практично.
Последний раз редактировалось vlad145 Чт сен 15, 2011 18:43:35, всего редактировалось 1 раз.
Владимир
Контактная информация:
Встал на лапы
Сообщения: 130
Зарегистрирован: Пт мар 06, 2009 22:54:37
Откуда: Курган

Сообщение vlad145 »

Доброго времени суток уважаемые. Есть такая задумка, реализовать смену экранов на данном дисплее. Как избежать постоянной перерисовки заполнения в цикле? Вот часть кода:

...
const char m_main = 0,
m_term = 1,
m_kul = 2,
m_set = 3;

char mode;

//Меню
mode = m_main;

while (1)
{
// Place your code here
if (PINC.7 == 0) {
mode++;
if (mode == 4) mode = 0;
if (PINC.6 == 0) mode = 0;
};

if (mode == m_main) {
fill_area(3,155,3,128,0x01FF);

//Часы
put_string(29,32,txt4,textcolor,0x01FF,0,3);
put_string(76,47,txt6,textcolor,0x01FF,0,1);
put_string(86,32,txt4,textcolor,0x01FF,0,3);

put_string(73,25,txt4,textcolor,0x01FF,0,1);
};

if (mode == m_term) {
fill_area(3,155,3,128,0x02FF);

sprintf( LcdBuffDevices,"%d", devices,1 ); delay_ms(50);

//выводим информацию о кол-ве датчиков
put_string(76,4,LcdBuffDevices,BLACK,0,1); //кол-во датчиков
};
};
};

Бьюсь уже пару дней и все в пустую, помогите, плииииз.
Владимир
Контактная информация:
Родился
Сообщения: 7
Зарегистрирован: Вс янв 20, 2013 02:02:48

Сообщение choo-joe »

не могу запустить ls020 i atmega8.
Спойлер

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

#include <mega8.h>
#include <delay.h>
#include <spi.h>
#include "lcd_init.h"
#include <string.h>

 #define DISP_W       132
 #define DISP_H       176 
 
 #define CHAR_H       14
 #define CHAR_W       8

//  RS = high  Command 
//  RS = low  Data 
 
#define RS PORTB.0
#define CS PORTB.2
#define RESET PORTB.4

#define sky 0x54fb
#define black 0x0000
#define white 0xFFFF
#define green 0x07E0
#define blue 0x001F
#define red 0xF800
#define yellow 0xDEE0
#define orange 0xAB00
#define pink 0xF97F
#define brown 0x8200
#define grey 0x8410
#define violet 0x91D4

unsigned int bgcolor=0x0000;

void m8_init_port(void)
{

// MK  - LCD            DDRB   |     PORTB
// PB0 - RS             1      |      1
// PB1 - //             0      |      0
// PB2 - CS             1      |      1
// PB3 - DAT (MOSI)     1      |      0
// PB4 - Reset          1      |      1
// PB5 - CLK            1      |      0
// PB6 - //             0      |      0
// PB7 - //             0      |      0
//                             |
// HEX                  3D     |      15
//

PORTB=0x15;
DDRB=0x3D;

// init SPI
SPCR=0x50;
SPSR=0x01;
}

void lcd_write8(char dat)
{
  spi(dat);
}
// запись двух байт
void lcd_write(unsigned int dat)
{
  lcd_write8(dat>>8);
  lcd_write8 (dat);
}
// пишем в память дисплея данные (2 байта)
void lcd_d(unsigned int data)
{ 
  CS=0;
  RS=0;
  lcd_write(data);
  CS=1;
} 
// отсылаем команды (2 байта)
void lcd_c(unsigned int command)
{ 
  CS=0;
  RS=1;
  lcd_write(command);
  CS=1;
}

void fill_screen(unsigned int color)
{
 unsigned int i;   
  lcd_c(0xEF90);
  lcd_c(0x0500);
  lcd_c(0x0600);
  lcd_c(0x0700);
  for (i=0; i<DISP_W*DISP_H; i++)
    lcd_d(color);     //DISP_W 132  DISP_H 176      
} 

void lcd_init(void)
{
int i;
               //RS=1 Command
               //RS=0 DATA 
  RESET=0;       
  CS=0;
  
  delay_ms(5);
  
  RS=1;
  RESET=1;
  
  delay_ms(50);
  for (i=0;i<12;i++) lcd_c(INIT1[i])
  ;
  delay_ms(7);
  for (i=0;i<20;i++) lcd_c(INIT2[i]);
  
  delay_ms(50);
  for (i=0;i<1;i++) lcd_c(INIT3[i]);
  
  delay_ms(5);
  
  //fill_screen(bgcolor); // очищаем экран от мусора
  
  CS=1;
  
} 
           

void put_char(char x, char y, char c, unsigned int color)
{
  char h,ch,p,mask,tt;
  //char m=1;
 // DISP_READY=0;
  x=DISP_H - CHAR_H - x;
    lcd_c(0xEF90); 
    lcd_c(0x0504);
    lcd_c(0x0800+y);
    lcd_c(0x0A00+x);
    lcd_c(0x0900+y+CHAR_H-1);
    lcd_c(0x0B00+x+CHAR_W-1);
  for (h=CHAR_H; h>0; h--) // every column of the character
  {
      for(tt=0;tt<1;tt++)
        {  
        ch=ascii_tab[c][CHAR_H-h];
        mask=0x01;
        for (p=0; p<CHAR_W; p++)  // write the pixels
          {
          if (ch&mask)
            {
            lcd_d(color);
            //if(m==2) lcd_d(color);                 
            }
           else
            {
            lcd_d(bgcolor);
            //if(m==2) lcd_d(bgcolor); 
            }
          mask=mask*2;
          }
        }  
  }
    
}

void put_string(unsigned char x, unsigned char y, char *str, unsigned int color)
{
unsigned char  j=0;
  while (j<strlen(str))
   {
   put_char(x+j*CHAR_W,y,str[j],color);   //  0 deg. rotated str[j]
   j++;
   }
} 

/*
void put_dot(int x, int y,long int color)
 {
  send_cmd(0xEF90);
  send_cmd(0x0500);
  send_cmd(0x0800+x);
  send_cmd(0x0A00+y);
  send_data(color);
  
 } 
*/ 

void lcd_poweroff (void)
{
  lcd_c(0xEF00); lcd_c(0x7E04); lcd_c(0xEFB0); lcd_c(0x5A48); 
  lcd_c(0xEF00); lcd_c(0x7F01); lcd_c(0xEFB0); lcd_c(0x64FF);
  lcd_c(0x6500); lcd_c(0xEF00); lcd_c(0x7F01); lcd_c(0xE262);
  lcd_c(0xE202); lcd_c(0xEFB0); lcd_c(0xBC02); lcd_c(0xEF00);
  lcd_c(0x7F01); lcd_c(0xE200); lcd_c(0x8000); lcd_c(0xE204);
  lcd_c(0xE200); lcd_c(0xE100); lcd_c(0xEFB0); lcd_c(0xBC00);
  lcd_c(0xEF00); lcd_c(0x7F01);
}

void ColorZone(int x1, int y1, int x2, int y2,long int color)
{
  int i;
  lcd_c(0xEF90);

 // if(m_bRotate)
 // {
 //   lcd_c(0x0500);
 // }
 // else
 // {
  lcd_c(0x0500);
 // }
  lcd_c(0x0800+x1);
  lcd_c(0x0900+x2);
  lcd_c(0x0A00+y1);
  lcd_c(0x0B00+y2);

  for(i=0; i<(x2-x1+1)*(y2-y1+1); i++)
  {
    lcd_d(color);
  }
 }


подсветку не подключаю, так как нету источника 12В.
На екран ничего не выводится, абсолютно.
Подключаю напрямую, без резисторов.
Ногу дисплея NC не трогаю.
Спасибо за ответы.
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

.....
Питание не подаю
Мегу в панельку не вставляю
Проводки не припаиваю

Пачему не робит??? :)))
"Я не даю готовых решений, я заставляю думать!"(С)
Родился
Сообщения: 7
Зарегистрирован: Вс янв 20, 2013 02:02:48

Сообщение choo-joe »

а что без подсветки роботать не будет никак??
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

Без подсветки можете ничего не увидеть...
А без сопротивлений и питании 5 Вольт - спалить дисплей...
"Я не даю готовых решений, я заставляю думать!"(С)
Родился
Сообщения: 7
Зарегистрирован: Вс янв 20, 2013 02:02:48

Сообщение choo-joe »

мк и дисплей роботают от 3в.
Родился
Сообщения: 7
Зарегистрирован: Вс янв 20, 2013 02:02:48

Сообщение choo-joe »

по сути в исходниках вроде все окей, но не инициализует никак(
на ноги мк цеплял вместо дисплея диоды. но те что отвезают за RS reset cs всегда горят.
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

choo-joe, включите подсветку. без нее есть подозрение, что вы просто не видите, что происходит на дисплее.
Ставим плюсы: )
Открыл глаза
Сообщения: 46
Зарегистрирован: Вт янв 01, 2013 12:36:33

Сообщение Kezoox »

без подсветки будет видно что работает но цвета непонятные почти чб


:solder:
товарищи коты подскажите есть ли метод установить цветную картинку фон и поверх что то писать не перерисовывая её после стирания символа ? :roll:
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 33
Зарегистрирован: Вт июн 08, 2010 10:39:11
Откуда: гТверь

Сообщение trey3499 »

Всем привет!
а проект дисплея для протеуса есть у кого?
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 307
Зарегистрирован: Ср мар 31, 2010 11:45:58
Откуда: Славянск

Сообщение Moto_v3x »

может это http://vrtp.ru/index.php?showtopic=1120&st=2460
или вам их исходники
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 33
Зарегистрирован: Вт июн 08, 2010 10:39:11
Откуда: гТверь

Сообщение trey3499 »

Да вот это.
Большое спасибо.
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 33
Зарегистрирован: Вт июн 08, 2010 10:39:11
Откуда: гТверь

Сообщение trey3499 »

Еще вопросик.
а библиотеки ls020 для имитации дисплея нет в природе?
просто дисплея на руках еще нет.
Ответить

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