|
看了示波器的字體繪制程序,用了標(biāo)志位,覺得有點(diǎn)麻煩,自己寫了個(gè)程序,一兩個(gè)函數(shù),最大漢子32*32,可以覆蓋,疊加,反顯等操作。第一次51hei論壇上發(fā)資料,勿噴!!!謝謝!
void OLED_Draw_Number(unsigned char _x,unsigned char _y,unsigned char *chr,unsigned char wordsize , unsigned char kind)//要寫入字符串,字號(hào)wordsize,寫入方式kind:0疊加 1覆蓋 2疊加取反 3覆蓋取反
{
uchar WIDTH,HEIGHT;//字符寬度
uchar c;//字符寬度
uchar i;
uint y=_y<<4;
uchar left_num;//字符在16位中左移的位置
uint x_Byte,x_bit;//X寫入的字節(jié)位置
unsigned long Uint_Buf;//要寫入時(shí)用的緩存
unsigned long qk;//對(duì)應(yīng)緩存時(shí)的位,對(duì)應(yīng)字符寬度
unsigned long qk1;//對(duì)應(yīng)緩存時(shí)的位,對(duì)應(yīng)字符寬度
switch(wordsize)//轉(zhuǎn)換字符寬度
{
case F6_8: WIDTH=6;//保存字符寬度
HEIGHT=8;//保存字符高度
qk=0x003f;//B 0000 0000 0011 1111//用于擦除需要覆蓋的位置
break;
case F6_12: WIDTH=6;//保存字符寬度
HEIGHT=12;//保存字符高度
qk=0x003f;//B 0000 0000 0011 1111//用于擦除需要覆蓋的位置
break;
case F8_16: WIDTH=8;//保存字符寬度
HEIGHT=16;//保存字符高度
qk=0x00ff;//B 0000 0000 0011 1111//用于擦除需要覆蓋的位置
break;
case F12_24: WIDTH=12;//保存字符寬度
HEIGHT=24;//保存字符高度
qk=0x0fff;//B 0000 0000 0011 1111//用于擦除需要覆蓋的位置
break;
case HZ16_16: WIDTH=16;//保存字符寬度
HEIGHT=16;//保存字符高度
qk=0x0fff;//B 0000 0000 0011 1111//用于擦除需要覆蓋的位置
break;
default:break;
}
//漢字16*16
while (*chr)//循環(huán)寫入字符
{
c = *chr - ' ';//將ASSIC碼轉(zhuǎn)換成表格位置
x_Byte=_x>>3;//根據(jù)寫入像素位置計(jì)算寫入的字節(jié)位置
x_bit=_x&7;//根據(jù)寫入像素位置計(jì)算寫入的字節(jié)位置
left_num=32-WIDTH-x_bit;//計(jì)算字符左移數(shù)量
for (i = 0; i < HEIGHT; i++)
{
switch(wordsize)//轉(zhuǎn)換字符寬度
{
case F6_8: Uint_Buf=F6x8[c][ i];//取出對(duì)應(yīng)位置的字符表信息
break;
case F6_12: Uint_Buf=F6x12[c][ i];//取出對(duì)應(yīng)位置的字符表信息
break;
case F8_16: Uint_Buf=F8x16[c][ i];//取出對(duì)應(yīng)位置的字符表信息
break;
case F12_24: Uint_Buf=F12x24[c][i*2]<<8|F12x24[c][i*2+1];//取出對(duì)應(yīng)位置的字符表信息
break;
case HZ16_16: Uint_Buf=F12x24[c][i*2]<<8|F12x24[c][i*2+1];//取出對(duì)應(yīng)位置的字符表信息
break;
default:break;
}
Uint_Buf<<=left_num;//將字符行信息左移到待寫入位置
qk1=qk<<left_num;//將字符行信息左移到待寫入位置
if((kind==2)||(kind==3))Uint_Buf=~Uint_Buf&qk1;//是否反顯
if((kind==1)||(kind==3))*((unsigned long *)(&Main_BUFF1+y+x_Byte))&=~qk1;//是否覆蓋掉原來的數(shù)據(jù) 寫入方式kind: 0疊加 1覆蓋 2疊加取反 3覆蓋取反
*((unsigned long *)(&Main_BUFF1+y+x_Byte))|=Uint_Buf;//將字符行信息寫入到緩存區(qū)
x_Byte+=OLED_WIDTH>>3;
}
_x+=WIDTH;
chr++;
}
}
|
評(píng)分
-
查看全部評(píng)分
|