Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Народ поделитесь библиотекой SED1520 для дисплея MT-12232
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
TamTam
Ну или сурцом желательно для CVAVR
prottoss
Цитата(TamTam @ Jun 8 2006, 17:48) *
Ну или сурцом желательно для CVAVR




Смотри подпись ниже, есть и платный, есть и безплатный)))
TamTam
Цитата(prottoss @ Jun 8 2006, 15:09) *
Цитата(TamTam @ Jun 8 2006, 17:48) *
Ну или сурцом желательно для CVAVR

Смотри подпись ниже, есть и платный, есть и безплатный)))


чет я там ничего не нашол.
prottoss
Цитата(TamTam @ Jun 9 2006, 00:44) *
Цитата(prottoss @ Jun 8 2006, 15:09) *

Цитата(TamTam @ Jun 8 2006, 17:48) *
Ну или сурцом желательно для CVAVR

Смотри подпись ниже, есть и платный, есть и безплатный)))


чет я там ничего не нашол.




Да Вы, скорее всего, и не искали)

http://pinokio3000.narod.ru/sourches/sed1520.htm
TamTam
Цитата(prottoss @ Jun 8 2006, 20:59) *
Цитата(TamTam @ Jun 9 2006, 00:44) *
Цитата(prottoss @ Jun 8 2006, 15:09) *

Цитата(TamTam @ Jun 8 2006, 17:48) *
Ну или сурцом желательно для CVAVR

Смотри подпись ниже, есть и платный, есть и безплатный)))


чет я там ничего не нашол.




Да Вы, скорее всего, и не искали)

http://pinokio3000.narod.ru/sourches/sed1520.htm


с огромным удовольствием приобрелбы библу, новот былаб она под CVAVR
TamTam
Результатом поиска стали бве библы, но они к сожалению не под CVAVR, посмотрел, и понял что сам с переводом на CVAVR я не справлюсь, мож кто чем подмогнет

AVR_and_SED1520.rar - из протеуса,

MT12864_drv__1_.zip - любезно предоставлена "Alechin" за что ему огромный a14.gif
TamTam
Может есть у кого библа для CVAVR, для любого другого графического индекатора ???
otrog
Цитата с сайта МЭЛТ:
Цитата
А нет ли примера программы для вывода на ЖК индикатор?

Есть, вот архив с примерами программ для вывода на наши ЖК индикаторы. Программы написаны на подобии языка C и предназначены для пояснения алгоритмов работы с ЖКИ. Они подробно прокомментированы, но компилиться не будут - нужно доопределить функцию задержки времени и имена сигналов управления ЖКИ.

Архив:
http://melt.com.ru/files/file2032.zip
ROC
Что-то было на www.8052.com....
http://www.8052.com/codelib/lcd12864.rar - для AVR! не пугайтесь названия сайта . И даже по-моему под CodeVision smile.gif
proba
для GCC но легко переделать, :
схема самого простого генератора нег. напряжения с програмнои регулировкои контрастности.
prottoss
Цитата(proba @ Jun 10 2006, 15:39) *
для GCC но легко переделать, :
схема самого простого генератора нег. напряжения с програмнои регулировкои контрастности.




М-да, на счет самого простого Вы загнули)))

Вот простой...http://pinokio3000.narod.ru/sourches/sed1520.htm Боюсь слова самый, а вдруг кто проще придумает)))
asf
Новых примеров нет?
А то что-то не запускается зараза (AVR Studio+GCC) перепробовал все варианты, вкл. datasheet...

