2016-01-13 7 views
4

Я работаю над функцией построения символа в видеорежиме для режима 256 VGA. Я использую 6x7 шрифтов с набором, содержащим только заглавные буквы, цифры и знаки. Это данные:Построение символа в режиме VGA

uint8_t characters[455] = { 
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x50, 
    0x50,0x00,0x00,0x00,0x00,0x00,0x50,0xf8,0x50,0x50,0xf8,0x50,0x00,0x20,0xf8,0xa0, 
    0xf8,0x28,0xf8,0x00,0xc8,0xd0,0x20,0x20,0x58,0x98,0x00,0x40,0xa0,0x40,0xa8,0x90, 
    0x68,0x00,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x20,0x40,0x40,0x40,0x40,0x20,0x00, 
    0x20,0x10,0x10,0x10,0x10,0x20,0x00,0x50,0x20,0xf8,0x20,0x50,0x00,0x00,0x20,0x20, 
    0xf8,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x60,0x20,0x40,0x00,0x00,0x00,0xf8,0x00, 
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x08,0x10,0x20,0x40,0x80, 
    0x00,0x70,0x88,0x98,0xa8,0xc8,0x70,0x00,0x20,0x60,0x20,0x20,0x20,0x70,0x00,0x70, 
    0x88,0x08,0x70,0x80,0xf8,0x00,0xf8,0x10,0x30,0x08,0x88,0x70,0x00,0x20,0x40,0x90, 
    0x90,0xf8,0x10,0x00,0xf8,0x80,0xf0,0x08,0x88,0x70,0x00,0x70,0x80,0xf0,0x88,0x88, 
    0x70,0x00,0xf8,0x08,0x10,0x20,0x20,0x20,0x00,0x70,0x88,0x70,0x88,0x88,0x70,0x00, 
    0x70,0x88,0x88,0x78,0x08,0x70,0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x00,0x30,0x30, 
    0x00,0x30,0x10,0x20,0x00,0x00,0x10,0x20,0x40,0x20,0x10,0x00,0x00,0xf8,0x00,0xf8, 
    0x00,0x00,0x00,0x00,0x20,0x10,0x08,0x10,0x20,0x00,0x70,0x88,0x10,0x20,0x00,0x20, 
    0x00,0x70,0x90,0xa8,0xb8,0x80,0x70,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x00,0xf0, 
    0x88,0xf0,0x88,0x88,0xf0,0x00,0x70,0x88,0x80,0x80,0x88,0x70,0x00,0xe0,0x90,0x88, 
    0x88,0x90,0xe0,0x00,0xf8,0x80,0xf0,0x80,0x80,0xf8,0x00,0xf8,0x80,0xf0,0x80,0x80, 
    0x80,0x00,0x70,0x88,0x80,0x98,0x88,0x70,0x00,0x88,0x88,0xf8,0x88,0x88,0x88,0x00, 
    0x70,0x20,0x20,0x20,0x20,0x70,0x00,0x10,0x10,0x10,0x10,0x90,0x60,0x00,0x90,0xa0, 
    0xc0,0xa0,0x90,0x88,0x00,0x80,0x80,0x80,0x80,0x80,0xf8,0x00,0x88,0xd8,0xa8,0x88, 
    0x88,0x88,0x00,0x88,0xc8,0xa8,0x98,0x88,0x88,0x00,0x70,0x88,0x88,0x88,0x88,0x70, 
    0x00,0xf0,0x88,0x88,0xf0,0x80,0x80,0x00,0x70,0x88,0x88,0xa8,0x98,0x70,0x00,0xf0, 
    0x88,0x88,0xf0,0x90,0x88,0x00,0x70,0x80,0x70,0x08,0x88,0x70,0x00,0xf8,0x20,0x20, 
    0x20,0x20,0x20,0x00,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x88,0x88,0x88,0x88,0x50, 
    0x20,0x00,0x88,0x88,0x88,0xa8,0xa8,0x50,0x00,0x88,0x50,0x20,0x20,0x50,0x88,0x00, 
    0x88,0x50,0x20,0x20,0x20,0x20,0x00,0xf8,0x10,0x20,0x40,0x80,0xf8,0x00,0x60,0x40, 
    0x40,0x40,0x40,0x60,0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x30,0x10,0x10,0x10, 
    0x10,0x30,0x00,0x20,0x50,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8, 
    0x00,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8}; 

Для put_char функции, I'm вычисления смещения для массива путем умножения кода ASCII на 7 и вычитая 32 (так как я просто используя заглавные буквы). Тогда я итерацию по ширине и высоте размера шрифта (т.е. 6 и 7), чтобы построить пиксель, если я найду 1 и ничего не делать, если я найду 0.

void put_char(int x,int y,int ascii_char){ 
    int l,i,j,h,char_offset; 
    j,h,l,i=0; 
    char_offset = ascii_char*7-32; 
    printf("offset: %d\n",char_offset); 
    for (l = 0; l < 7; l++) { 
     for (i = 6; i > 0; i--) { 
      j++; 
      if ((characters[char_offset+l+j] & (1 << i))) { 

       plot_pixel(j+x, h+y, current_color); 
      } 
     } 
     h++; 
     j = 0; 
    } 
} 

Однако I'm не получают письмо напечатано правильно на экране. Я думаю, что у меня может возникнуть проблема расчета смещения, но я не знаю, где это. Я также сомневаюсь в том, что мой метод проверяет правильность числа 1 или 0. Может ли кто-нибудь помочь мне с этим?

EDIT:

Далее мы приводим картину того, что получение I'm (обратите внимание на зеленые пиксели на области рисования, те должны быть буква 'А'

enter image description here

EDIT 2:

Далее мы приводим картину того, что I'm получаю теперь, когда я изменил

char_offset = ascii_char*7-32; 

к

char_offset = (ascii_char-32)*7; 

подмигнули почти хорошо, однако левая сторона «А» как-то не хватает на черчения пикселей.

enter image description here

+0

Вы можете добавить скриншот? Могла бы сделать проблему мгновенно очевидной, не читая код, хотя то, что вы уже дали, - это много информации. Если вы напечатали пробел,! "И т. Д. В строке, то ошибка в вычислении смещения может быть мгновенно видна. – Tommy

+0

Привет, спасибо за ваши комментарии. @enhzflep У меня есть 1 байт на горизонтальную строку. Поэтому идея состоит в том, чтобы иметь 7 байты на битбитовый символ. –

+0

@Tommy. Я добавил, что скриншот того, что отображается –

ответ

2

Скорее всего, вы хотите:

char_offset = (ascii_char-32)*7; 

Если умножить на 7, а затем вычесть 32, то вам не будет достаточно вычитанием, так как вы хотите, чтобы переместить 32 символов назад, а не 32 пиксельные строки.

+0

за помощь. теперь я получил еще один снимок экрана, чтобы показать результат, который у меня есть. –

+2

Глядя на пиксельные данные, 6 пикселей каждой строки кажутся сдвинутыми влево на 2 пикселя, поэтому измените внутренний цикл 'for' на' для (i = 7; i> = 2; i--) {'. –

+0

Удивительный! Это сделал трюк. Большое спасибо –

 Смежные вопросы

  • Нет связанных вопросов^_^