日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]一。漢字顯示原理1. 常用漢字編碼這里我們采用GBK編碼2. 漢字顯示原理假如顯示一個(gè)16*8的漢字,高16,寬8,則高需要2個(gè)字節(jié),顯示這個(gè)漢字需要2*8=16個(gè)字節(jié),這16個(gè)字節(jié)的數(shù)據(jù)就是漢字的點(diǎn)陣數(shù)據(jù)。3. 字符/漢字顯示方

一。漢字顯示原理

1. 常用漢字編碼


這里我們采用GBK編碼

2. 漢字顯示原理


假如顯示一個(gè)16*8的漢字,高16,寬8,則高需要2個(gè)字節(jié),顯示這個(gè)漢字需要2*8=16個(gè)字節(jié),這16個(gè)字節(jié)的數(shù)據(jù)就是漢字的點(diǎn)陣數(shù)據(jù)。

3. 字符/漢字顯示方法


利用軟件取模

取模方向設(shè)置:

掃描方向:縱向?yàn)橄蕊@示第一個(gè)字節(jié),然后顯示第二個(gè)字節(jié),從低位到高位,然后換到第二列。

數(shù)據(jù)前綴改為“0x”,數(shù)據(jù)后綴改為“,”,行后綴為“;”。

對(duì)于漢字顯示采用16*16。

例如:開(kāi),為16*16,得到下面的字模數(shù)據(jù)。


得到字模數(shù)據(jù)后,程序中就可以從中取得相應(yīng)的字節(jié)進(jìn)行顯示。

4. 漢字顯示的過(guò)程

如何顯示字庫(kù)中所有的漢字?利用專用的軟件實(shí)現(xiàn)。


根據(jù)內(nèi)碼,查找相應(yīng)的字庫(kù)點(diǎn)陣,然后解析,顯示。

對(duì)于漢字的內(nèi)碼常用GBK碼。每一個(gè)漢字都對(duì)應(yīng)一個(gè)GBK的編碼。

認(rèn)識(shí)GBK碼:


GBK碼共有126個(gè)區(qū),每個(gè)區(qū)里有190個(gè)漢字。

如何根據(jù)GBK編碼找到漢字:

1.首先找到GBK編碼的高位,得到這個(gè)漢字在哪個(gè)區(qū)。(高位-0x81)確定在哪個(gè)區(qū)。

(GBKH-0x81)*190表示這個(gè)漢字所在區(qū)的前面幾個(gè)區(qū)已經(jīng)有這么多個(gè)漢字。

當(dāng)GBKL<0x7F時(shí):漢字所在區(qū)的偏移為GBKL-0x40。

當(dāng)GBKL>0x7F時(shí):漢字所在區(qū)的偏移為GBKL-0x41,因?yàn)榍懊婵盏粢粋€(gè)0x7F。

因?yàn)槊總€(gè)漢字占用的字節(jié)數(shù)為size*2,比如16*16的漢字,那么每個(gè)漢字占用的空間是16*2=32個(gè)字節(jié)。

當(dāng) GBKL<0X7F 時(shí):Hp=((GBKH-0x81)*190+GBKL-0X40)*(size*2);

當(dāng) GBKL>0X80 時(shí):Hp=((GBKH-0x81)*190+GBKL-0X41)*(size*2);

根據(jù)GBK編碼得到這個(gè)漢字所在漢字庫(kù)的起始地址。

從以上的方法找到了漢字所在的位置,下面開(kāi)始制作點(diǎn)陣字庫(kù)。

采用字庫(kù)制作軟件制作漢字庫(kù)。



制作點(diǎn)陣字庫(kù)

生成字庫(kù)軟件設(shè)置:

注意字體大小選12,這個(gè)是電腦端字體的大小。


注意電腦端的字體大小與生成點(diǎn)陣的字體大小有區(qū)別

模式選擇縱向取模方式二。

生成點(diǎn)陣字庫(kù)后,要用文件系統(tǒng)讀取字庫(kù),然后存到SPI-Flash中。


在SPI FLASH中的某個(gè)地方寫(xiě)個(gè)標(biāo)志0xAA,表示已經(jīng)更新過(guò)字庫(kù)。


Show_Str函數(shù)既能顯示字符,也能顯示漢字,如果是顯示漢字就調(diào)用Show_Font函數(shù)。

Get_HzMat函數(shù)根據(jù)編碼取得字庫(kù)中漢字的字模。然后根據(jù)字模數(shù)據(jù)解析,顯示。

二。實(shí)驗(yàn)講解

生成的字庫(kù)文件名為:16.DZK,字庫(kù)大小為766,080字節(jié),然后把名字改成:GBK16.FON。

然后把這個(gè)文件存進(jìn)SD卡,程序會(huì)從SD卡中把這個(gè)文件寫(xiě)入SPI FLASH。

fontupd.c 更新字庫(kù)

text.c 顯示漢字

1. 程序主函數(shù)中開(kāi)始的時(shí)候會(huì)檢查字庫(kù),調(diào)用fontinit()函數(shù)。

//初始化字體

//返回值:0,字庫(kù)完好.

//其他,字庫(kù)丟失

u8 font_init(void)

{

SPI_Flash_Init(); //初始化25Q**系列。

FONTINFOADDR=(1024*6+500)*1024; //W25Q64,6M以后

ftinfo.ugbkaddr=FONTINFOADDR+25; //UNICODEGBK 表存放首地址固定地址

SPI_Flash_Read((u8*)&ftinfo,FONTINFOADDR,sizeof(ftinfo));//讀出ftinfo結(jié)構(gòu)體數(shù)據(jù)

if(ftinfo.fontok!=0XAA)return 1; //字庫(kù)錯(cuò)誤.

return 0;

}

字體信息保存地址,占25個(gè)字節(jié),第1個(gè)字節(jié)用于標(biāo)記字庫(kù)是否存在.后續(xù)每8個(gè)字節(jié)一組,分別保存起始地址和文件大小。

//字庫(kù)信息結(jié)構(gòu)體定義

//用來(lái)保存字庫(kù)基本信息,地址,大小等

__packed typedef struct

{

u8 fontok; //字庫(kù)存在標(biāo)志,0XAA,字庫(kù)正常;其他,字庫(kù)不存在

u32 ugbkaddr; //unigbk的地址

u32 ugbksize; //unigbk的大小

u32 f12addr; //gbk12地址

u32 gbk12size; //gbk12的大小

u32 f16addr; //gbk16地址

u32 gkb16size; //gbk16的大小

}_font_info;

__packed是字節(jié)對(duì)齊的意思。

比如說(shuō)int float double char它的總大小是4 + 4 + 8 + 1 = 17
但如果不用__packed的話,系統(tǒng)將以默認(rèn)的方式對(duì)齊(假設(shè)是4字節(jié)),那么它占4 + 4 + 8 + 4 = 20;(不足4字節(jié)以4字節(jié)補(bǔ)齊)。

ftinfo 是我們?cè)?fontupd.h 里面定義的一個(gè)結(jié)構(gòu)體,用于記錄字庫(kù)首地址及字庫(kù)大小等信息。

因?yàn)槲覀儗25Q64 的前 6M 字節(jié)給 FATFS 管理(用做本地磁盤(pán)),然后又預(yù)留了 500K 字節(jié)給用戶自己使用,最后的 1.5M 字節(jié)(W25Q64 總共 8M 字節(jié)),才是 UNIGBK 碼表和字庫(kù)的存儲(chǔ)空間。

finfo結(jié)構(gòu)體的存放地址為:

FONTINFOADDR=(1024*6+500)*1024;

GBK字庫(kù)存放的首地址為:

ftinfo.ugbkaddr=FONTINFOADDR+25;

2. 主函數(shù)如果沒(méi)有檢測(cè)到字庫(kù)

a. 初始化SD卡

while(SD_Initialize()) //檢測(cè)SD卡

沒(méi)檢測(cè)到SD卡報(bào)錯(cuò)

LCD_ShowString(60,70,200,16,16,"SD Card Failed!");

b. 調(diào)用 update_font(20,110,16,0); 從SD卡更新字庫(kù)

自己做的字庫(kù)要放在SD卡SYSTEM/FONT目錄下

文件名為GBK16.FON或GBK24.FON

//更新字體文件,UNIGBK,GBK12,GBK16一起更新

//x,y:提示信息的顯示地址

//size:字體大小

//提示信息字體大小

//src: 0, 從SD卡更新.

//src:1, 從25QXX更新

//返回值:0,更新成功;

//其他,錯(cuò)誤代碼.

u8 update_font(u16 x,u16 y,u8 size,u8 src)

{

u8 *gbk16_path;

u8 *gbk12_path;

u8 *unigbk_path;

u8 res;

if(src)//從25qxx更新

{

unigbk_path=(u8*)UNIGBK_25QPATH;

gbk12_path=(u8*)GBK12_25QPATH;

gbk16_path=(u8*)GBK16_25QPATH;

}else//從sd卡更新

{

unigbk_path=(u8*)UNIGBK_SDPATH;

gbk12_path=(u8*)GBK12_SDPATH;

gbk16_path=(u8*)GBK16_SDPATH;

}

res=0XFF;

ftinfo.fontok=0XFF;

SPI_Flash_Write((u8*)&ftinfo,FONTINFOADDR,sizeof(ftinfo)); //清除之前字庫(kù)成功的標(biāo)志.防止更新到一半重啟,導(dǎo)致的字庫(kù)部分?jǐn)?shù)據(jù)丟失.

SPI_Flash_Read((u8*)&ftinfo,FONTINFOADDR,sizeof(ftinfo)); //重新讀出ftinfo結(jié)構(gòu)體數(shù)據(jù)

LCD_ShowString(x,y,240,320,size,"Updating UNIGBK.BIN");

res=updata_fontx(x+20*size/2,y,size,unigbk_path,0); //更新UNIGBK.BIN

if(res)return 1;

LCD_ShowString(x,y,240,320,size,"Updating GBK12.BIN ");

res=updata_fontx(x+20*size/2,y,size,gbk12_path,1); //更新GBK12.FON

if(res)return 2;

LCD_ShowString(x,y,240,320,size,"Updating GBK16.BIN ");

res=updata_fontx(x+20*size/2,y,size,gbk16_path,2); //更新GBK16.FON

if(res)return 3;

//全部更新好了,寫(xiě)入標(biāo)志位0xAA。

ftinfo.fontok=0XAA;

SPI_Flash_Write((u8*)&ftinfo,FONTINFOADDR,sizeof(ftinfo)); //保存字庫(kù)信息

return 0;//無(wú)錯(cuò)誤.

}

調(diào)用updata_fontx(u16 x,u16 y,u8 size,u8 *fxpath,u8 fx);

//更新某一個(gè)

//x,y:坐標(biāo)

//size:字體大小

//fxpath:路徑

//fx:更新的內(nèi)容 0,ungbk;1,gbk12;2,gbk16;

//返回值:0,成功;其他,失敗.

u8 updata_fontx(u16 x,u16 y,u8 size,u8 *fxpath,u8 fx)

