А для LPH8836 можно такое сделать? Вот код put_char.mr_smit писал(а):Немного переделал функцию put_char, теперь можно выводить текст с масштабированием от 1 до 4.![]()
Код: Выделить всё
// поместить символ в графическую память дисплея // 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; } } } }
Дисплей от Siemens S65
-
vlad145
- Встал на лапы
- Сообщения: 130
- Зарегистрирован: Пт мар 06, 2009 22:54:37
- Откуда: Курган
- Контактная информация:
Re: Дисплей от Siemens S65
- Вложения
-
- put_char.txt
- (1.3 КБ) 438 скачиваний
Владимир
- Реклама
Re: Дисплей от Siemens S65
Так там то же самое. Практически один в один. Чуть изменить.
// поместить символ в графическую память дисплея
void put_char(char x, char y, char c, unsigned int color, char rot, char m)
И кусок функции переправить:
Переделывал прям в браузере поэтому может где скобку какую не закрыл
// поместить символ в графическую память дисплея
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
А в функции put_string что то изменять(добавлять) нужно? У меня ругался на данную функцию пока не добавил char m. В результате на экране вместо символов мусор.
Это функция put_char:
Это функция put_string:
Может где ошибся или не дописал?
Это функция 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
}Код: Выделить всё
// записать строку, начиная с координат 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 скачивания
Владимир
-
vlad145
- Встал на лапы
- Сообщения: 130
- Зарегистрирован: Пт мар 06, 2009 22:54:37
- Откуда: Курган
- Контактная информация:
Re: Дисплей от Siemens S65
После очередного колдовства с кодом, получилось следующее. Код вывода символа и строки прилагаю. Почему то увеличение происходит только по вертикали.
- Вложения
-
- my_put_char.txt
- (1.94 КБ) 442 скачивания
-
- DSC00031.JPG
- (34.21 КБ) 757 скачиваний
Владимир
-
vlad145
- Встал на лапы
- Сообщения: 130
- Зарегистрирован: Пт мар 06, 2009 22:54:37
- Откуда: Курган
- Контактная информация:
Re: Дисплей от Siemens S65
Наконец удалось увеличить по вертикали, но как то не так. Символы получаются как бы через строчку. Подскажиге уважаемые гуру, где косяк.
- Вложения
-
- Фото107-2.jpg
- (97.24 КБ) 790 скачиваний
-
- my_put_char.txt
- (2.32 КБ) 433 скачивания
Владимир
- Реклама
-
vlad145
- Встал на лапы
- Сообщения: 130
- Зарегистрирован: Пт мар 06, 2009 22:54:37
- Откуда: Курган
- Контактная информация:
Re: Дисплей от Siemens S65
Решено. Нужно было изменить следующий код:
Код: Выделить всё
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
Доброго времени суток.
Есть вот такой код вывода на дисплей окружности, как закрасить её?
Я сделал через цикл, перебором радиуса, но мне кажется должен быть другой способ.
P.S. От использования окружности оказался в пользу квадратных индикаторов, быстро и практично.
Есть вот такой код вывода на дисплей окружности, как закрасить её?
Код: Выделить всё
//// Рисуем окружность
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
Доброго времени суток уважаемые. Есть такая задумка, реализовать смену экранов на данном дисплее. Как избежать постоянной перерисовки заполнения в цикле? Вот часть кода:
...
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); //кол-во датчиков
};
};
};
Бьюсь уже пару дней и все в пустую, помогите, плииииз.
...
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); //кол-во датчиков
};
};
};
Бьюсь уже пару дней и все в пустую, помогите, плииииз.
Владимир
Re: Дисплей от Siemens S65
не могу запустить ls020 i atmega8.
подсветку не подключаю, так как нету источника 12В.
На екран ничего не выводится, абсолютно.
Подключаю напрямую, без резисторов.
Ногу дисплея NC не трогаю.
Спасибо за ответы.
Спойлер
Код: Выделить всё
#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);
}
}
На екран ничего не выводится, абсолютно.
Подключаю напрямую, без резисторов.
Ногу дисплея NC не трогаю.
Спасибо за ответы.
Re: Дисплей от Siemens S65
.....
Питание не подаю
Мегу в панельку не вставляю
Проводки не припаиваю
Пачему не робит???
Питание не подаю
Мегу в панельку не вставляю
Проводки не припаиваю
Пачему не робит???
"Я не даю готовых решений, я заставляю думать!"(С)
Re: Дисплей от Siemens S65
а что без подсветки роботать не будет никак??
Re: Дисплей от Siemens S65
Без подсветки можете ничего не увидеть...
А без сопротивлений и питании 5 Вольт - спалить дисплей...
А без сопротивлений и питании 5 Вольт - спалить дисплей...
"Я не даю готовых решений, я заставляю думать!"(С)
Re: Дисплей от Siemens S65
мк и дисплей роботают от 3в.
Re: Дисплей от Siemens S65
по сути в исходниках вроде все окей, но не инициализует никак(
на ноги мк цеплял вместо дисплея диоды. но те что отвезают за RS reset cs всегда горят.
на ноги мк цеплял вместо дисплея диоды. но те что отвезают за RS reset cs всегда горят.
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Re: Дисплей от Siemens S65
choo-joe, включите подсветку. без нее есть подозрение, что вы просто не видите, что происходит на дисплее.
Ставим плюсы: )
Re: Дисплей от Siemens S65
без подсветки будет видно что работает но цвета непонятные почти чб
товарищи коты подскажите есть ли метод установить цветную картинку фон и поверх что то писать не перерисовывая её после стирания символа ?
товарищи коты подскажите есть ли метод установить цветную картинку фон и поверх что то писать не перерисовывая её после стирания символа ?
- trey3499
- Первый раз сказал Мяу!
- Сообщения: 33
- Зарегистрирован: Вт июн 08, 2010 10:39:11
- Откуда: гТверь
Re: Дисплей от Siemens S65
Всем привет!
а проект дисплея для протеуса есть у кого?
а проект дисплея для протеуса есть у кого?
- Moto_v3x
- Потрогал лапой паяльник
- Сообщения: 307
- Зарегистрирован: Ср мар 31, 2010 11:45:58
- Откуда: Славянск
Re: Дисплей от Siemens S65
может это http://vrtp.ru/index.php?showtopic=1120&st=2460
или вам их исходники
или вам их исходники
- trey3499
- Первый раз сказал Мяу!
- Сообщения: 33
- Зарегистрирован: Вт июн 08, 2010 10:39:11
- Откуда: гТверь
Re: Дисплей от Siemens S65
Да вот это.
Большое спасибо.
Большое спасибо.
- trey3499
- Первый раз сказал Мяу!
- Сообщения: 33
- Зарегистрирован: Вт июн 08, 2010 10:39:11
- Откуда: гТверь
Re: Дисплей от Siemens S65
Еще вопросик.
а библиотеки ls020 для имитации дисплея нет в природе?
просто дисплея на руках еще нет.
а библиотеки ls020 для имитации дисплея нет в природе?
просто дисплея на руках еще нет.


