潘多拉开发板STM32L475之LCD与GBK(含GB2312)字体显示
一、GBK字體的內(nèi)碼獲取
#include <stdio.h>
#include <stdint.h>
int main(void)
{
? ? uint8_t *str="國"; ? ? ? ? ? ? ? ? //一個中文字體占2個字節(jié)
? ? uint8_t p,q;
? ? p=*str; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //獲取國字內(nèi)碼的前一個字節(jié)
? ? q=*(++str); ? ? ? ? ? ? ? ? ? ? ? ?? //獲取國字內(nèi)碼的前一個字節(jié)
? ? printf("%.2X,%.2X\r\n",p,q);//打印GBK字體內(nèi)碼
? ? return 0;
}
? ? ? ? ? ?
用原子哥開發(fā)的內(nèi)碼軟件查看國字的內(nèi)碼如下:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
國字打印的內(nèi)碼和原子哥的內(nèi)碼查詢軟件是一樣的。
每個 GBK 碼由 2 個字節(jié)組成,第一個字節(jié)為 0X81~0XFE,第二個字節(jié)分為兩部分(區(qū)域),一部分是 0X40~0X7E,第二部分是 0X80~0XFE。其中 GBK 碼與 GB2312碼?相同的區(qū)域,字完全相同。
二、根據(jù)內(nèi)碼LCD顯示點(diǎn)陣庫
在LCD上顯示“我為中華之崛起而讀書”9個字體,先獲取它們的內(nèi)碼,如下所示,
#include <stdio.h>
#include <stdint.h>
#include <string.h>
int main(void)
{
? ? uint8_t *str="為中華之崛起而讀書";
? ? uint8_t i;
? ? for(i=0;i<(strlen(str)/2);i++)
? ? {
? ? ? printf("%#.2X,%#.2X\r\n",*(str+i*2),*(str+(i*2+1)));
? ? }
? ? return 0;
}
“為中華之崛起而讀書”的內(nèi)碼如下所示,
? ? ? ? ? ? ??
用“PCtoLCD2002.exe”軟件獲取“為中華之崛起而讀書”的點(diǎn)陣庫,如下圖所示,
在數(shù)組或者內(nèi)存中以以下方式存儲,
| ? ? ? ? ? ? ? ? ? ? ? ? ? ? Flash地址或EEPROM地址(74個字節(jié))--1個字體的點(diǎn)陣庫內(nèi)存大小 | ||
| 內(nèi)碼高字節(jié)1Byte | 內(nèi)碼低字節(jié)1Byte | 字體點(diǎn)陣庫72Byte(假設(shè)字體為24*24) |
定義一個數(shù)組,把內(nèi)碼和字體點(diǎn)陣庫放在一起,如下圖所示,
const uint8_t font[]={
0xCE,0xAA,/*"為"的內(nèi)碼高位和低位*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x02,0x00,0x80,0x04,0x00,0x80,0x08,0x10,0x80,0x10,0x0C,0x80,0x30,0x0E,0x80,0x60,0x00,0x81,0xC0,0x00,0x87,0x00,0x00,0xBC,0x00,0x7F,0xF0,0x00,0x3E,0x88,0x00,0x20,0x88,0x08,0x00,0x84,0x08,0x00,0x86,0x08,0x00,0x83,0x04,0x00,0x81,0x86,0x00,0x80,0x06,0x00,0x80,0x1C,0x00,0xFF,0xF8,0x00,0xFE,0x00,0x00,0x80,0x00,0x00,0x00,0x00,/*"為",0*
?? ?
0xD6,0xD0,/*"中"的內(nèi)碼高位和低位*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0x00,0x03,0xFE,0x00,0x02,0x04,0x00,0x02,0x04,0x00,0x02,0x04,0x00,0x02,0x04,0x00,0x02,0x04,0x00,0x02,0x04,0x00,0x7F,0xFF,0xFE,0x22,0x04,0x0C,0x02,0x04,0x00,0x02,0x04,0x00,0x02,0x04,0x00,0x02,0x04,0x00,0x02,0x04,0x00,0x02,0x04,0x00,0x03,0xFF,0x00,0x03,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"中",1*/
?? ?
0xBB,0xAA,/*"華"的內(nèi)碼高位和低位*/
0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x40,0x80,0x00,0x80,0x80,0x03,0x00,0x80,0x06,0x0E,0x80,0x1B,0xFC,0x80,0x70,0x00,0x80,0x20,0x20,0x80,0x00,0x20,0x80,0x00,0x40,0x80,0x00,0x47,0xFE,0x7F,0xF4,0x84,0x3F,0xF8,0x80,0x01,0x08,0x80,0x03,0x08,0x80,0x02,0x08,0x80,0x04,0x08,0x80,0x0C,0x08,0x80,0x18,0x08,0x80,0x08,0x08,0x80,0x00,0xF8,0x80,0x00,0x00,0x00,0x00,0x00,0x00,/*"華",2*/
?? ?
0xD6,0xAE,/*"之"的內(nèi)碼高位和低位*/
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x18,0x01,0x00,0x10,0x01,0x00,0x20,0x01,0x00,0x20,0x01,0x00,0x60,0x01,0x00,0x90,0x01,0x01,0x10,0x21,0x02,0x08,0x11,0x06,0x08,0x1D,0x0C,0x0C,0x01,0x18,0x0C,0x01,0x30,0x0C,0x01,0x60,0x0C,0x01,0xC0,0x0C,0x01,0x80,0x0C,0x01,0x80,0x0C,0x00,0x00,0x0C,0x00,0x00,0x0C,0x00,0x00,0x0C,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,/*"之",3*/
?? ?
0xE1,0xC8,/*"崛"的內(nèi)碼高位和低位*/
0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xC0,0x02,0x00,0x40,0x00,0x00,0x80,0x7F,0xFF,0x80,0x00,0x00,0x80,0x00,0x01,0x02,0x03,0xFF,0xCC,0x00,0x00,0x30,0x00,0x01,0xE0,0x3F,0xFE,0x00,0x24,0x00,0x08,0x24,0x7C,0xF8,0x24,0x44,0x88,0x24,0x04,0x08,0x24,0x04,0x08,0x24,0xFF,0xF8,0x24,0x04,0x08,0x24,0x04,0x08,0x3E,0x7E,0x08,0x3E,0x46,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,/*"崛",4*/
?? ?
0xC6,0xF0,/*"起"的內(nèi)碼高位和低位*/
0x00,0x00,0x00,0x00,0x40,0x02,0x00,0x40,0x1C,0x04,0x47,0xE0,0x04,0x4F,0x40,0x04,0x40,0x20,0x04,0x40,0x10,0x7F,0xFF,0xF8,0x24,0x7F,0xF8,0x04,0x42,0x08,0x04,0x42,0x0C,0x04,0xC6,0x04,0x00,0x40,0x04,0x08,0x00,0x04,0x08,0x7F,0xE4,0x08,0x40,0x26,0x08,0x40,0x26,0x08,0x40,0x26,0x08,0x40,0x26,0x08,0x40,0x26,0x0F,0xE0,0x26,0x00,0x03,0xE4,0x00,0x00,0x00,0x00,0x00,0x00,/*"起",5*/
0xB6,0xF8,/*"而"的內(nèi)碼高位和低位*/
0x00,0x00,0x00,0x10,0x00,0x00,0x10,0x00,0x00,0x10,0x00,0x00,0x10,0xFF,0xFC,0x10,0x80,0x00,0x10,0x80,0x00,0x10,0x80,0x00,0x10,0x80,0x00,0x10,0xFF,0xF8,0x13,0x80,0x00,0x1C,0x80,0x00,0x18,0x80,0x00,0x10,0x80,0x00,0x10,0xFF,0xF8,0x10,0x80,0x08,0x10,0x80,0x04,0x10,0x80,0x04,0x10,0x80,0x06,0x11,0xFF,0xFC,0x30,0x80,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"而",6*/
0xB6,0xC1,/*"讀"的內(nèi)碼高位和低位*/
0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x20,0x40,0x00,0x18,0x7F,0xF8,0x0C,0x40,0x08,0x00,0x00,0x10,0x01,0x00,0x20,0x09,0x00,0xC2,0x09,0x08,0x82,0x09,0x44,0x84,0x09,0x27,0x84,0x09,0x30,0x88,0x09,0x00,0x98,0x7F,0x00,0xB0,0x09,0x7F,0xE0,0x09,0x3E,0x90,0x09,0x00,0x90,0x09,0x00,0x88,0x09,0x60,0x8C,0x01,0x80,0x86,0x01,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,/*"讀",7*/
0xCA,0xE9,/*"書"的內(nèi)碼高位和低位*/
0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x02,0x08,0x00,0x02,0x08,0x00,0x02,0x08,0x00,0x02,0x08,0x00,0x02,0x08,0x00,0x42,0x08,0x01,0x3F,0xFF,0xFE,0x02,0x08,0x00,0x02,0x08,0x00,0x02,0x08,0x00,0x02,0x08,0x00,0x02,0x08,0x00,0x02,0x18,0x20,0x23,0xF8,0x10,0x12,0x08,0x18,0x1C,0x08,0x18,0x0E,0x0F,0xF0,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00/*"書",8*/
}
//==============================================================================//
把字體通過函數(shù)作為實(shí)參傳進(jìn)來,獲取實(shí)參字體的內(nèi)碼,然后掃描font數(shù)組中的每一個字體的內(nèi)碼,如果內(nèi)碼相等,則送到LCD上顯示,如果不相等,則往下掃描,直到內(nèi)碼相等跳出或者把數(shù)組的所有內(nèi)碼掃描完匹配結(jié)束。
void displayGB2312(u16 x, u16 y, const u8 * ch, u8 size, u8 fontNum, u8 mode)
{
? ? u32 ?t, dataBit;
? ? char temp;
? ? uint8_t high,low,i;
? ? uint16_t k;
? ? u16 y0 = y;
?? ? ?
? ? for(i = 0; i < fontNum; i++)
? ?{ //fontNum為字體個數(shù)
?? ??? ???high = *(ch+i*2); ? ? ? ?//high為高字節(jié)內(nèi)碼
?? ? ? ? ?low ?= *(ch+(i*2+1)); ? ?? //low為低字節(jié)內(nèi)碼
?? ??? ??? ?
?? ??? ??? for(k = 0;k < sizeof(font);k+=((sizeof(font)-2*fontNum)/fontNum+2))//預(yù)掃描所有字體的內(nèi)碼
?? ??? ??? ?{
?? ??? ??? ??? ??? ??? ?if((font[k] == high)&&((font[k+1] == low)))//內(nèi)碼的判斷
?? ??? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ??? ??? ?for(t = k+2; t < (k+((sizeof(font)-2*fontNum)/fontNum+2)); t++)//16-->32,24-->48,36-->72
?? ??? ??? ??? ??? ??? ??? ??? ?{ ? ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ? ??
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?temp = font[t];?? ?//得到點(diǎn)陣數(shù)據(jù)?
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?for(dataBit = 0; dataBit < 8; dataBit++)
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?if(temp & 0x80)
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?LCD_Draw_ColorPoint(x, y, POINT_COLOR);
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?}else if(mode==0){
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?LCD_Draw_ColorPoint(x, y, BACK_COLOR);
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?temp <<= 1;
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?y++;
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?if((y - y0) == size)
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?y = y0;
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?x++;
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?break;
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?} ??? ??
?? ??? ??? ??? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ??? ??? ??? ?break;//內(nèi)碼相等,送給LCD顯示,并結(jié)束掃描,繼續(xù)下一個字體的內(nèi)碼掃描
?? ??? ??? ??? ??? ??? ??? ?}
?? ??? ??? ??? ?}?? ??? ??? ??? ?
?? ??? ?}
}
//=================================================================================//
main函數(shù)實(shí)現(xiàn)如下:
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "lcd.h"
#include "font.h"
#include "key.h"
#include "rtc.h"
int main(void)
{
? ? HAL_Init();
? ? SystemClock_Config();? //初始化系統(tǒng)時鐘為80M
? ? delay_init(80); ? ? ? ? ? ? ? ? //初始化延時函數(shù)80M系統(tǒng)時鐘
? ? uart_init(115200); ? ? ? ? ? //初始化串口,波特率為115200
? ? LED_Init(); ? ? ? ? ? ? ? ? ? ? //初始化LED
? ? LCD_Init(); ? ? ? ? ? ? ? ? ? ? //初始化LCD
? ? KEY_Init();
? ? RTC_Init();
? ? while(1)
? ? {?
?? ??? ??? ?POINT_COLOR = RED;? //字體顏色
?? ??? ??? ?BACK_COLOR = WHITE; ? //字體背景顏色
?? ??? ??? ?displayGB2312(10, 100, (uint8_t*)"為中華之崛起而讀書",24, 9, 0);//x=10,y=100,24字體大小,9為字體個數(shù)
? ? }
}
//==================================================================================//
在LCD上顯示如下圖所示,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
由于是晚上,液晶屏和字體比較小,在上圖沒有看到字體在LCD上顯示,下圖會看到字體顯示。
謝謝!光臨......
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
總結(jié)
以上是生活随笔為你收集整理的潘多拉开发板STM32L475之LCD与GBK(含GB2312)字体显示的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 固态硬盘uefi装win10
- 下一篇: Java的一维数组和二维数组的关系