#define LCD_DISP_OFF 0xAE /* turn LCD panel OFF */
#define LCD_DISP_ON 0xAF /* turn LCD panel ON */
#define LCD_SET_LINE 0xC0 /* set line for COM0 (4 lsbs = ST3:ST2:ST1:ST0) */
#define LCD_SET_PAGE 0xB8 /* set page address (2 lsbs = P1:P0) */
#define LCD_SET_COL 0x00 /* set column address (6 lsbs = Y4:Y4:Y3:Y2:Y1:Y0) */
#define LCD_SET_ADC_NOR 0xA0 /* ADC set for normal direction */
#define LCD_SET_ADC_REV 0xA1 /* ADC set for reverse direction */
#define LCD_STATIC_OFF 0xA4 /* normal drive */
#define LCD_STATIC_ON 0xA5 /* static drive (power save) */
#define LCD_DUTY_16 0xA8 /* driving duty 1/16 */
#define LCD_DUTY_32 0xA9 /* driving duty 1/32 */
#define LCD_SET_MODIFY 0xE0 /* start read-modify-write mode */
#define LCD_CLR_MODIFY 0xEE /* end read-modify-write mode */
#define LCD_RESET 0xE2 /* soft reset command */
/* SED1520 is used with reverse direction (ADC_REV).
This value is the address of the leftmost column: */
#define LCD_STARTCOL_REVERSE 19
/* LCD screen and bitmap image array consants */
#define LCD_X_BYTES 122
#define LCD_Y_BYTES 3

#define LCD_PORT_DATA PORTC
#define LCD_DDR_DATA DDRC

#define LCD_PORT_CTRL PORTA
#define LCD_DDR_CTRL DDRA
#define LCD_A0 PA3
#define LCD_CMD LCD_A0
#define LCD_RW PA4
#define LCD_E PA5
#define LCD_RES PA6
#define LCD_CS PA7
#define LCD_CMD_MODE() LCD_PORT_CTRL &= ~(1<<LCD_CMD)
#define LCD_DATA_MODE() LCD_PORT_CTRL |= (1<<LCD_CMD)
#define LCD_ENABLE_E() LCD_PORT_CTRL &= ~(1<<LCD_E )
#define LCD_DISABLE_E() LCD_PORT_CTRL |= (1<<LCD_E )



void LCDinit(void)
{

// Переводим в исходное состояние линии управления ЖКИ:
// все выходы в нулевом состоянии, только CS1 и CS2 = "1".
LCD_DDR_CTRL |= (1 << LCD_CS) | (1 << LCD_RES) | (1 << LCD_E) | (1 << LCD_RW) | (1 << LCD_A0) ;
LCD_PORT_CTRL &= ~((1 << LCD_CS) | (1 << LCD_RES) | (1 << LCD_E) | (1 << LCD_RW) | (1 << LCD_A0) );
LCD_PORT_CTRL |= (1 << LCD_CS);
// Выполняем аппаратный сброс модуля. Паузы формируем программно, так как
// прерывания еще могут быть не разрешены.

LCD_PORT_CTRL |= ( (1<<LCD_CMD) | (1<<LCD_E) );
lcd_out_ctl(0);
lcd_out_ctl(LCD_RESET);
_delay_ms(100);
lcd_out_ctl(LCD_DISP_ON);
lcd_out_ctl(LCD_SET_ADC_REV); // !
lcd_out_ctl(LCD_SET_LINE+0);
lcd_out_ctl(LCD_SET_PAGE+0);
lcd_out_ctl(LCD_SET_COL+LCD_STARTCOL_REVERSE);

LCD_PORT_CTRL |= _BV(LCD_E);
LCD_PORT_CTRL &= ~_BV(LCD_RES);
_delay_loop_2(40);
LCD_PORT_CTRL |= _BV(LCD_RES);
_delay_loop_2(40);
WriteCodeL(0xE2);//Reset
_delay_loop_2(40);
WriteCodeR(0xE2);//Reset
_delay_loop_2(40);
WriteCodeL(0xEE);//ReadModifyWrite off
_delay_loop_2(40);
WriteCodeR(0xEE);//ReadModifyWrite off
_delay_loop_2(40);
WriteCodeL(0xA4);//Включить обычный режим
_delay_loop_2(40);
WriteCodeR(0xA4);//Включить обычный режим
_delay_loop_2(40);
WriteCodeL(0xA9);//Мультиплекс 1/32
_delay_loop_2(40);
WriteCodeR(0xA9);//Мультиплекс 1/32
_delay_loop_2(40);
WriteCodeL(0xC0);//Верхнюю строку на 0
_delay_loop_2(40);
WriteCodeR(0xC0);//Верхнюю строку на 0
_delay_loop_2(40);
WriteCodeL(0xA1);//Invert scan RAM
_delay_loop_2(40);
WriteCodeR(0xA0);//NonInvert scan RAM
_delay_loop_2(40);
WriteCodeL(0xAF);//Display on
_delay_loop_2(40);
WriteCodeR(0xAF);//Display on
_delay_loop_2(40);

}


