字模文件ASC16文件中字符的位置为:char*16+1,比如,我们要取a的字模,我们只需要在ASC16文件的偏移地址为97*16+1的位置读取16字节的数据即为a的字模数据。
如下代码包括:8*16字模的获取显示,8*16的左旋转90°和右旋转90°的显示,以及8*16和16*8的字模的放大显示
代码如下所示:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ASC_CODE_SIZE_16 16
#define ASC_CODE_SIZE_64 64
#define ASC_CODE_SIZE_256 256
//获取字模数据
int Get_Asc_Code(unsigned char *Input_Char, char *buff)
{
int ret, offset;
FILE * fp = NULL;
fp = fopen("./ASC16", "rb+");
if (!fp) {
return -1;
}
offset = (*Input_Char)*16 + 1;
fseek(fp, offset, SEEK_SET);
ret = fread(buff, 1, 16, fp);
if(ret != 16){
return -1;
}
fclose(fp);
return 0;
}
//8*16显示
void Print_Asc_Char_8_16(unsigned char *buff)
{
int i, j;
for(i=0; i<16; i++){
for(j=0; j<8; j++){
if(buff[i] & 0x80>>j){
printf("*");
} else {
printf(" ");
}
}
printf("\n");
}
}
//16*32显示
void Print_Asc_Char_16_32(unsigned char *buff)
{
int i, j;
for(i=0; i<64; i++){
for(j=0; j<8; j++){
if(buff[i] & 0x80>>j){
printf("*");
} else {
printf(" ");
}
}
i++;
for(j=0; j<8; j++){
if(buff[i] & 0x80>>j){
printf("*");
} else {
printf(" ");
}
}
printf("\n");
}
}
//32*16显示
void Print_Asc_Char_32_16(unsigned char *buff)
{
int i, j;
for(i=0; i<64; i++){
for(j=0; j<8; j++){
if(buff[i] & 0x80>>j){
printf("*");
} else {
printf(" ");
}
}
i++;
for(j=0; j<8; j++){
if(buff[i] & 0x80>>j){
printf("*");
} else {
printf(" ");
}
}
i++;
for(j=0; j<8; j++){
if(buff[i] & 0x80>>j){
printf("*");
} else {
printf(" ");
}
}
i++;
for(j=0; j<8; j++){
if(buff[i] & 0x80>>j){
printf("*");
} else {
printf(" ");
}
}
printf("\n");
}
}
//16*8显示
void Print_Asc_Char_16_8(unsigned char *buff)
{
int i, j;
for(i=0; i<16; i++){
for(j=0; j<8; j++){
if(buff[i] & 0x80>>j){
printf("*");
} else {
printf(" ");
}
}
i++;
for(j=8; j<16; j++){
if(buff[i] & 0x80>>(j%8)){
printf("*");
} else {
printf(" ");
}
}
printf("\n");
}
}
//向左旋转90度
void left_rotate(unsigned char *buff, unsigned char *buff1)
{
int i, j, k = 0;
for(i=0; i<8; i++){
for(j=0; j<8; j++){
if(buff[j] & 0x01 << i){
buff1[k] |= 0x80>>j;
} else {
buff1[k] &= ~(0x80>>j);
}
}
k++;
for(j=8; j<16; j++){
if(buff[j] & 0x01 << i){
buff1[k] |= 0x80>>(j%8);
} else {
buff1[k] &= ~(0x80>>(j%8));
}
}
k++;
}
}
//向右旋转90度
void right_rotate(unsigned char *buff, unsigned char *buff1)
{
int i, j, k = 0;
for(i=0; i<8; i++){
k++;
for(j=0; j<8; j++){
if(buff[j] & 0x80 >> i){
buff1[k] |= 0x01<<j;
} else {
buff1[k] &= ~(0x01<<j);
}
}
k--;
for(j=8; j<16; j++){
if(buff[j] & 0x80 >> i){
buff1[k] |= 0x01<<(j%8);
} else {
buff1[k] &= ~(0x01<<(j%8));
}
}
k += 2;
}
}
void zoom8(unsigned char font8,unsigned char *date)
{
int m=0,n=0;
unsigned char high,low;
high = (font8 & 0xf0) >> 4;
low = (font8 & 0x0f);
unsigned char tmp[2];
memset(tmp,0,2);
int j=0;
for(;m<4;m++)
{
if((high >> m) & 0x1)
{
tmp[0] |= (1 << j);
tmp[0] |= (1 << (j+1));
}
else
{
tmp[0] &= (~(1 << j));
tmp[0] &= (~(1 << (j+1)));
}
j += 2;
}
j=0;
for(;n<4;n++)
{
if((low >> n) & 0x1)
{
tmp[1] |= (1 << j);
tmp[1] |= (1 << (j+1));
}
else
{
tmp[1] &= ~(1 << j);
tmp[1] &= ~(1 << (j+1));
}
j += 2;
}
memcpy(date,tmp,2);
}
//将8*16的数组转换放大后拷贝到font32中
void zoom8_16_to_font32(unsigned char *font16,unsigned char *font32)
{
unsigned char zoom[2];
int j=0,i=0,t=0;
for(;j<16;j++)
{
zoom8(font16[j],zoom);
memcpy(font32+t,zoom ,2);
t+=2;
memcpy(font32+t,zoom,2);
t+=2;
}
}
//将16*8的数组放大转换后拷贝到font32中
void zoom16_8_to_font32_16(unsigned char *font16,unsigned char *font32)
{
unsigned char zoom[2];
unsigned char zoom1[2];
int j=0,i=0,t=0;
for(;j<16;j++)
{
zoom8(font16[j],zoom);
zoom8(font16[j+1],zoom1);
memcpy(font32+t,zoom ,2);
t+=2;
memcpy(font32+t,zoom1,2);
t+=2;
memcpy(font32+t,zoom ,2);
t+=2;
memcpy(font32+t,zoom1,2);
t+=2;
j++;
}
}
int main(int argc, char *argv[])
{
unsigned char *buff;
unsigned char *buff16;
unsigned char *buff64;
unsigned char *buff256;
int ret, offset, i, j;
char a = 'A';
buff = malloc(ASC_CODE_SIZE_16);
if(!buff){
printf("no mem\n");
}
buff16 = malloc(ASC_CODE_SIZE_16);
if(!buff16){
printf("no mem\n");
}
buff64 = malloc(ASC_CODE_SIZE_64);
if(!buff64){
printf("no mem\n");
}
buff256 = malloc(ASC_CODE_SIZE_256);
if(!buff256){
printf("no mem\n");
}
memset(buff, 0, strlen(buff));
ret = Get_Asc_Code(&a, buff);
if(ret < 0){
printf("%s %d get asc code err\n",__func__,__LINE__);
}
Print_Asc_Char_8_16(buff);
printf("%s %d\n",__func__,__LINE__);
memset(buff16, 0, strlen(buff16));
left_rotate(buff,buff16);
Print_Asc_Char_16_8(buff16);
printf("%s %d\n",__func__,__LINE__);
memset(buff16, 0, strlen(buff16));
right_rotate(buff,buff16);
Print_Asc_Char_16_8(buff16);
printf("%s %d\n",__func__,__LINE__);
memset(buff64, 0, strlen(buff64));
zoom8_16_to_font32(buff,buff64);
Print_Asc_Char_16_32(buff64);
printf("%s %d\n",__func__,__LINE__);
memset(buff64, 0, strlen(buff64));
zoom16_8_to_font32_16(buff16,buff64);
Print_Asc_Char_32_16(buff64);
free(buff);
free(buff16);
free(buff64);
free(buff256);
return 0;
}
程序结果为: