Работа с графическими ЖКИ на контроллере KS0108 и аналогах
- БАТАРЕЙКУС
- Потрогал лапой паяльник
- Сообщения: 346
- Зарегистрирован: Сб фев 07, 2009 19:21:25
Re: Работа с графическими ЖКИ на контроллере KS0108 и аналог
яж на предыдущей страничке описывал порядок подачи сигналов для инициализации дисплея, попробуйте его.
Мечтатель - не тот, кто сидит на диване и думает о несбыточном, а тот, кто всеми силами стремится воплотить несбыточное в реальность.
Re: Работа с графическими ЖКИ на контроллере KS0108 и аналог
shurikss123 писал(а):приветик всем!
Вопрос в студию, заказал недавно диспл wg12864A (part no. WG12864A-CFH-T#N) с RGB подсветкой а теперь когда он пришёл, рву волосы в частности не могу найти на него даташит, с схемой на 22 пина везде на 20 пинов, некто не подскажет что за фигня, как его подключать как посветкой управлять?
У меня точно такой же дисплей недавно появился.
С подсветкой там очень здорово сделано - вся обвязка у них уже собрана на плате, потому она управляется чисто логикой.
Управляется так: 19-ю ножку сажаешь на +5 и забываешь. 20, 21 и 22 пины - это R, G и B. Подаёшь на ножку 0 и подсветка зажигается. Например, для жёлтого цвета подаешь на 19 +5; на 20 и 21 - 0; 22 - NC или +5.
Ну или можно наоборот управлять, хозяин - барин)
Пины 1-18 должны быть как в даташите.
Только работать я его пока не заставил((
Кто-нибудь пробовал его согласовывать с 3.3-вольтовой логикой?
Я уже дошёл то такого изврата (см. вложение), но он молчит.
Да, знаю, что есть специальные микросхемы, но у меня вся кухня на белой макетке, а они все smd.
Вроде ещё есть схема с диодом и резитором на каждую ногу, но я так ничего не понял.
Да, кстати, ещё один вопрос: в даташите на сайте Winstar указано, что высокий уровень - это 0, а низкий - это +5, однако в этой статье логические уровни используются стандартные и всё там работает. Кому верить?)
- Вложения
-
- power1.png
- Попытка согласования 3.3 и 5В
- (10.9 КБ) 854 скачивания
Re: Работа с графическими ЖКИ на контроллере KS0108 и аналог
Уважаемый lexmulya
подскажите как мне вывести графику(выделено цветом), как не пробовал рисует 8 полос, по полосе на страницу! WG12864A .
register unsigned char i;
void WriteCom(byte Com, byte CS)
{
SetBit(LCD_COM,CS);
ClrBit(LCD_COM,LCD_RS);
ClrBit(LCD_COM,LCD_RW);
#asm;
nop
nop
nop
#endasm;
LCD_DB=Com;
SetBit(LCD_COM,LCD_E);
#asm;
nop
nop
nop
#endasm;
ClrBit(LCD_COM,LCD_E);
delay_ms(1);
ClrBit(LCD_COM,(LCD_CS1+LCD_CS2));
SetBit(LCD_COM,LCD_E);
delay_ms(1);
}
void WriteData(byte data, byte CS)
{
SetBit(LCD_COM,CS);
SetBit(LCD_COM,LCD_RS);
ClrBit(LCD_COM,LCD_RW);
#asm;
nop
nop
nop
#endasm;
LCD_DB=data;
SetBit(LCD_COM,LCD_E);
#asm;
nop
nop
nop
#endasm;
ClrBit(LCD_COM,LCD_E);
delay_ms(1);
ClrBit(LCD_COM,(LCD_CS1+LCD_CS2));
SetBit(LCD_COM,LCD_E);
delay_ms(1);
}
/*Координаты LCD*/
void WriteXY(byte x,byte y, byte CS)
{
WriteCom(0xb8+y,CS);
WriteCom(0x40+x,CS);
}
void wpixXY(byte x, byte y, byte CS)
{
WriteCom(0xb8 | y,CS);
WriteCom(0x40 | x,CS);
}
/*Иницилизация LCD*/
void init_lcd(void)
{
WriteXY(0,0,(LCD_CS1+LCD_CS2));
WriteCom(0xb8,(LCD_CS1+LCD_CS2));
WriteCom(0x40,(LCD_CS1+LCD_CS2));
WriteCom(0xc0,(LCD_CS1+LCD_CS2));
WriteCom(0x3f,(LCD_CS1+LCD_CS2));
}
/*Очистить LCD*/
void clear(void)
{
unsigned char x,y;
for(x = 0;x < 64;x++)
{
for(y = 0;y < 8;y++)
{
WriteXY(x,y,(LCD_CS1+LCD_CS2));
WriteData(0,(LCD_CS1+LCD_CS2));
}
}
}
/*заполнить LCD*/
void clearz(void)
{
unsigned char x,y;
for(x = 0;x < 64;x++)
{
for(y = 0;y < 8;y++)
{
WriteXY(x,y,(LCD_CS1+LCD_CS2));
WriteData(0xff,(LCD_CS1+LCD_CS2));
}
}
}
/**/
byte gotoxy(byte x, unsigned y)
{
unsigned char CS, textCS;
if(x < 10)
{
CS=LCD_CS1;
textCS=0;
}
else
{
CS=LCD_CS2;
textCS=64;
}
WriteXY(x*6-textCS+4,y,CS); //
return CS;
}
/**/
void putc (byte data, byte inv)
{
unsigned char textL, CS=gotoxy(textx,texty);
if(data < 0x90)
{
textL=0x20;
}
else
{
textL=0x60;
}
WriteData((sym[data-textL][0])^inv,CS);
WriteData((sym[data-textL][1])^inv,CS);
WriteData((sym[data-textL][2])^inv,CS);
WriteData((sym[data-textL][3])^inv,CS);
WriteData((sym[data-textL][4])^inv,CS);
WriteData(0^inv,CS);
if(textx < 19){ textx++; textx = xk;} else {textx=0; if(texty <
texty++; texty = yk;
if(texty ==
{texty = 0;} }
}
/*Функция вывода строки из флеш памяти*/
void LCD_PUTSF(byte x, byte y, flash byte str[]){
byte i=0;
xk = textx;
yk = texty;
//Пока не конец строки выводим символы
while(str[i])
{
x++;
textx = x;
texty = y;
putc(str[i],in);
i++;
}
textx = xk;
texty = yk;
}
/*Функция которая ресует на экране 1 пиксел*/
void LCD_PUT_PIXEL(byte x, byte y){
//Обьявляем переменные
byte bite;
byte page;
byte data, data2;
//Выход если точка лежит вне экрана
if((x>127)|(y>63)) return;
//Выбираем кристалл
if(x>=64){
ClrBit(LCD_COM, LCD_CS1);
SetBit(LCD_COM, LCD_CS2);
x=x-64;
page = 0b00010000;
}
else{
ClrBit(LCD_COM, LCD_CS2);
SetBit(LCD_COM, LCD_CS1);
page = 0b00100000;
}
y/8;
x%8;
wpixXY(x, y, page);
WriteData(0b00000001, page);
}
/*Функция вывода прямой по алгоритму Брезенхома.
Подробно ее описывать не буду т.к. по ней лучше почитать в интернете*/
void LCD_LINE(byte x1, byte y1, byte x2, byte y2){
int dx,
.
.
.
и так рисуем линию:
void prog(void)
{
byte korX = 0;
byte korY = 0;
clear();
while(1)
{
if(PINA.7 == 0){
if(korX == 127){korX = 0; korY++;}else{korX++;}
if(korY == 63){korY = 0; }
//delay_ms(100);
//clearz();
LCD_PUT_PIXEL(korX, korY);
//
//LCD_CIRCLE(63, 63, 63);
//
}
}
}
void
.
.
.
подскажите как мне вывести графику(выделено цветом), как не пробовал рисует 8 полос, по полосе на страницу! WG12864A .register unsigned char i;
void WriteCom(byte Com, byte CS)
{
SetBit(LCD_COM,CS);
ClrBit(LCD_COM,LCD_RS);
ClrBit(LCD_COM,LCD_RW);
#asm;
nop
nop
nop
#endasm;
LCD_DB=Com;
SetBit(LCD_COM,LCD_E);
#asm;
nop
nop
nop
#endasm;
ClrBit(LCD_COM,LCD_E);
delay_ms(1);
ClrBit(LCD_COM,(LCD_CS1+LCD_CS2));
SetBit(LCD_COM,LCD_E);
delay_ms(1);
}
void WriteData(byte data, byte CS)
{
SetBit(LCD_COM,CS);
SetBit(LCD_COM,LCD_RS);
ClrBit(LCD_COM,LCD_RW);
#asm;
nop
nop
nop
#endasm;
LCD_DB=data;
SetBit(LCD_COM,LCD_E);
#asm;
nop
nop
nop
#endasm;
ClrBit(LCD_COM,LCD_E);
delay_ms(1);
ClrBit(LCD_COM,(LCD_CS1+LCD_CS2));
SetBit(LCD_COM,LCD_E);
delay_ms(1);
}
/*Координаты LCD*/
void WriteXY(byte x,byte y, byte CS)
{
WriteCom(0xb8+y,CS);
WriteCom(0x40+x,CS);
}
void wpixXY(byte x, byte y, byte CS)
{
WriteCom(0xb8 | y,CS);
WriteCom(0x40 | x,CS);
}
/*Иницилизация LCD*/
void init_lcd(void)
{
WriteXY(0,0,(LCD_CS1+LCD_CS2));
WriteCom(0xb8,(LCD_CS1+LCD_CS2));
WriteCom(0x40,(LCD_CS1+LCD_CS2));
WriteCom(0xc0,(LCD_CS1+LCD_CS2));
WriteCom(0x3f,(LCD_CS1+LCD_CS2));
}
/*Очистить LCD*/
void clear(void)
{
unsigned char x,y;
for(x = 0;x < 64;x++)
{
for(y = 0;y < 8;y++)
{
WriteXY(x,y,(LCD_CS1+LCD_CS2));
WriteData(0,(LCD_CS1+LCD_CS2));
}
}
}
/*заполнить LCD*/
void clearz(void)
{
unsigned char x,y;
for(x = 0;x < 64;x++)
{
for(y = 0;y < 8;y++)
{
WriteXY(x,y,(LCD_CS1+LCD_CS2));
WriteData(0xff,(LCD_CS1+LCD_CS2));
}
}
}
/**/
byte gotoxy(byte x, unsigned y)
{
unsigned char CS, textCS;
if(x < 10)
{
CS=LCD_CS1;
textCS=0;
}
else
{
CS=LCD_CS2;
textCS=64;
}
WriteXY(x*6-textCS+4,y,CS); //
return CS;
}
/**/
void putc (byte data, byte inv)
{
unsigned char textL, CS=gotoxy(textx,texty);
if(data < 0x90)
{
textL=0x20;
}
else
{
textL=0x60;
}
WriteData((sym[data-textL][0])^inv,CS);
WriteData((sym[data-textL][1])^inv,CS);
WriteData((sym[data-textL][2])^inv,CS);
WriteData((sym[data-textL][3])^inv,CS);
WriteData((sym[data-textL][4])^inv,CS);
WriteData(0^inv,CS);
if(textx < 19){ textx++; textx = xk;} else {textx=0; if(texty <
if(texty ==
}
/*Функция вывода строки из флеш памяти*/
void LCD_PUTSF(byte x, byte y, flash byte str[]){
byte i=0;
xk = textx;
yk = texty;
//Пока не конец строки выводим символы
while(str[i])
{
x++;
textx = x;
texty = y;
putc(str[i],in);
i++;
}
textx = xk;
texty = yk;
}
/*Функция которая ресует на экране 1 пиксел*/
void LCD_PUT_PIXEL(byte x, byte y){
//Обьявляем переменные
byte bite;
byte page;
byte data, data2;
//Выход если точка лежит вне экрана
if((x>127)|(y>63)) return;
//Выбираем кристалл
if(x>=64){
ClrBit(LCD_COM, LCD_CS1);
SetBit(LCD_COM, LCD_CS2);
x=x-64;
page = 0b00010000;
}
else{
ClrBit(LCD_COM, LCD_CS2);
SetBit(LCD_COM, LCD_CS1);
page = 0b00100000;
}
y/8;
x%8;
wpixXY(x, y, page);
WriteData(0b00000001, page);
}
/*Функция вывода прямой по алгоритму Брезенхома.
Подробно ее описывать не буду т.к. по ней лучше почитать в интернете*/
void LCD_LINE(byte x1, byte y1, byte x2, byte y2){
int dx,
.
.
.
и так рисуем линию:
void prog(void)
{
byte korX = 0;
byte korY = 0;
clear();
while(1)
{
if(PINA.7 == 0){
if(korX == 127){korX = 0; korY++;}else{korX++;}
if(korY == 63){korY = 0; }
//delay_ms(100);
//clearz();
LCD_PUT_PIXEL(korX, korY);
//
//LCD_CIRCLE(63, 63, 63);
//
}
}
}
void
.
.
.
-
BerZerK-ku
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
Re: Работа с графическими ЖКИ на контроллере KS0108 и аналог
Binary писал(а):Только работать я его пока не заставил((
Кто-нибудь пробовал его согласовывать с 3.3-вольтовой логикой?
У STM32 есть пины толерантные к 5В, поэтому никаких проблем с подключением нет.
- shurikss123
- Грызет канифоль
- Сообщения: 271
- Зарегистрирован: Пн окт 25, 2010 20:47:04
- Откуда: Казахстан, Астана
Re: Работа с графическими ЖКИ на контроллере KS0108 и аналог
В общем погонял я его попробовал, и сказал тфу. если честно его не везде можно использовать, медленный(очень), и те кто задумал делать на нем осциллограф, лучше не надо ничего не увидите на макс, его скорости.
-
BerZerK-ku
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
Re: Работа с графическими ЖКИ на контроллере KS0108 и аналог
shurikss123 писал(а):В общем погонял я его попробовал, и сказал тфу. если честно его не везде можно использовать, медленный(очень), и те кто задумал делать на нем осциллограф, лучше не надо ничего не увидите на макс, его скорости.
Вы бы тогда еще конкретные цифры привели. Какую максимальную скорость прорисовки экрана удалось получить? а скорость вывода 1 байта? да не плохо бы еще и свои исходники показать для этих случаев.
- shurikss123
- Грызет канифоль
- Сообщения: 271
- Зарегистрирован: Пн окт 25, 2010 20:47:04
- Откуда: Казахстан, Астана
Re: Работа с графическими ЖКИ на контроллере KS0108 и аналог
это есть в даташите и этих скоростей добился, еще если взять врямя на чтение, то дольще так что без чтения статуса прорисовка медленная, пробывалось все это на готовых данных которые не надо получать и читать....... , а если взять, на T6963 с чтением статуса, то его скорость явно превышает в несколько раз, несмотря на то что его временные задержки в 1,5 раза ниже.
-
BerZerK-ku
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
Re: Работа с графическими ЖКИ на контроллере KS0108 и аналог
А по конкретней? Просто сам периодически работаю с этим дисплеем, перерисовки страничек не замечаю. Флаг занятости проверяю.
- shurikss123
- Грызет канифоль
- Сообщения: 271
- Зарегистрирован: Пн окт 25, 2010 20:47:04
- Откуда: Казахстан, Астана
Re: Работа с графическими ЖКИ на контроллере KS0108 и аналог
BerZerK-ku писал(а):А по конкретней? Просто сам периодически работаю с этим дисплеем, перерисовки страничек не замечаю. Флаг занятости проверяю.
делаю так два рисунка на одном одна половина на другом другая и в цикл рисовать по очереди и смотрите на его тормоза
- БАТАРЕЙКУС
- Потрогал лапой паяльник
- Сообщения: 346
- Зарегистрирован: Сб фев 07, 2009 19:21:25
Re: Работа с графическими ЖКИ на контроллере KS0108 и аналог
я анимировонную картинку на этот индикатор выводил. скорости его для быстрого вывода явно нехватет, а как статический индикатор, он очень даже хорош
Мечтатель - не тот, кто сидит на диване и думает о несбыточном, а тот, кто всеми силами стремится воплотить несбыточное в реальность.
- shurikss123
- Грызет канифоль
- Сообщения: 271
- Зарегистрирован: Пн окт 25, 2010 20:47:04
- Откуда: Казахстан, Астана
Re: Работа с графическими ЖКИ на контроллере KS0108 и аналог
воть воть а люди на нем осцылы делают, а другие удивляются
я тут дrлал недавно под усилитль был сильно удивлен скорости контролера HD44780 весчь
http://www.youtube.com/watch?v=mEDGD_PjpcA
http://www.youtube.com/watch?v=mEDGD_PjpcA
Re: Работа с графическими ЖКИ на контроллере KS0108 и аналог
Здравствуйте! Купил дисплей wg12864c, с контроллером NT7608, с ks даташиты полностью совпадают. подключил все, провожу инициализацию по инструкции на 8 странице - дисплей не темнеет. Перепробовал уже все возможные варианты, с разными задержками... при опросе дисплея показывает только статус сброса, при этом корректно, т.е. что на ноге сброса - то от и возвращает. при этом бит on/off всегда в нуле равно как и бизи. Расскажите пожалуйста по порядку для чего каждая строка инициализации? То есть для чего его несколько раз сбрасывать при установке cs и rs, rw??? длительные задержки как то влияют на чтение команд? то есть если я между 1 и 0 на Е делаю задержку аж целых 20 миллисекунд он это скушает??? Какие у вас были проблемы при запуске дисплея и как вы их решали??? контраст подключен и работает. Подсветка не подключена.
-
BerZerK-ku
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
Re: Работа с графическими ЖКИ на контроллере KS0108 и аналог
Присмотрелся к дисплею по внимательнее, действительно недостатков хватает.shurikss123 писал(а):делаю так два рисунка на одном одна половина на другом другая и в цикл рисовать по очереди и смотрите на его тормоза
Я делаю это так:SkyFly писал(а):Расскажите пожалуйста по порядку для чего каждая строка инициализации?
Код: Выделить всё
uchar Init_lcd(void)
{
// инициализация дисплея
// возвращает 0 в конце
// вызов раз в 200 мкс
static uchar delay = 0;
static uchar step = 0;
if (step > 1)
{
if (CheckFlag())
return step;
}
switch(step)
{
case 0:
{
step = 1;
StBit(PORT_RST, LCD_RST); // установим RST
delay = 25;
}
break;
case 1:
{
if (delay > 0) // небольшая пауза после установки сигнала RST
delay--;
else
step = 2;
}
break;
case 2:
WriteLCD(COM, 0xb8, LCD_CS); // установка 0-ой страницы
step++;
break;
case 3:
WriteLCD(COM, 0x40, LCD_CS); // установка 0-ой строчки
step++;
break;
case 4:
WriteLCD(COM,0xc0,LCD_CS); // верхняя 0-ая строка
step++;
break;
case 5:
WriteLCD(COM,0x3f,LCD_CS); // включение дисплея
step = 0;
break;
}
return step;
}
static bool CheckFlag(void)
{
// Проверка флага занятости
// false - занято, true - норм
uchar data;
CrBit(PORT_RS, LCD_RS);
DDRA = 0;
StBit(PORT_CS, LCD_CS);
StBit(PORT_RW, LCD_RW);
_NOP();
_NOP();
StBit(PORT_E, LCD_E);
_NOP();
_NOP();
data = PINA;
CrBit(PORT_E, LCD_E);
_NOP();
//_delay_us(2);
CrBit(PORT_CS, LCD_CS);
StBit(PORT_E, LCD_E);
DDRA=0xff;
return (data & 0x80);
}
Re: Работа с графическими ЖКИ на контроллере KS0108 и аналог
А можно просто последовательность действий? ))
Re: Работа с графическими ЖКИ на контроллере KS0108 и аналог
Хм, заметил что он в ответ всегда возвращает то, что я ему только что отправил...
Может ли быть проблема в подключении?? Могут ли там быть какие то паразитные емкости которые мешают спаду 1 в 0???? Я подключал напрямую выводы контроллера к дисплею. Может надо через резистор или посадить все ноги через резистор на землю что бы разряжались?
Может ли быть проблема в подключении?? Могут ли там быть какие то паразитные емкости которые мешают спаду 1 в 0???? Я подключал напрямую выводы контроллера к дисплею. Может надо через резистор или посадить все ноги через резистор на землю что бы разряжались?
Re: Работа с графическими ЖКИ на контроллере KS0108 и аналог
Ссссори, заработало. ) Всему виной некачественное изготовление платы, подкорачивали дорожки к D1 D2. ))
Re: Работа с графическими ЖКИ на контроллере KS0108 и аналог
Спасибки что подсказали
немного потужился немного разобрался.. но все таки графику не рисует
/*Функция которая ресует на экране 1 пиксел*/
void LCD_PUT_PIXEL(byte x, byte y){
//Обьявляем переменные
byte bite, page, data = INV, data2;
if((x>127)|(y>63)) return;// Выход если точка лежит вне экрана
if(x>=64){ x = x - 64; data2 = 0b00010000;} else{data2 = 0b00100000;} //Выбираем кристалл
page = y/8; //page-номер страницы
bite = y%8; //bite-Номер байта который нам предстоит вывести
WriteXY(x, page, data2); // координаты вывода информации на LCD.
//Читаем байт с LCD(2 цикла т.к. в первом мусор)
//data = ReadData(); //????????
//data = ReadData();
data = data |(1<<bite);
WriteXY(x, page, data2);
WriteData(data, data2);
}
как я понял проблема с //data = ReadData();
функция не работает если раз комментировать рисует два квадратика и полоску и нефига больше.
в таком виде теряется часть пикселов (затераються)..
/*Функция которая ресует на экране 1 пиксел*/
void LCD_PUT_PIXEL(byte x, byte y){
//Обьявляем переменные
byte bite, page, data = INV, data2;
if((x>127)|(y>63)) return;// Выход если точка лежит вне экрана
if(x>=64){ x = x - 64; data2 = 0b00010000;} else{data2 = 0b00100000;} //Выбираем кристалл
page = y/8; //page-номер страницы
bite = y%8; //bite-Номер байта который нам предстоит вывести
WriteXY(x, page, data2); // координаты вывода информации на LCD.
//Читаем байт с LCD(2 цикла т.к. в первом мусор)
//data = ReadData(); //????????
//data = ReadData();
data = data |(1<<bite);
WriteXY(x, page, data2);
WriteData(data, data2);
}
как я понял проблема с //data = ReadData();
функция не работает если раз комментировать рисует два квадратика и полоску и нефига больше.
в таком виде теряется часть пикселов (затераються)..
-
AleksanderG
- Родился
- Сообщения: 18
- Зарегистрирован: Пт фев 04, 2011 11:42:18
Re: Работа с графическими ЖКИ на контроллере KS0108 и аналог
На сайте MCS Electronics есть интересный для меня проект AN #148 - LCD display with touchscreen and AVR. Подскажите пожалуста кто знает тип дисплея с функцией тачскрин-а на базе контроллера KS0108.
-
BerZerK-ku
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
Re: Работа с графическими ЖКИ на контроллере KS0108 и аналог
WG12864A-TGH-T#N010 со встроенной температурной компенсацией и сенсорной панелью.
Re: Работа с графическими ЖКИ на контроллере KS0108 и аналог
Помогите. Не могу включить. пин 5 (мон. выключен) в статусе не гаснет.
даю VH на RST,CH1
команду 3F и ничего....
movlf b'01000000',WGDL
bcf WG_RS
bcf WG_RW
nop
nop
bsf WG_E
pause 0x10
bcf WG_E
даю VH на RST,CH1
команду 3F и ничего....
movlf b'01000000',WGDL
bcf WG_RS
bcf WG_RW
nop
nop
bsf WG_E
pause 0x10
bcf WG_E
Поговорим в скайпе fl.ua.aaa.
