BigallS писал(а):Хотелось бы посмотреть схему и исходники, имеется Atmega 16 и дисплей от 128x128 от нокии
Вот, пока сам не забыл и не разобрал (атмега16 тоже пойдёт, про дисп от нокии не знаю):

Схема у меня в творческом беспорядке спаяна, основной целью сейчас было получить процедуру с оптимизированной скоростью отрисовки для последующего применения в полезных изделиях, на ARM.
Исходники тоже не причёсанные, в личку могу скинуть "как есть", но я в теме уже в общем всё выложил, читай 2-3 страницы вверх, там написано про оптимизацию кода.
Для максимальной скорости, кусок кода вывода байта данных через сдвиговый регистр на экран, сейчас переписал на ассемблер (вставляется в си код компилятора WinAVR) (в переменной
cc изначально должен быть байт данных, который отправляем на экран):
Код: Выделить всё
unsigned char cc,mm,mm2,mm3;
...
asm volatile(
"in %[mm],%[pp]" "\n\t" // mm = PORTC
"out %[pd],%[cc]" "\n\t" // PORTD = cc
"andi %[mm], 0xC7" "\n\t" // LCD_IRCP = 0 LCD_CLK = 0 LCD_IRLD = 0
"out %[pp], %[mm]" "\n\t" // PORTC = mm (SET IRCP & CLOCK = 0 & LOAD)
"in %[mm3], %[pp]" "\n\t" // mm3 = mm;
"ori %[mm3], 0x28" "\n\t" // LOAD = 1 & LCD_CLK = 1
"out %[pp], %[mm3]" "\n\t" // PORTC = END OF LOAD & LCD_CLK = 1
"in %[mm2],%[pp]" "\n\t" // mm2 = mm3
"ori %[mm2], 0x10" "\n\t" // LCD_IRCP = 1
"andi %[mm2], 0xF7" "\n\t" // LCD_CLK = 0
"out %[pp], %[mm2]" "\n\t" // LCD_IRCP = 1 & LCD_CLK = 0
"out %[pp], %[mm3]" "\n\t" // LCD_IRCP = 0 & LCD_CLK = 1
"out %[pp], %[mm2]" "\n\t" // LCD_IRCP = 1 & LCD_CLK = 0
"out %[pp], %[mm3]" "\n\t" // LCD_IRCP = 0 & LCD_CLK = 1
"out %[pp], %[mm2]" "\n\t" // LCD_IRCP = 1 & LCD_CLK = 0
"out %[pp], %[mm3]" "\n\t" // LCD_IRCP = 0 & LCD_CLK = 1
"swap %[cc]" "\n\t" // cc 3..0 <=> cc 7..4
"out %[pd], %[cc]" "\n\t" // PORTD = cc
"out %[pp], %[mm]" "\n\t" // PORTC = mm (SET IRCP & CLOCK = 0 & LOAD)
"out %[pp], %[mm3]" "\n\t" // LCD_IRCP = 0 & LCD_CLK = 1
"out %[pp], %[mm2]" "\n\t" // LCD_IRCP = 1 & LCD_CLK = 0
"out %[pp], %[mm3]" "\n\t" // LCD_IRCP = 0 & LCD_CLK = 1
"out %[pp], %[mm2]" "\n\t" // LCD_IRCP = 1 & LCD_CLK = 0
"out %[pp], %[mm3]" "\n\t" // LCD_IRCP = 0 & LCD_CLK = 1
"out %[pp], %[mm2]" "\n\t" // LCD_IRCP = 1 & LCD_CLK = 0
"out %[pp], %[mm3]" "\n\t" // LCD_IRCP = 0 & LCD_CLK = 1
"out %[pp], %[mm2]" "\n\t" // LCD_IRCP = 1 & LCD_CLK = 0
: [mm]"=a" (mm), [mm2]"=a" (mm2), [mm3]"=a" (mm3)
: [pp]"I" (_SFR_IO_ADDR(PORTC)), [pd]"I" (_SFR_IO_ADDR(PORTD)), "[mm]" (mm), "[mm2]" (mm2), "[mm3]" (mm3), [cc]"a" (cc)
);
Я не использовал более очевидные sbi, cbi команды, потому что они в 2 машинных цикла выполняются. Все команды в моём исходнике - в 1 цикл выполняются, в итоге за 27 машинных циклов отрисовывается 1 байт на экран, быстрей уже не сделать.