{

u32 flashaddr=0;

FIL * fftemp;

u8 *tempbuf;

u8 res;

u16 bread;

u32 offx=0;

u8 rval=0;

fftemp=(FIL*)mymalloc(SRAMIN,sizeof(FIL)); //為文件系統(tǒng)分配內(nèi)存

if (fftemp==NULL) rval=1; //分配失敗,rval = 1;

tempbuf=mymalloc(SRAMIN,4096); //為數(shù)據(jù)緩存區(qū)分配4096個(gè)字節(jié)空間

if (tempbuf==NULL) rval=1; //分配失敗,rval = 1;

res=f_open(fftemp,(const TCHAR*)fxpath,FA_READ); //根據(jù)文件路徑打開(kāi)文件

if (res) rval=2; //打開(kāi)文件失敗

if (rval==0)

{

if(fx==0) //更新UNIGBK.BIN

{

ftinfo.ugbkaddr = FONTINFOADDR+sizeof(ftinfo);//信息頭之后,緊跟UNIGBK轉(zhuǎn)換碼表

ftinfo.ugbksize = fftemp->fsize; //UNIGBK大小

flashaddr = ftinfo.ugbkaddr; //UNIGBK字庫(kù)的地址

}else if (fx==1) //更新GBK12

{

ftinfo.f12addr=ftinfo.ugbkaddr+ftinfo.ugbksize; //UNIGBK之后,緊跟GBK12字庫(kù)

ftinfo.gbk12size=fftemp->fsize; //GBK12字庫(kù)大小

flashaddr=ftinfo.f12addr; //GBK12的起始地址

}else //更新GBK16

{

ftinfo.f16addr=ftinfo.f12addr+ftinfo.gbk12size; //GBK12之后,緊跟GBK16字庫(kù)

ftinfo.gkb16size=fftemp->fsize; //GBK16字庫(kù)大小

flashaddr=ftinfo.f16addr; //GBK16的起始地址

}

while (res==FR_OK) //死循環(huán)執(zhí)行

{

res=f_read(fftemp,tempbuf,4096,(UINT *)&bread); //讀取數(shù)據(jù)

if(res!=FR_OK)break; //執(zhí)行錯(cuò)誤

SPI_Flash_Write(tempbuf,offx+flashaddr,4096);//從0開(kāi)始寫(xiě)入4096個(gè)數(shù)據(jù)

offx+=bread;

fupd_prog(x,y,size,fftemp->fsize,offx); //進(jìn)度顯示

if (bread!=4096) break; //,如果讀出來(lái)的數(shù)據(jù)不是4092個(gè),說(shuō)明數(shù)據(jù)讀完了,跳出死循環(huán).

}

f_close(fftemp); //關(guān)閉文件

}

myfree(SRAMIN,fftemp); //釋放內(nèi)存

myfree(SRAMIN,tempbuf); //釋放內(nèi)存

return res;

}

f_open函數(shù)用法:

The f_open function creates afile objectto be used to access the file.

FRESULTf_open(
FIL*fp,
constTCHAR*path,
BYTEmode
);
f_read函數(shù)的用法:
Thef_readfunctionreadsdatafromafile.
FRESULTf_read(
FIL*fp,
void*buff,
UINTbtr,
UINT*br
);
text.c中的函數(shù):
1.根據(jù)GBK碼找到字模函數(shù)Get_HzMat(unsignedchar*code,unsignedchar*mat,u8size)

//code字符指針開(kāi)始
//從字庫(kù)中查找出字模
//code字符串的開(kāi)始地址,GBK碼
//mat字模數(shù)據(jù)存放地址size*2bytes大小
voidGet_HzMat(unsignedchar*code,unsignedchar*mat,u8size)//漢字取模
{
unsignedcharqh,ql;
unsignedchari;
unsignedlongf

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過(guò)流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問(wèn)題卻十分常見(jiàn),不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問(wèn)題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(chē)(EV)作為新能源汽車(chē)的重要代表,正逐漸成為全球汽車(chē)產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車(chē)的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車(chē)的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車(chē) 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車(chē)場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問(wèn)題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周?chē)娮釉O(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來(lái)解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開(kāi)關(guān)電源具有效率高的特性,而且開(kāi)關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開(kāi)關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