【发布时间】:2016-01-14 01:19:17
【问题描述】:
我正在为 256 VGA 模式在视频模式下绘制一个字符的功能。 我正在使用 6x7 字体,该字体集仅包含大写字母、数字和符号。这是数据:
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 函数,我通过将 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;
}
}
但是,我没有在屏幕上正确打印这封信。我想我可能在计算偏移量时遇到问题,但我不知道它在哪里。我也怀疑我检查数字是 1 还是 0 的方法是否正确。谁能帮我解决这个问题?
编辑:
这是我得到的图片(注意绘图区域上的绿色像素,应该是字母“A”
编辑 2:
这是我改变后得到的图片
char_offset = ascii_char*7-32;
到
char_offset = (ascii_char-32)*7;
这几乎是好的,但是“A”的左侧在像素的绘图中不知何故丢失了。
【问题讨论】:
-
可以加个截图吗?尽管您已经提供了很多信息,但可能无需阅读代码就可以立即使问题变得明显。如果您在一行中打印空格、!、" 等,那么计算偏移量时的错误可能会立即显现出来。
-
您好,感谢您的 cmets。 @enhzflep 我每个水平行有 1 个字节。所以这个想法是每个字符位图有 7 个字节。
-
@Tommy。我添加了显示内容的屏幕截图
-
OT,但我必须问:这些屏幕截图是什么程序?
-
是我开发的