OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3209|回复: 0

潘多拉开发板STM32L475之LCD与GBK(含GB2312)字体显示

[复制链接]

2

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2017-6-29
在线时间
14 小时
发表于 2019-8-30 09:02:42 | 显示全部楼层 |阅读模式
本帖最后由 ZhuoHan 于 2019-8-30 09:53 编辑

参考资料:1、SanjaySTM32L475潘多拉IoT Board开发板TFTLCD ST7789V2 硬件SPI+软件SPI驱动+中文字符显示, 链接为:http://www.openedv.com/forum.php ... =%C5%CB%B6%E0%C0%AD
                2、正点原子的潘多拉STM32L475开发板TFLCD显示资料。


一、GBK字体的内码获取
#include <stdio.h>
#include <stdint.h>
int main(void)
{
    uint8_t *str="国";                  //一个中文字体占2个字节
    uint8_t p,q;
    p=*str;                                 //获取国字的前(高)一个字节
    q=*(++str);                          //获取国字的后(低)一个字节
    printf("%.2X,%.2X\r\n",p,q);  //打印GBK字体内码
    return 0;
}

            &#8203;
用原子哥团队开发的内码软件查看国字的内码如下:
                                &#8203;

可知:国字打印的内码原子哥的内码查询软件是一样的。
每个 GBK 码由 2 个字节组成,第一个字节(高位)为 0X81~0XFE,第二个字节(低位)分为两部分,一是 0X40~0X7E,二是 0X80~0XFE。其中与 GB2312 相同的区域,字完全相同。

二、根据内码LCD显示24*24大小字体点阵库

在LCD上显示“我为中华之崛起而读书”9个字体,先获取它们的内码,如下所示,
#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;
}
“为中华之崛起而读书”的内码如下所示,
&#8203;

用“PCtoLCD2002.exe”软件获取“为中华之崛起而读书”的点阵库,如下图所示,
&#8203;

在数组或者内存中以以下格式存储,
222222222222222222222222.png

定义一个数组,把内码和字体点阵库放在一起,如下图所示,
const uint8_t font[]={
0xCE,0xAA,/*"为"的内码高位和低位*/
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,/*"中"的内码高位和低位*/
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,/*"华"的内码高位和低位*/
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,/*"之"的内码高位和低位*/
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,/*"崛"的内码高位和低位*/
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,/*"起"的内码高位和低位*/
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,/*"而"的内码高位和低位*/
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,/*"读"的内码高位和低位*/
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,/*"书"的内码高位和低位*/
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*/
}



//==============================================================================//

把字体通过函数作为实参传进来,获取实参字体的内码,然后扫描font数组中的每一个字体的内码,如果内码相等,则送到LCD上显示,如果不相等,则往下扫描,直到内码相等跳出或者把数组的所有内码扫描完匹配结束。
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为字体个数
                high = *(ch+i*2);        //high为高字节内码
                low  = *(ch+(i*2+1));      //low为低字节内码
            
                for(k = 0;k < sizeof(font);k+=((sizeof(font)-2*fontNum)/fontNum+2))//预扫描所有字体的内码
                {
                        if((font[k] == high)&&((font[k+1] == low)))//内码的判断
                        {
                                for(t = k+2; t < (k+((sizeof(font)-2*fontNum)/fontNum+2)); t++)//16-->32,24-->48,36-->72
                                {                                                      
                                        temp = font[t];    //得到点阵数据
                                        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;//内码相等,送给LCD显示,并结束扫描,继续下一个字体的内码扫描
                            }
                }               
        }
}


//=================================================================================//
main函数实现如下:

#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(); //初始化系统时钟为80M
    delay_init(80);                 //初始化延时函数80M系统时钟
    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为字体个数
    }
}



//==================================================================================//
在LCD上显示如下图所示,
                                                 &#8203;
                                 &#8203;
由于是晚上,液晶屏和字体比较小,在上图没有看到字体在LCD上显示,下图会看到字体显示。





正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-16 11:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表