?? text.c
字號:
#include "sys.h"
#include "fontupd.h"
#include "flash.h"
#include "lcd.h"
#include "text.h"
//code 字符指針開始
//從字庫中查找出字模
//code 字符串的開始地址,ascii碼
//mat 數據存放地址 size*2 bytes大小
//正點原子@HYW
//CHECK:09/10/30
void Get_HzMat(unsigned char *code,unsigned char *mat,u8 size)
{
unsigned char qh,ql;
unsigned char i;
unsigned long foffset;
qh=*code;
ql=*(++code);
if(qh<0x81||ql<0x40||ql==0xff||qh==0xff)//非 常用漢字
{
for(i=0;i<(size*2);i++)*mat++=0x00;//填充滿格
return; //結束訪問
}
if(ql<0x7f)ql-=0x40;//注意!
else ql-=0x41;
qh-=0x81;
foffset=((unsigned long)190*qh+ql)*(size*2);//得到字庫中的字節偏移量
if(size==16)SPI_Flash_Read(mat,foffset+ftinfo.f16addr,32);
else SPI_Flash_Read(mat,foffset+ftinfo.f12addr,24);
}
//顯示一個指定大小的漢字
//x,y :漢字的坐標
//font:漢字GBK碼
//size:字體大小
//mode:0,正常顯示,1,疊加顯示
//正點原子@HYW
//CHECK:09/10/30
void Show_Font(u8 x,u8 y,u8 *font,u8 size,u8 mode)
{
u8 temp,t,t1;
u8 y0=y;
u8 dzk[32];
u16 tempcolor;
if(size!=12&&size!=16)return;//不支持的size
Get_HzMat(font,dzk,size);//得到相應大小的點陣數據
if(mode==0)//正常顯示
{
for(t=0;t<size*2;t++)
{
temp=dzk[t];//得到12數據
for(t1=0;t1<8;t1++)
{
if(temp&0x80)LCD_DrawPoint(x,y);
else
{
tempcolor=POINT_COLOR;
POINT_COLOR=BACK_COLOR;
LCD_DrawPoint(x,y);
POINT_COLOR=tempcolor;//還原
}
temp<<=1;
y++;
if((y-y0)==size)
{
y=y0;
x++;
break;
}
}
}
}else//疊加顯示
{
for(t=0;t<size*2;t++)
{
temp=dzk[t];//得到12數據
for(t1=0;t1<8;t1++)
{
if(temp&0x80)LCD_DrawPoint(x,y);
temp<<=1;
y++;
if((y-y0)==size)
{
y=y0;
x++;
break;
}
}
}
}
}
//在指定位置開始顯示一個字符串
//支持自動換行
//(x,y):起始坐標
//str :字符串
//size :字體大小
//mode:0,非疊加方式;1,疊加方式
//正點原子@HYW
//CHECK:09/10/30
void Show_Str(u8 x,u8 y,u8*str,u8 size,u8 mode)
{
u8 bHz=0; //字符或者中文
while(*str!=0)//數據未結束
{
if(!bHz)
{
if(*str>0x80)bHz=1;//中文
else //字符
{
if(x>(LCD_W-size/2))//換行
{
y+=size;
x=0;
}
if(y>(LCD_H-size))break;//越界返回
if(*str==13)//換行符號
{
y+=size;
x=0;
str++;
}
else LCD_ShowChar(x,y,*str,size,mode);//有效部分寫入
str++;
x+=size/2; //字符,為全字的一半
}
}else//中文
{
bHz=0;//有漢字庫
if(x>(LCD_W-size))//換行
{
y+=size;
x=0;
}
if(y>(LCD_H-size))break;//越界返回
Show_Font(x,y,str,size,mode); //顯示這個漢字,空心顯示
str+=2;
x+=size;//下一個漢字偏移
}
}
}
//得到字符串的長度
//正點原子@HYW
//CHECK OK 091118
u16 my_strlen(u8*str)
{
u16 len=0;
while(*str!='\0')
{
str++;
len++;
}
return len;
}
//在str1后面加入str2
//正點原子@HYW
//CHECK OK 091118
void my_stradd(u8*str1,u8*str2)
{
while(*str1!='\0')str1++;
while(*str2!='\0')
{
*str1=*str2;
str2++;
str1++;
}
*str1='\0';//加入結束符
}
//在指定寬度的中間顯示字符串
//如果字符長度超過了len,則用Show_Str顯示
//len:指定要顯示的寬度
//針對12*12字體!!!
void Show_Str_Mid(u8 x,u16 y,u8*str,u8 size,u8 len)
{
u16 strlenth=0;
strlenth=my_strlen(str);
strlenth*=size/2;
if(strlenth>len)Show_Str(x,y,str,size,1);
else
{
strlenth=(len-strlenth)/2;
Show_Str(strlenth+x,y,str,size,1);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -