📄 matrix16.c
字号:
/*******************************************************************************
文件名称:Matrix16.C
适用范围:宋体16*16字符点阵信息读取程序
使用的字体文件为ASC16.BIN和HZK16.BIN,用WINHEX将两个合成在一个文件中,
文件名为Matrix16.bin,将Matrix16.bin以BIN方式烧录在AT27C040中;
*******************************************************************************/
#include "Matrix16.H"
#define asc_ofs 0x0000 //指定ASC16点阵信息在字库中的偏移位置
#define hzk_ofs 0x1000 //指定HZK16点阵信息在字库中的偏移位置
//#define addr_ex P1 //指定P1口作为扩展地址总线(A13-A18)
unsigned char xdata *p_dots;
unsigned char xdata dot_info[32];
//------------------------------------------------------------------------------
void GetChDots(uchar ch_code);
void GetHzDots(uchar hz_code_h,hz_code_l);
void ConvertChDots(uint pos_x,uint pos_y);
void ConvertLineMessage(uchar v_ln);
void ConvertHzDots(uint pos_x,uint pos_y);
void Convert1HzDots2(uchar hz_x,hz_y);
//------------------------------------------------------------------------------
uint GetHzDotsAddr(uchar hz_code_h,hz_code_l)
{
ulong addr;
uint addr_l,addr_h;
if((hz_code_h<0xa1)|(hz_code_l<0xa1)){
hz_code_h=0xa1;hz_code_l=0xa1;
}
addr = (hz_code_h-0xa1)*94;
addr = (addr+hz_code_l-0xa1)*32;
addr = addr+hzk_ofs; //GB2132 offset 0x1000;
addr_l = addr & 0x1fff;
addr_h = addr >> 13;
addr_ex = addr_h;
return(addr_l|rom_ofs); //片选汉字库ROM
}
//---------------------------------------------------------------------------
uint GetChDotsAddr(uchar ch_code)
{
ulong addr;
uint addr_l;
addr = ch_code*16;
addr_l = addr & 0x1fff;
addr_ex = 0x00; //屏蔽高位地址,ASC码用不到。
return(addr_l|rom_ofs); //片选ROM
}
//---------------------------------------------------------------------------
void GetChDots(uchar ch_code)
{
uchar i;
p_dots=GetChDotsAddr(ch_code); //计算点阵首地址,赋给指针
for(i=0;i<16;i++){ //读出点阵信息,放入点阵数组
dot_info[i]=*p_dots++;
}
}
void GetHzDots(uchar code_h,code_l)
{
uchar i;
p_dots=GetHzDotsAddr(code_h,code_l); //计算点阵首地址,赋给指针
for(i=0;i<32;i++){ //读出点阵信息,放入点阵数组
dot_info[i]=*p_dots++;
}
}
//0308 vonvert from 16*16 to 16*16
void ConvertHzDots(uint pos_x,uint pos_y)
{
uint idata j,y;
uint idata addroffset;
addroffset=pos_y+pos_x;
//左上部和左下部
for(j=0;j<16;j++)
{
y=j%2;
if(y==0)
{
bmp_info[addroffset+j/2] = dot_info[j];
}
else
{
bmp_info[addroffset+16+j/2] = dot_info[j];
}
}
//右上部和右下部
for(j=0;j<16;j++)
{
y=j%2;
if(y==0)
{
bmp_info[addroffset+8+j/2] = dot_info[16+j];
}
else
{
bmp_info[addroffset+24+j/2] = dot_info[16+j];
}
}
}
void ConvertChDots(uint pos_x,uint pos_y)
{
uint idata j,y;
uint idata addroffset;
addroffset=pos_y+pos_x;
for(j=0;j<16;j++)
{
bmp_info[addroffset+j] = dot_info[j];
}
}
//0308 vonvert from 16*16 to 16*32
void Convert1HzDots2(uchar hz_x,hz_y)
{
uint xdata j, y;
unsigned char xdata bmp_info_temp[64];
addr_ex=0x01;
//左上部和左下部
for(j=0;j<16;j++)
{
y=j%2;
if(y==0)
{
bmp_info_temp[j/2] = dot_info[j];
}
else
{
bmp_info_temp[16+j/2] = dot_info[j];
}
}
//右上部和右下部
for(j=0;j<16;j++)
{
y=j%2;
if(y==0)
{
bmp_info_temp[8+j/2] = dot_info[16+j];
}
else
{
bmp_info_temp[24+j/2] = dot_info[16+j];
}
}
for(j=0;j<32;j++)
{
bmp_info[2*j+1]=bmp_info[2*j]=bmp_info_temp[j];
}
}
//---------------------------------------------------------------------------
void ConvertLineMessage(uchar v_ln)
{
uint xdata i,j;
//pos_y(行) pos_x(列)
uint xdata pos_x, pos_y;
pos_y=v_ln * LINEWIDTH;
j=0;
for(i=0;i<LINEWIDTH;i++)
{
if(info_ln[i]>0xa0)
{
GetHzDots(info_ln[i],info_ln[i+1]);
pos_x=32*j;
ConvertHzDots(pos_x,pos_y);
i++;
}
else
{
GetChDots(info_ln[i]);
ConvertChDots(pos_x,pos_y);
}
j++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -