??本文介紹如何把字庫文件寫入單片機的flash中,然后無需再提取字模,即可實現單片機顯示中文字符的功能。
下載字庫到單片機flash中的指定位置
??在上一篇博客中,最后留了一個想法,讓單片機自帶字庫?,F在就來實現這個想法。
我把用到的編譯過的字符放在這里
??我們借助J-Flash軟件把bin文件放在單片機flash中的指定位置。
??首先要新建工程,然后根據自己的板子選擇型號
??然后打開數據文件,找到剛剛下載的bin文件
??根據自己單片機的flash大小輸入地址,注意這個地址要與代碼中的“基地址”一致
??設置好以后按下快捷鍵F7
??成功燒錄以后,代碼不可以在使用此區域。——一般情況下,你的工程代碼也不會大到可以覆蓋這個區域。
編寫字庫顯示函數
??函數編寫過程就不講述了,原理都在代碼里。有需要的可以自行研究。有一些沒有提到的函數,可以參考上一篇博客。
??這是顯示字符串的函數
/**
* @brief 輸出12*12的漢字或6*12的字符,函數可以自動識別是中文字符還是ASCII
* @param 第一個字符的坐標,漢字顏色,背景顏色,需要顯示的字符串。背景顏色為0表示不畫背景
* @Note 漢字字模來自于字庫,字庫是編譯好的bin文件,在_DEF_FONT_CH字庫的基地址中
* @retval None
*/
void LCD_DrawFont_GBK12(u16 x, u16 y, u16 fc, u16 bc, char *pStr)
{
unsigned char xNow,temp_width;
const u8 *FontModel;
char ch[2];
xNow = x;
while(*pStr)
{
ch[0] = *pStr;
pStr++;
ch[1] = *pStr;
if(ch[0] == 10)
{
x = xNow;
y += 12;
}
else if(ch[0] < 128)
{
temp_width = Get_Model(ch,&FontModel);
if(x < 128)
DrawFontModel(x,y,temp_width,FontModel,fc,bc);
x += temp_width;//下一個字符的橫坐標
}
else if((ch[0] > 160) && (ch[1] > 160)) //中文
{
ch[1] = *pStr;
temp_width = Get_Model(ch,&FontModel);
if(x < 128)
DrawFontModel(x,y,temp_width,FontModel,fc,bc);
x += temp_width;//下一個字符的橫坐標
pStr++;
}
}
}
??這個函數用于顯示單個字符
/**
* @brief 根據傳入的參數顯示一個字符,可以自動識別是中文還是英文
* @param 第一個字符的坐標,字符的寬度(中文12英文6),顏色,背景顏色,需要顯示的字符串。背景顏色為0表示不畫背景
* @Note 漢字字模來自于字庫,字庫是編譯好的bin文件,在_DEF_FONT_CH字庫的基地址中
* 返回值并不是字庫的地址,字庫地址是通過指針傳遞的,也就是說,參數FontModel本身也是返回值
* @retval None
*/
static void DrawFontModel(u8 xNow,u8 yNow,u8 width,const u8 *FontModel,u16 fc, u16 bc )
{
u8 bit = 0;
u8 m = 0xff;
if(FontModel)//字母為空處理
m = *FontModel;
for (u8 y = yNow; y < yNow + 12; y++)//豎著顯示,先判斷y坐標。
{
for(u8 x = xNow; x < xNow + width; x++)//再判斷橫坐標
{
if(x < 128)
{
if((m&0x01) == 0x01)
{
LCD_DrawPoint(x,y,fc);
}
else
{
if ((bc!=0)&&(fc!=bc)) LCD_DrawPoint(x,y,bc);
}
}
bit++;
m >>= 1;//字符循環右移
if(bit == 8)//一個字節顯示完畢,則顯示下一個字節
{
bit = 0;
if(FontModel)//空字模處理
{
FontModel ++;
m = *FontModel;
}
else
{
m = 0xff;
}
}
}
}
}
??這是根據字符的標號,從flash中找到對應字符數組的 函數
/**
* @brief 獲取字模數組的 地址
* @param 第一個字符的坐標,字符的寬度(中文12英文6),顏色,背景顏色,需要顯示的字符串。背景顏色為0表示不畫背景
* @Note 漢字字模來自于字庫,字庫是編譯好的bin文件,在_DEF_FONT_CH字庫的基地址中
* @retval 字模的寬度
*/
static char Get_Model(const char *ch,const u8 **FontModel)
{
if((ch[0] > 0xA0) && (ch[1] > 0xA0))//中文
{
*FontModel = _DEF_FONT_CH + 18 * ((ch[0] - 161) * 94 + ch[1] - 161);//獲取此字模的地址
return 12;
}
if(*ch >= 0x20)//英文
{
*FontModel = _DEF_FONT_EN + 9 * (ch[0] - 0x20);
return 6;
}
*FontModel = _DEF_FONT_EN;//無法匹配,顯示空白
return 0;
}
??GB2312的字符計算是怎么算的?GB2312的編號可以幫助我們找到字符,簡單來說,就是GB2312規定對收錄的每個字符采用兩個字節表示,第一個字節為“高字節”,對應94個區;第二個字節為“低字節”,對應94個位。所以它的區位碼范圍是:0101-9494。區號和位號分別加上0xA0就是GB2312編碼。例如最后一個碼位是9494,區號和位號分別轉換成十六進制是5E5E,0x5E+0xA0=0xFE,所以該碼位的GB2312編碼是FEFE。
??這也就是為什么我們的代碼中要乘以94了。
??關于GB2312的詳細資料可以參考這篇博客
??在主函數中我調用了顯示函數:
ST7735S_CPT144_Initial();
LCD_BG_Color(GREEN);
LCD_DrawFont_GBK12(0,0,BLACK,GREEN,"來自geekYatao的博客");
LCD_DrawFont_GBK12(0,12,BLACK,GREEN,"ABCabc123,.?《》");
LCD_DrawFont_GBK12(0,24,BLACK,GREEN,"犇鱻羴顯示不出來");
??另外我還定義了漢字字符的基地址,與英文字符的數組
extern const u8 _FontLibEn612[];
#define _DEF_FONT_CH (const u8*)(0x080DC000) //字庫的基地址
#define _DEF_FONT_EN _FontLibEn612
extern const u8 _FontLibEn612[] = { 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, // 0x20
0x0,0x40,0x10,0x4,0x41,0x10,0x0,0x1,0x0, // 0x21 !
0x0,0xA5,0x28,0x0,0x0,0x0,0x0,0x0,0x0, // 0x22 "
0x0,0x40,0x51,0x3F,0xA5,0xFC,0x8A,0x2,0x0, // 0x23 #
0x0,0xE1,0x55,0x85,0xC1,0x50,0xD5,0x43,0x0, // 0x24 $
0x0,0x20,0x55,0x8D,0x42,0xB1,0xAA,0x4,0x0, // 0x25 %
0x0,0x40,0x28,0x8A,0x57,0x55,0x89,0xD,0x0, // 0x26 &
0x80,0x20,0x4,0x0,0x0,0x0,0x0,0x0,0x0, // 0x27 '
0x0,0x8,0x21,0x8,0x82,0x20,0x8,0x4,0x2, // 0x28 (
0x80,0x40,0x20,0x8,0x82,0x20,0x8,0x21,0x0, // 0x29 )
0x0,0x0,0x10,0x95,0xE3,0x54,0x4,0x0,0x0, // 0x2A *
0x0,0x40,0x10,0xC4,0x47,0x10,0x4,0x0,0x0, // 0x2B +
0x0,0x0,0x0,0x0,0x0,0x0,0x80,0x20,0x4, // 0x2C ,
0x0,0x0,0x0,0xC0,0x7,0x0,0x0,0x0,0x0, // 0x2D -
0x0,0x0,0x0,0x0,0x0,0x0,0x80,0x0,0x0, // 0x2E .
0x0,0x84,0x20,0x8,0x41,0x8,0x82,0x10,0x0, // 0x2F /
0x0,0xE0,0x44,0x51,0x14,0x45,0x91,0x3,0x0, // 0x30 0
0x0,0x40,0x18,0x4,0x41,0x10,0x84,0x3,0x0, // 0x31 1
0x0,0xE0,0x44,0x11,0x42,0x8,0xC1,0x7,0x0, // 0x32 2
0x0,0xE0,0x44,0x10,0x3,0x41,0x91,0x3,0x0, // 0x33 3
0x0,0x80,0x30,0x8A,0x92,0x78,0x8,0x6,0x0, // 0x34 4
0x0,0xF0,0x5,0xC1,0x3,0x41,0x91,0x3,0x0, // 0x35 5
0x0,0xE0,0x24,0xC1,0x13,0x45,0x91,0x3,0x0, // 0x36 6
0x0,0xF0,0x25,0x8,0x41,0x10,0x4,0x1,0x0, // 0x37 7
0x0,0xE0,0x44,0x91,0x13,0x45,0x91,0x3,0x0, // 0x38 8
0x0,0xE0,0x44,0x51,0xE4,0x41,0x92,0x3,0x0, // 0x39 9
0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x1,0x0, // 0x3A :
0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x41,0x0, // 0x3B ;
0x0,0x8,0x21,0x84,0x40,0x20,0x10,0x8,0x0, // 0x3C <
0x0,0x0,0x0,0x1F,0x0,0x7C,0x0,0x0,0x0, // 0x3D =
0x80,0x40,0x20,0x10,0x8,0x21,0x84,0x0,0x0, // 0x3E >
0x0,0xE0,0x44,0x11,0x42,0x10,0x0,0x1,0x0, // 0x3F ?
0x0,0xE0,0x44,0x59,0x55,0x75,0x81,0x7,0x0, // 0x40 @
0x0,0x40,0x10,0x8C,0xA2,0x78,0xD2,0xC,0x0, // 0x41 A
0x0,0xF0,0x48,0x92,0x23,0x49,0xD2,0x3,0x0, // 0x42 B
0x0,0xE0,0x45,0x41,0x10,0x4,0x91,0x3,0x0, // 0x43 C
0x0,0xF0,0x48,0x92,0x24,0x49,0xD2,0x3,0x0, // 0x44 D
0x0,0xF0,0x49,0x8A,0xA3,0x8,0xD2,0x7,0x0, // 0x45 E
0x0,0xF0,0x49,0x8A,0xA3,0x8,0xC2,0x1,0x0, // 0x46 F
0x0,0xC0,0x49,0x41,0x90,0x47,0x12,0x3,0x0, // 0x47 G
0x0,0x30,0x4B,0x92,0x27,0x49,0xD2,0xC,0x0, // 0x48 H
0x0,0xF0,0x11,0x4,0x41,0x10,0xC4,0x7,0x0, // 0x49 I
0x0,0xE0,0x23,0x8,0x82,0x20,0x48,0x72,0x0, // 0x4A J
0x0,0x70,0x4B,0x8A,0xA1,0x28,0xD2,0xD,0x0, // 0x4B K
0x0,0x70,0x8,0x82,0x20,0x8,0xE2,0xF,0x0, // 0x4C L
0x0,0xB0,0x6D,0xDB,0x56,0x55,0x55,0x5,0x0, // 0x4D M
0x0,0xB0,0x4B,0x96,0xA5,0x69,0xD2,0x5,0x0, // 0x4E N
0x0,0xE0,0x44,0x51,0x14,0x45,0x91,0x3,0x0, // 0x4F O
0x0,0xF0,0x48,0x92,0x23,0x8,0xC2,0x1,0x0, // 0x50 P
上一篇:STM32HAL庫定時器中斷關閉的方法
下一篇:STM32HAL庫使用SPI驅動1.44寸TFTLCD
推薦閱讀
史海拾趣
在航空航天領域,AirBorn的產品廣泛應用于飛機、導彈系統、通信設備等關鍵領域。為了滿足航空航天領域對連接器的嚴苛要求,AirBorn不斷投入研發力量,推出了一系列具有高性能、高可靠性的連接器產品。這些產品不僅滿足了航空航天領域的需求,還為公司帶來了可觀的收益。
在全球化的背景下,電子行業中的CUI技術也呈現出國際合作與競爭并存的局面。一些國內企業通過與國際知名企業的技術合作,引進先進的CUI生產線和工藝,提高了自身的技術水平和市場競爭力。同時,國際市場的競爭也促使國內企業不斷創新,尋求差異化的發展道路。
AdTech公司深知人才是企業發展的核心動力。因此,公司一直致力于培養和引進高素質的人才,打造了一支具有豐富經驗和專業技能的團隊。公司通過提供良好的工作環境和福利待遇,吸引了一批優秀的研發、市場和管理人才。同時,公司還注重員工的培訓和成長,為員工的職業發展提供了廣闊的空間。這些措施使得公司的團隊更加穩定和高效,為公司的持續發展提供了有力保障。
面對國內市場的飽和競爭,AMRI Enterprise Co Ltd積極實施國際化戰略,拓展海外市場。公司通過參加國際電子展會、建立海外銷售渠道等方式,不斷提升品牌知名度和產品影響力。同時,AMRI還針對不同國家和地區的市場需求,調整產品策略,提供定制化的解決方案。這一戰略的實施,使得AMRI的產品成功打入多個國際市場,實現了業務的快速增長。
隨著公司規模的不斷擴大和產品線的日益豐富,兵字公司開始注重品牌建設和市場拓展。公司注冊了“BingZi兵字”商標,并通過一系列的市場推廣活動,提升了品牌的知名度和美譽度。同時,兵字公司還積極開拓國內外市場,與多家知名企業建立了長期穩定的合作關系,實現了業務的快速增長。
面對云計算技術的不斷發展和市場競爭的加劇,ECS公司制定了面向未來的戰略布局。他們將繼續加大在研發方面的投入,推動ECS服務的不斷升級和創新;同時,他們還將積極探索新的業務領域和市場機會,為客戶提供更加全面、豐富的服務。此外,ECS公司還注重可持續發展和社會責任。他們致力于降低能耗和排放、推動綠色計算等方面的工作;同時,他們還積極參與社會公益事業和慈善活動,回饋社會。這些舉措使得ECS公司不僅成為了一家領先的云服務提供商,還成為了一家具有社會責任感的企業。
《電信法》與電信網互聯互通 2006-7-17 電信業打破壟斷、引入競爭以來,互聯互通問題備受關注,眾多國家將其視為規范規制、建設一個公平競爭電信市場的切入點。能否與主導電信運營商之間進行有效的互聯互通不僅關系到新興運營 ...… 查看全部問答∨ |
|
我最近在做一塊ARM板上的藍牙底層初始化驅動,環境如下 板子:ARM11板 Linux內核版本:2.6.18 藍牙模塊:采用CSR的Bluecore5核心,和CPU通過UART相連 藍牙驅動:1.自己根據藍牙的datasheet在系統啟動時給藍牙模塊發送了一條Reset信號,并初始化 ...… 查看全部問答∨ |
求購windows CE下智能輸入法,最好是T9輸入法,至少含拼音和筆畫,windows CE操作系統,鍵盤4X5。有意聯系xiao615@126.com.… 查看全部問答∨ |
早晨起來,一看上海天馬上賽車場已經裝扮一新,賽道內有專門的維修通道,與正式的F1比賽管理別無二致,已悄然感受到大戰的氣息。在賽事現場,熱辣的美女、轟鳴的馬達、絢麗的奧鈴CTX賽車、激情吶喊的觀眾,這就是2010(第二屆)福田奧鈴CTX中國勒芒 ...… 查看全部問答∨ |
|
寫了一個定時中斷函數,將AD采樣寫在定時中斷中,結果不能得到正確的AD值,定時時間為0.1ms, 采用dsp2806,系統時鐘為50MHz,外部引腳ADCIN已經連接到1.6V直流電壓,為什么我的AD值卻總是零呢? 請高手幫幫忙??! void ADC_Init(void) {&nb ...… 查看全部問答∨ |
|
在做AD采樣時,初始化AD時,如果沒有這段代碼,發現采樣結果不對,加上后,檢測結果正常: AdcRegs.ADCTRL1.bit.RESET=1; //復位整個ADC模塊 DSP28x_usDelay(1); ...… 查看全部問答∨ |
不知道有多少朋友已經拿到SensorTag了? 今天來說一下SensorTag的OAD(Over the Air Download) 無線下載升級固件功能 大家都知道 單片機開發測試一般需要用JTAG下載器燒寫固件,但如果是開發產品都會面臨一個比較頭疼的問題,如果產品已經投放市場 ...… 查看全部問答∨ |