Дисплей от Siemens S65

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

Re: Дисплей от Siemens S65

Сообщение 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 КБ) 437 скачиваний
Владимир
Реклама
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Re: Дисплей от Siemens S65

Сообщение 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;
}
...


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

Re: Дисплей от Siemens S65

Сообщение 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 КБ) 743 скачивания
Владимир
vlad145
Встал на лапы
Сообщения: 130
Зарегистрирован: Пт мар 06, 2009 22:54:37
Откуда: Курган
Контактная информация:

Re: Дисплей от Siemens S65

Сообщение vlad145 »

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

Re: Дисплей от Siemens S65

Сообщение vlad145 »

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

Re: Дисплей от Siemens S65

Сообщение 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];
Владимир
Реклама
vlad145
Встал на лапы
Сообщения: 130
Зарегистрирован: Пт мар 06, 2009 22:54:37
Откуда: Курган
Контактная информация:

Re: Дисплей от Siemens S65

Сообщение 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 раз.
Владимир
vlad145
Встал на лапы
Сообщения: 130
Зарегистрирован: Пт мар 06, 2009 22:54:37
Откуда: Курган
Контактная информация:

Re: Дисплей от Siemens S65

Сообщение 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); //кол-во датчиков
};
};
};

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

Re: Дисплей от Siemens S65

Сообщение 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 не трогаю.
Спасибо за ответы.
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: Дисплей от Siemens S65

Сообщение HHIMERA »

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

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

Re: Дисплей от Siemens S65

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

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

Re: Дисплей от Siemens S65

Сообщение HHIMERA »

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

Re: Дисплей от Siemens S65

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

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

Re: Дисплей от Siemens S65

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

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

Re: Дисплей от Siemens S65

Сообщение ibiza11 »

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

Re: Дисплей от Siemens S65

Сообщение Kezoox »

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


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

Re: Дисплей от Siemens S65

Сообщение trey3499 »

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

Re: Дисплей от Siemens S65

Сообщение Moto_v3x »

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

Re: Дисплей от Siemens S65

Сообщение trey3499 »

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

Re: Дисплей от Siemens S65

Сообщение trey3499 »

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

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