Новых примеров нет?
А то что-то не запускается зараза (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

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

{ WriteByte(b,0,0); }//Команду в правый кристалл индикатора
void WriteDataL(char

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

{ 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 ? а то может быть что с МЭЛТом?