英文字符字模获取显示和旋转显示

        字模文件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;
}

程序结果为:

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值