[
]12点阵汉字在HD系列机型中的应用-屏幕显示-打印
12点阵汉字在HD系列机型中的应用
在设备屏幕上显示输出
在III型机打印输出
一、加载字库
通常加载字库有两种方式:内嵌常量式,外部参数文件形式
内嵌变量式是指将字库点阵的内容以常量的形式写在程序源码中,如下文
unsigned char FontPattern[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x10, 0x00,
0x00, 0x00,
0x00, 0x6C, 0x48, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
…………
0x21, 0x00, 0x79, 0x00, 0x49, 0x40, 0x7B, 0xE0, 0x49, 0x40, 0xFD, 0x40, 0x95, 0x40, 0xFD, 0x40, 0x01, 0x40, 0xFD, 0x50, 0x2A, 0x50, 0xCC, 0x70,
0x10, 0x00, 0x3D, 0xF0, 0x24, 0x40, 0x3C, 0x40, 0x24, 0x40, 0x7F, 0xF0, 0x52, 0x40, 0x7E, 0x40, 0x00, 0x40, 0xFF, 0x40, 0x24, 0x40, 0xC4, 0x40,
0x20, 0x80, 0x7B, 0xF0, 0x49, 0xC0, 0x7A, 0xA0, 0x4C, 0x90, 0xFB, 0xE0, 0xAA, 0x20, 0xFB, 0xE0, 0x02, 0x20, 0xFF, 0xE0, 0x48, 0x00, 0x8B, 0xF0
};
显示函数在调用时直接使用该参数即可,程序下载到手持机即可直接使用。
外部参数文件形式是指将字库文件要外部基本参数的形式下载到手持机
中,需要手持机程序在开机的时候检查该参数文件是否存在,如果不存在,则提
示下载该参数文件,如果存在,则加载该内容。
unsigned char * FontPattern;
typedef union
{
unsigned char s_char[4];
unsigned long l_word;
} typ_long2char;
/*以下部分为字库程序启动时
加载*/
{
unsigned char tmpbuffer[16];
typ_long2char tmplc;
memcpy(tmpbuffer, (char *)Font12Addr, 8); if (memcmp(tmpbuffer, "\xf0\x0f\x00\xff", 4) == 0)
{
memcpy(tmplc.s_char, tmpbuffer + 4, 4);
Font12Length = tmplc.l_word; //获得字库长度
FontPattern = malloc(Font12Length);
if (FontPattern == NULL)
{
//提示内存分配失败,程序将无法正常运行
}
memcpy(FontPattern, (char *)(Font12Addr + 8), Font12Length);
}
else
{
//提示字库文件未下载
}
}
/*加载完成*/
/*以下部分为字库文件下载*/
void down_font(void)
{
unsigned char * frwBuffer;
long DataLength;
int tcnt;
frwBuffer = malloc(0x40000);
if (frwBuffer == NULL)
{
DispStr_CE(0, 1, "内存分配失败", DISP_POSITION | DISP_CLRSCR);
DispStr_CE(0, 6, "按任意键返回", DISP_POSITION);
PressAnyKey();
}
else
{
DataLength = DownLoadData("font12", frwBuffer + 8, 0x40000);
if (DataLength > 0)
{
memcpy(frwBuffer, "\xf0\x0f\x00\xff", 4);
tmplc.l_word = DataLength;
memcpy(frwBuffer + 4, tmplc.s_char, 4);
if ((DataLength % 2) != 0)
DataLength ++;
DataLenght += 8;
for(tcnt = 0; tcnt < 4; tcnt ++)
{
if(FLASH_erase_block_2((char *)Font12Addr + tcnt *
0x10000) != 0)
break;
}
if (tcnt != 4)
{
DispStr_CE(0, 1, "操作失败(1)", DISP_POSITION |
DISP_CLRSCR);
DispStr_CE(0, 6, "按任意键返回", DISP_POSITION);
ErrorBeep(0);
free(frwBuffer);
PressAnyKey();
}
else
{
if (FLASH_write_data_8M(Font12Addr, frwBuffer,
DataLength) != 1)
{
DispStr_CE(0, 0, "操作失败(2)", DISP_POSITION |
DISP_CLRSCR);
DispStr_CE(0, 6, "按任意键返回", DISP_POSITION);
ErrorBeep(0);
free(frwBuffer);
PressAnyKey();
}
else
{
DispStr_CE(0, 0, "操作成功", DISP_POSITION |
DISP_CLRSCR);
DispStr_CE(0, 6, "按任意键返回", DISP_POSITION);
RightBeep();
free(frwBuffer);
PressAnyKey();
}
}
}
else
{
DispStr_CE(0, 0, "操作失败", DISP_POSITION | DISP_CLRSCR);
DispStr_CE(0, 6, "按任意键返回", DISP_POSITION);
ErrorBeep(0);
free(frwBuffer);
PressAnyKey();
}
}
}
二、显示输出
上文中,我们已经将字库字模变量加载到手持机中,那么我们就可以进行
显示操作了。
在点阵字库原理中,我已经已经阐明了字模的组成,每个点都是以1或0
示。
void DispStr_Font12(int x, int y, char * s, char r)
{
unsigned char buffer[24];
int i, j, k;
unsigned char qh, wh, ascii, r1, r2;
unsigned long location;
if (r == 0)
{
r1 = 1;
r2 = 0;
}
else
{
r1 = 0;
r2 = 1;
}
while(*s)
{
ascii = *(s);
if (ascii >= 32 && ascii < 128 )
{
location = (ascii - 32) * 12L;
memcpy(buffer, FontPattern + location, 12);
for(i = 0; i < 12; i ++)
for(k = 0; k < 8; k ++)
if((buffer[ i ] >> (7 - k)) & 0x1)
put_pixel(x + k, y + i, r1, DISP_PUT_MODE_PUT);
else
put_pixel(x + k, y + i, r2, DISP_PUT_MODE_PUT);
s += 1;
x += 6;
}
else
{
{
qh = *(s) - 0xa0;
wh = *(s + 1) - 0xa0;
location = (94 * (qh - 1) + (wh - 1)) * 24L + 1140L;
memcpy(buffer, FontPattern + location, 24);
}
for(i = 0; i < 12; i ++)
for(j = 0; j < 2; j++)
for(k = 0; k < 8; k ++)
if((buffer[ i * 2 + j] >> (7 - k)) & 0x1)
put_pixel(x + 8 * j + k, y + i, r1, DISP_PUT_MODE_PUT);
else
put_pixel(x + 8 * j + k, y + i, r2, DISP_PUT_MODE_PUT);
s += 2;
x += 13;
}
}
}
三、打印输出
void mtclprn_font12line_buffer(unsigned char * pbuffer, unsigned
char * charlinestr, int verticaldot, int dx, int dy, unsigned char
templetchar[])
{
unsigned char * s, chwid;
int m = 0, n = 0, i = 0, j = 0, k = 0;
unsigned char qh, wh, buffer[40], ascii, pagebuffer[32768];
unsigned long location, poffset, testmask, vertical;
s = charlinestr;
poffset = 0;
memset(pagebuffer, 0, 32768);
while(*s)
{
ascii = *(s);
if (ascii >= 32 && ascii < 128 )
{
location = (ascii - 32) * 12L;
memcpy(buffer, templetchar + location, 12);
for(i = 0; i < 12; i ++) //y
{
for(k = 0; k < 8; k ++) //x
{
if((buffer[ i ] >> (7 - k)) & 0x1)
{
pagebuffer[poffset + k * 2 + i * 2 * verticaldot]
= 1; //原点
pagebuffer[poffset + k * 2 + i * 2 * verticaldot
+ verticaldot] = 1; //下移一位
pagebuffer[poffset + k * 2 + 1 + i * 2 *
verticaldot] = 1; //右移一位
pagebuffer[poffset + k * 2 + 1 + i * 2 *
verticaldot + verticaldot] = 1; //右下移一位
}
}
}
s += 1;
chwid = 6;
}
else
{
{
qh = *(s) - 0xa0;
wh = *(s + 1) - 0xa0;
location = (94 * (qh - 1) + (wh - 1)) * 24L + 1140L;
memcpy(buffer, templetchar + location, 24);
}
for(i = 0; i < 12; i ++)
{
for(j = 0; j < 2; j++)
{
for(k = 0; k < 8; k ++)
{
if((buffer[ i * 2 + j] >> (7 - k)) & 0x1)
{
pagebuffer[poffset + (8 * j + k) * 2 + i * 2 * verticaldot] = 1; //原点
pagebuffer[poffset + (8 * j + k) * 2 + i * 2 * verticaldot + verticaldot] = 1; //下移一位
pagebuffer[poffset + (8 * j + k) * 2 + 1 + i * 2 * verticaldot] = 1; //右移一位
pagebuffer[poffset + (8 * j + k) * 2 + 1 + i * 2 * verticaldot + verticaldot] = 1; //右下移一位
}
}
}
}
s += 2;
chwid = 12;
}
poffset += chwid * 2 + 1;
}
for (i = 0; i < poffset; i ++)
{
for (j = 0; j < 3; j ++)
{
ascii = 0;
for (k = 0; k < 8; k ++)
{
if (pagebuffer[verticaldot * ((2 - j) * 8 + (7 - k))
+ i] == 1)
ascii = ascii * 2 + 1;
else
ascii *= 2;
}
pbuffer[dy * 48 + i * 48 + dx + j] = ascii;
}
}
}