Ср окт 06, 2021 15:50:20
write_display(char data)
{
PORTB = data;
strob();
big_delay_us(60);
}
update_display()
{
for (int i = 0; i < W; i++) {
char cmd;
// позиционирование
WR = 0;
write_display(cmd1);
write_display(cmd2);
write_display(cmd3);
WR = 1;
// посылка данных
for (int i = 0; i < H / 8; i++) {
index = ...;
char data = buffer[index];
write_display(data);
}
}
Ср окт 06, 2021 16:54:11
лично мой код вроде такого, самодостаточный, без статиковWiseLord писал(а):У Вас там в любом случае есть код вроде такого:
void Screen_Update(void)
{
#ifdef ST7920
//ST7920
for(u8 y=0; y<32; y++){
low_WrComDat(0x80 + y, 1);//com
low_WrComDat(0x80 + 0, 1);//com
u16 s = (y * 16) & 0x0180;//0b110000000
const u8 mask = shift_1_left[y % 8];
for(u8 x=0; x<32; x++){
if(x == 16) s += 512;//0x0200
u16 p = (x % 16) * 8 + s;
u8 d = 0;
u8 m = 0b10000000;
for(u8 i=0; i<8; i++){
if(VIDEObuf[p + i] & mask) d += m;
m >>= 1;
}
low_WrComDat(d,0);//dat
}
}
#else
//KS0108
for(u8 y=0; y<8 ;y++){
low_WrComDat(0xb8+y, LCD_CS1, 1), low_WrComDat(0x40, LCD_CS1, 1);
for(u8 x=0; x<128; x++){
if(x == 64) low_WrComDat(0xb8+y, LCD_CS2, 1), low_WrComDat(0x40, LCD_CS2, 1);
low_WrComDat(VIDEObuf[y*128 + x], 0, 0);
}
}
#endif
}
Ср окт 06, 2021 18:48:20
Чт окт 07, 2021 09:01:17
просто я тогда не стал заморачиваться и оставил организацию буфера как у KS0107, для универсальности.WiseLord писал(а):биты раскладывать на этапе записи в буфер, а читать сразу готовые байты последовательно из массива.
Чт окт 07, 2021 11:50:08
Ну так в спортивном-то интересе самый смак. Мне и самому было бы интересно узнать, что из этого бы получилось, тем более что идею - что имнно и в каком порядке делать - для ST7920 я расписал. Для KS0108 принцип был бы тот же - постепенно избавиться от циклов, вынеся их переменные наружу.slav0n писал(а):не вижу смысла переделывать, разве что для спортивного интереса
Чт окт 07, 2021 12:31:41
Чт окт 07, 2021 12:39:17
давай разложим по полкам запись-чтение видеобуфера.WiseLord писал(а):Ну так в спортивном-то интересе самый смак.
Чт окт 07, 2021 13:33:48
Может, я не так выразился. Говоря о FPS, я имел в виду, сколько главных циклов в секунду может выполнять программа. Тут число вполне может поменяться с 15 на, например, 2000, если нет каких-то тяжёлых вычислений. Если есть (типа Фурье анализа того же) - может поменяться с 15 до, скажем например, 50.GoldenAndy писал(а):Скачка ФПС не будет. Ибо 80 мкс на команду никуда не денутся.
В целом, да. Я просто на основании своего опыта рассуждаю, когда в проекте анализатора спектра такое небольшое, казалось бы, изменение в коде позволило раза в 2 увеличить FPS.slav0n писал(а):при выводе текста никакой разницы.
выигрыш, казалось бы, при выводе графики, но, учитывая тормознутость матрицы, он тоже под вопросом.
Сб окт 09, 2021 22:37:37
void Screen_Update(void)
{
static u8 y = 0;
static s8 x = -2;
u16 s = (y * 16) & 0x0180;//0b110000000
const u8 mask = shift_1_left[y % 8];
u8 com = 1;
u8 d = 0;
if (x == -2) {
d = 0x80 + y;//com
} else if (x == -1) {
d = 0x80 + 0;//com
} else {
com = 0;
if (x == 16) s += 512;
u16 p = (x % 16) * 8 + s;
u8 m = 0b10000000;
for (u8 i = 0; i < 8; i++) {
if (VIDEObuf[p + i] & mask) d += m;
m >>= 1;
}
}
low_WrComDat(d, com);
if (++x >= 32) {
x = -2;
++y; y %= 32;
}
}
Вс окт 10, 2021 09:18:00
Пн окт 11, 2021 14:12:41
Вт окт 12, 2021 17:02:16
void Screen_Update(void)
{
static u8 y = 0;
static s8 x = -2;
u16 s = (y * 16) & 0x0180;//0b110000000
const u8 mask = shift_1_left[y % 8];
u8 com = 1;
u8 d = 0x80;
if (x == -2) {
d += y;//com
} else if (x == -1) {
// d = 0x80 + 0;//com
} else {
com = 0;
d = 0;
if (x == 16) s += 512;
u16 p = (x % 16) * 8 + s;
u8 m = 0b10000000;
for (u8 i = 0; i < 8; i++) {
if (VIDEObuf[p + i] & mask) d += m;
m >>= 1;
}
}
low_WrComDat(d, com);
if (++x >= 32) {
x = -2;
++y; y %= 32;
}
}
void Screen_Update(void)
{
static u8 y = 0;
static s8 x = -2;
u16 s = (y * 16) & 0x0180;//0b110000000
const u8 mask = shift_1_left[y % 8];
u8 com = 1;
u8 d = 0x80;
if (x >= 0){
com = 0;
d = 0;
if (x == 16) s += 512;
u16 p = (x % 16) * 8 + s;
u8 m = 0b10000000;
for (u8 i = 0; i < 8; i++) {
if (VIDEObuf[p + i] & mask) d += m;
m >>= 1;
}
} else if (x == -2) {
d += y;//com
}
low_WrComDat(d, com);
if (++x >= 32) {
x = -2;
++y; y %= 32;
}
}
Вт окт 12, 2021 17:47:02
Вт окт 12, 2021 18:50:36
Ср окт 13, 2021 13:06:39
void Screen_Update(void)
{
static u8 y = 0;
static s8 x = -2;
static u16 s = 0;
static u8 mask = 1;
u8 com = 1;
u8 d = 0x80;
if (x >= 0){
com = 0;
d = 0;
if (x == 16) s += 512;
u16 p = (x % 16) * 8 + s;
u8 m = 0b10000000;
for (u8 i = 0; i < 8; i++, m >>= 1) if (VIDEObuf[p++] & mask) d += m;
} else if (x == -2) {
d += y;//com
}
low_WrComDat(d, com);
if (++x >= 32) {
x = -2;
++y; y %= 32;
s = (y * 16) & 0x0180;//0b110000000
mask = 1 << (y % 8);
}
}
Ср окт 13, 2021 16:36:59
Ср окт 13, 2021 17:43:48
Сб ноя 04, 2023 13:45:08
Вт фев 27, 2024 20:51:27
Чт мар 14, 2024 18:55:02