void WriteByte(char b, int cd, int lr)
{
//При необходимости настроить здесь шину данных на вывод
LCD_PORT_CTRL &= ~_BV(LCD_RW);// LCD.RW=0;
if (cd==1) LCD_PORT_CTRL |= _BV(LCD_A0); else LCD_PORT_CTRL &= ~_BV(LCD_A0);// LCD.A0=cd; //Выдача байта в индикатор как данных или команды
if (lr==1) LCD_PORT_CTRL |= _BV(LCD_CS); else LCD_PORT_CTRL &= ~_BV(LCD_CS);// LCD.CS=lr;
LCD_PORT_DATA = b;// LCD.D=b; //Выбрать кристалл индикатора и выдать байт на шину данных индикатора
_delay_loop_2(70); //Это время предустановки адреса (tAW)
LCD_PORT_CTRL &= ~_BV(LCD_E); // LCD.E=0;
_delay_loop_2(240); //Длительность сигнала E=0 (время предустановки данных попало сюда (tDS))
LCD_PORT_CTRL |= _BV(LCD_E); // LCD.E=1;
_delay_ms(10); //Минимально допустимый интервал между сигналами E=0
}


void WriteCodeL(char cool.gif { WriteByte(b,0,1); }//Команду в левый кристалл индикатора
void WriteCodeR(char cool.gif { WriteByte(b,0,0); }//Команду в правый кристалл индикатора

void WriteDataL(char cool.gif { WriteByte(b,1,1); }//Данные в левую половину индикатора
void WriteDataR(char cool.gif { WriteByte(b,1,0); }//Данные в правую половину индикатора


ну и в main

LCDinit();
for(p=0; p<4; p++) {//Цикл по всем 4-м страницам индикатора
WriteCodeL(p|0xB8);//Установка текущей страницы для левого кристалла индикатора
WriteCodeL(0x13);//Установка текущего адреса для записи данных в левую отображаемую позицию левой половины индикатора
for(c=0; c<61; c++) {//Цикл вывода данных в левую половину индикатора
WriteDataL(Logo122[p][c]);//Вывод очередного байта в индикатор
}
WriteCodeR(p|0xB8);//Установка текущей страницы для правого кристалла индикатора
WriteCodeR(0x00);//Установка текущего адреса для записи данных в левую отображаемую позицию правой половины индикатора
for(c=61; c<122; c++) {//Цикл вывода данных в правую половину индикатора
WriteDataR(Logo122[p][c]);//Вывод очередного байта в индикатор
}
}

----
может хня какая-то с задержками опять? у меня atmega16 8Mhz

ни у кого нет работающего минимального кода для GCC ? а то может быть что с МЭЛТом?
prottoss
Цитата(asf @ Dec 6 2006, 23:08) *
Код
void WriteByte(char b, int cd, int lr)
{
//При необходимости настроить здесь шину данных на вывод
LCD_PORT_CTRL &= ~_BV(LCD_RW);// LCD.RW=0;
if (cd==1) LCD_PORT_CTRL |= _BV(LCD_A0); else LCD_PORT_CTRL &= ~_BV(LCD_A0);// LCD.A0=cd; //Выдача байта в индикатор как данных или команды
if (lr==1) LCD_PORT_CTRL |= _BV(LCD_CS); else LCD_PORT_CTRL &= ~_BV(LCD_CS);// LCD.CS=lr;
LCD_PORT_DATA = b;// LCD.D=b; //Выбрать кристалл индикатора и выдать байт на шину данных индикатора
_delay_loop_2(70); //Это время предустановки адреса (tAW)
LCD_PORT_CTRL &= ~_BV(LCD_E); // LCD.E=0;
_delay_loop_2(240); //Длительность сигнала E=0 (время предустановки данных попало сюда (tDS))
LCD_PORT_CTRL |= _BV(LCD_E); // LCD.E=1;
_delay_ms(10); //Минимально допустимый интервал между сигналами E=0
}

----
может хня какая-то с задержками опять? у меня atmega16 8Mhz
ни у кого нет работающего минимального кода для GCC ? а то может быть что с МЭЛТом?




70 и 240 - это в микросекундах??? Откуда такие цифры? По моему, есть время цикла (по МЭЛТовскому даташиту), которое равно 1000 НС, и время предустановки адреса - 20 НС - это время вообще можно игнорировать...

Вы не смотрели исходник, ссылку на который я давал выше? Там полностью рабочий пример инициализации со всеми задержками и комментариями... Думаю в GCC его переделать пара пустяков...
asf
Смотрел, пробовал уже все, что-то не так......
распаял кабель на LPT, проверил с компа - живет.....
может глаза замылились?

#define LCD_PORTDATA PORTC
#define LCD_DDRDATA DDRC
#define LCD_PINDATA PINC

#define LCD_PORTCONTROL PORTA
#define LCD_DDRCONTROL DDRA
#define LCD_wire_A0 PA3
#define LCD_wire_RW PA4
#define LCD_wire_E PA5
#define LCD_RES PA6
#define LCD_wire_CS PA7

LCD_PORTDATA = 0x00;
LCD_DDRDATA = 0xFF;
LCD_PORTCONTROL = 0x00;
LCD_DDRCONTROL = 0xFF;

LCD_PORTCONTROL |= _BV(LCD_wire_E); // LCD.E=1;//Начальное значение сигнала индикатору
LCD_PORTCONTROL &= ~_BV(LCD_RES); // LCD.RES=0;//Выдать сигнал RES=0 индикатору
_delay_us(100); // Задержка на время больше 10 мкс
LCD_PORTCONTROL |= _BV(LCD_RES); // LCD.RES=1;//Снять сигнал RES
_delay_ms(5); // Delay(>1ms);//Задержка на время больше 1 мс
WriteCodeL(0xE2);//Reset
WriteCodeR(0xE2);//Reset
WriteCodeL(0xEE);//ReadModifyWrite off
WriteCodeR(0xEE);//ReadModifyWrite off
WriteCodeL(0xA4);//Включить обычный режим
WriteCodeR(0xA4);//Включить обычный режим
WriteCodeL(0xA9);//Мультиплекс 1/32
WriteCodeR(0xA9);//Мультиплекс 1/32
WriteCodeL(0xC0);//Верхнюю строку на 0
WriteCodeR(0xC0);//Верхнюю строку на 0
WriteCodeL(0xA1);//Invert scan RAM
WriteCodeR(0xA0);//NonInvert scan RAM
WriteCodeL(0xAF);//Display on
WriteCodeR(0xAF);//Display on


for(p=0; p<4; p++) {//Цикл по всем 4-м страницам индикатора
WriteCodeL(p|0xB8);//Установка текущей страницы для левого кристалла индикатора
WriteCodeL(0x13);//Установка текущего адреса для записи данных в левую отображаемую позицию левой половины индикатора
for(c=0; c<61; c++) {//Цикл вывода данных в левую половину индикатора
WriteDataL(Logo122[p][c]);//Вывод очередного байта в индикатор
}
WriteCodeR(p|0xB8);//Установка текущей страницы для правого кристалла индикатора
WriteCodeR(0x00);//Установка текущего адреса для записи данных в левую отображаемую позицию правой половины индикатора
for(c=61; c<122; c++) {//Цикл вывода данных в правую половину индикатора
WriteDataR(Logo122[p][c]);//Вывод очередного байта в индикатор
}
}

// Установка цикла обмена по шине данных
#define LCD_StrCYC() (LCD_PORTCONTROL |= LCD_wire_E) // начало цикла обмена данными
#define LCD_EndCYC() (LCD_PORTCONTROL &= ~LCD_wire_E) // окончание цикла обмена данными

//Процедура выдачи байта в индикатор
void WriteByte(char b, int cd, int lr)
{
//При необходимости настроить здесь шину данных на вывод
// LCD.RW=0; LCD.A0=cd; //Выдача байта в индикатор как данных или команды
LCD_PORTCONTROL &= ~_BV(LCD_wire_RW);
if (cd) LCD_PORTCONTROL |= _BV(LCD_wire_A0); else LCD_PORTCONTROL &= ~_BV(LCD_wire_A0);
// LCD.CS=lr; LCD.D=b; //Выбрать кристалл индикатора и выдать байт на шину данных индикатора
if (lr) LCD_PORTCONTROL |= _BV(LCD_wire_CS); else LCD_PORTCONTROL &= ~_BV(LCD_wire_CS);
LCD_PORTDATA = b;
_delay_us(100); //Это время предустановки адреса (tAW)
LCD_StrCYC(); // начало строба
LCD_EndCYC(); // конец строба
}

void WriteCodeL(char cool.gif { WriteByte(b,0,1); }//Команду в левый кристалл индикатора
void WriteCodeR(char cool.gif { WriteByte(b,0,0); }//Команду в правый кристалл индикатора

void WriteDataL(char cool.gif { WriteByte(b,1,1); }//Данные в левую половину индикатора
void WriteDataR(char cool.gif { WriteByte(b,1,0); }//Данные в правую половину индикатора
prottoss
А зачем ресетом рулить? ИМХО где то здесь косяк может быть, я когда начинал с граф. ЖКИ работать помнится тоже траблы были, пока не пришпилил его жестко через RC-цепь... Если все же хочется контроллером рулить RESET, то надо все равно предусмотреть установку этой линии в исходное состояние автоматом...
asf
Цитата(prottoss @ Dec 7 2006, 13:09) *
А зачем ресетом рулить? ИМХО где то здесь косяк может быть, я когда начинал с граф. ЖКИ работать помнится тоже траблы были, пока не пришпилил его жестко через RC-цепь... Если все же хочется контроллером рулить RESET, то надо все равно предусмотреть установку этой линии в исходное состояние автоматом...


пофиг sad.gif cranky.gif
prottoss
Цитата(asf @ Dec 7 2006, 17:28) *
пофиг sad.gif cranky.gif
Ну а в AVRStudio отлаживали?... логика сигналов и т.п.....
asf
//************************************************************
#define F_CPU 8000000UL // 8 MHz Задаем частоту процессора *
#include <util/delay.h>
//************************************************************

#include <avr/io.h>
#include <avr/interrupt.h>
//***LCD МЭЛТ
const char Logo122[4][122]=//122x32 pixel, каждые 8 вертикальных точек собраны в байт
{
{ 0xFF,0x01,0x01,0x01,0x01,0xC1,0xE1,0xB1,0x11,0x1D,0x1D,0x7F,0x7F,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0xFD,0xF9,0xB1,
0xF1,0xE1,0x81,0x01,0x01,0x01,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,
0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,
0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,
0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,
0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,
0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xFF
},
{ 0xFF,0xE0,0x7C,0x7F,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0x6F,0x6F,0x07,
0x07,0x06,0x00,0x00,0x03,0x03,0x0F,0x3F,0x07,0x07,0x07,0x03,0x03,0x07,0x0F,0x3B,
0x13,0x80,0x80,0x23,0x9E,0xF8,0xF8,0xF8,0xFC,0xFE,0xFE,0xFE,0xFC,0x00,0x00,0x00,
0x80,0x80,0xE0,0xF8,0xFC,0xFE,0xFE,0xFE,0xFC,0x00,0x00,0x00,0x60,0xF0,0xF8,0xF8,
0x7C,0x3E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x3E,0x3E,0x7E,0xFC,0xF8,0xF0,0xE0,
0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xE0,0xF8,0xFC,0xFE,
0xFE,0xFE,0xFE,0xFC,0x00,0x1C,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0xFE,0xFE,0xFE,
0xFE,0xFE,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x1C,0xFF
},
{ 0xFF,0x07,0x7C,0xE0,0x80,0x00,0x1F,0x3F,0xFF,0xFF,0xFF,0xFF,0x0F,0x30,0x38,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
0xE0,0xF0,0xFC,0xFF,0xFF,0x3F,0x0F,0x03,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0xFE,0xFF,
0x7F,0x7F,0x1F,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x18,0x3C,0x7E,0x7E,0x7E,0x7E,0x7E,0x7E,0x3C,0x3C,0x18,0x00,0x00,0x01,0xFF,
0xFF,0xFF,0xFF,0x00,0x00,0x80,0xE0,0xF0,0xFC,0xFE,0xFF,0x7F,0x1F,0x07,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,
0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF
},
{
0xFF,0x80,0x80,0x80,0x80,0x83,0x86,0x8C,0x98,0xB0,0xB0,0xE0,0xC0,0xC0,0x80,0x80,
0x80,0x80,0x80,0x80,0x80,0x80,0xC0,0xC0,0xC0,0xC0,0xC0,0xE0,0xF8,0xFC,0xFF,0xFF,
0xBF,0x8F,0x87,0x81,0x80,0x80,0x80,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0x9F,0x83,0x80,
0x80,0x80,0x80,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x80,0x80,0x86,0x8F,0x9F,0xBF,
0xFE,0xFC,0xF8,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF8,0xF8,0xFC,0xFE,0xBF,0x9F,0x8F,
0x87,0xE3,0xF9,0xFC,0xFF,0xFF,0xBF,0x9F,0x87,0x81,0x80,0x80,0x80,0x80,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xFF,0xFF,0xFF,
0xFF,0xFF,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xFF
}
};

#define LCD_PORTDATA PORTC
#define LCD_DDRDATA DDRC
#define LCD_PINDATA PINC

#define LCD_PORTCONTROL PORTA
#define LCD_DDRCONTROL DDRA
#define LCD_wire_A0 PA3
#define LCD_wire_RW PA4
#define LCD_wire_E PA5
#define LCD_RES PA6
#define LCD_wire_CS PA7

//*****************************************************************************
//Низкоуровневые команды
//******************************************************************************/
// Установка цикла обмена по шине данных
#define LCD_StrCYC() {LCD_PORTCONTROL &= ~_BV(LCD_wire_E);} // начало цикла обмена данными
#define LCD_EndCYC() {LCD_PORTCONTROL |= _BV(LCD_wire_E);} // окончание цикла обмена данными


//Процедура выдачи байта в индикатор
void WriteByte(char b, int cd, int lr)
{
LCD_PORTCONTROL &= ~(_BV(LCD_wire_E)); // LCD.E=0;//Начальное значение сигнала индикатору
// LCD.RW=0; LCD.A0=cd; //Выдача байта в индикатор как данных или команды
if (cd) LCD_PORTCONTROL |= (_BV(LCD_wire_A0)); else LCD_PORTCONTROL &= ~(_BV(LCD_wire_A0));
// LCD.CS=lr; LCD.D=b; //Выбрать кристалл индикатора и выдать байт на шину данных индикатора
if (lr) LCD_PORTCONTROL |= (_BV(LCD_wire_CS)); else LCD_PORTCONTROL &= ~(_BV(LCD_wire_CS));
LCD_PORTDATA = b;
_delay_us(1);
LCD_StrCYC(); // начало строба
LCD_EndCYC(); // конец строба
_delay_us(10);
}

void WriteCodeL(char cool.gif { WriteByte(b,0,1); }//Команду в левый кристалл индикатора
void WriteCodeR(char cool.gif { WriteByte(b,0,0); }//Команду в правый кристалл индикатора

void WriteDataL(char cool.gif { WriteByte(b,1,1); }//Данные в левую половину индикатора
void WriteDataR(char cool.gif { WriteByte(b,1,0); }//Данные в правую половину индикатора
//***LCD МЭЛТ



int main(void) {
int p;//Номер текущей страницы индикатора
int c;//Позиция по горизонтали выводимого байта


ASSR &= ~_BV(AS2); //Clear AS2 bit PC7 and PC6
// для PC5 и PC4 и PC3 и PC2 - JTAGEN Fuse поставить галку т.е. отключить JTAG
TWCR &= ~(_BV(TWEN)); //Clear TWEN bit PC1
ADCSRA &= ~(_BV(ADEN)); //Clear all ADC on portA

LCD_PORTDATA = 0x00;
LCD_DDRDATA = 0xFF;
LCD_PORTCONTROL = 0x00;
LCD_DDRCONTROL = 0xFF;


LCD_PORTCONTROL |= _BV(LCD_wire_E); // LCD.E=1;//Начальное значение сигнала индикатору
LCD_PORTCONTROL &= ~_BV(LCD_RES); // LCD.RES=0;//Выдать сигнал RES=0 индикатору
LCD_PORTCONTROL |= _BV(LCD_RES); // LCD.RES=1;//Снять сигнал RES
WriteCodeL(0xE2);//Reset
WriteCodeR(0xE2);//Reset
WriteCodeL(0xEE);//ReadModifyWrite off
WriteCodeR(0xEE);//ReadModifyWrite off
WriteCodeL(0xA4);//Включить обычный режим
WriteCodeR(0xA4);//Включить обычный режим
WriteCodeL(0xA9);//Мультиплекс 1/32
WriteCodeR(0xA9);//Мультиплекс 1/32
WriteCodeL(0xC0);//Верхнюю строку на 0
WriteCodeR(0xC0);//Верхнюю строку на 0
WriteCodeL(0xA1);//Invert scan RAM
WriteCodeR(0xA0);//NonInvert scan RAM
WriteCodeL(0xAF);//Display on
WriteCodeR(0xAF);//Display on

for(p=0; p<4; p++) {//Цикл по всем 4-м страницам индикатора
WriteCodeL(p|0xB8);//Установка текущей страницы для левого кристалла индикатора
WriteCodeL(0x13);//Установка текущего адреса для записи данных в левую отображаемую позицию левой половины индикатора
for(c=0; c<61; c++) {//Цикл вывода данных в левую половину индикатора
WriteDataL(Logo122[p][c]);//Вывод очередного байта в индикатор
}
WriteCodeR(p|0xB8);//Установка текущей страницы для правого кристалла индикатора
WriteCodeR(0x00);//Установка текущего адреса для записи данных в левую отображаемую позицию правой половины индикатора
for(c=61; c<122; c++) {//Цикл вывода данных в правую половину индикатора
WriteDataR(Logo122[p][c]);//Вывод очередного байта в индикатор
}
}

while(1)
{
}


} //main
prottoss
не пойму надобность демонстрировать один и тот же исходник при чем без комментарив...
asf
Цитата(prottoss @ Dec 7 2006, 18:01) *
не пойму надобность демонстрировать один и тот же исходник при чем без комментарив...

это рабочий вариант
prottoss
Цитата(asf @ Dec 7 2006, 22:15) *
Цитата(prottoss @ Dec 7 2006, 18:01) *

не пойму надобность демонстрировать один и тот же исходник при чем без комментарив...

это рабочий вариант
А зачем const char Logo122[4][122]=// кому это надо???? Можно было просто исходник приаттачить и коментарии к нему...
asf
Цитата(prottoss @ Dec 7 2006, 18:34) *
Цитата(asf @ Dec 7 2006, 22:15) *
Цитата(prottoss @ Dec 7 2006, 18:01) *

не пойму надобность демонстрировать один и тот же исходник при чем без комментарив...

это рабочий вариант
А зачем const char Logo122[4][122]=// кому это надо???? Можно было просто исходник приаттачить и коментарии к нему...

нужно таким, как я - новичкам
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.