历史上的今天
返回首页

历史上的今天

今天是:2025年08月17日(星期日)

2018年08月17日 | STM32中LCD显示少量汉字

2018-08-17 来源:eefocus

在STM32中怎样在LCD显示屏中对汉字进行显示(只是汉字),下面针对这个问题是我的一点小小的看法,如有问题希望读者留言;


以下程序主要针对STM32中库函数进行操作:


在LCD显示汉字,首先需要对汉字进行取模,我们都知道一个汉字所占用的空间大小是2B。接下来通过取模软件对所需要显示的汉字进行取模(注意有的取模软件可能存在问题)。


在这我们要补充一个知识就是汉字在计算机中存储形式:


 输入码:汉字的字数繁多,字形复杂,常用的汉字有6000—7000个,比英文的26个字母要多得多。在计算机系统中使用汉字,首先遇到的问题就是如何把汉字输入到计算机内。为了能直接使用西文标准

键盘进行输入,必须为汉字设计相应的编码方法。汉字编码方法主要分为三类:数字编码、拼音编码和字形编码。 

机内码:计算机中字符的实际存储码。如西文字符,在计算机中是以ascii码的形式进行存储的,而我们的汉字,是在区位码的基础上加上A0H(16进制),就变成了汉字在计算集中的存储码,也就是机内码。 汉字点阵码是一种用黑白两色点阵来表示汉字字形的编码。

定义汉字点阵结构体

typedef struct typFNT_GB16                 // 汉字字模数据结构

{

       signed char Index[2];               // 汉字内码索引

       char Msk[32];                       // 点阵码数据

};


紧接着建立自己所需的字库,在这我随意创建一个:


struct typFNT_GB16 code GB_16[] =          // 数据表

{

"饼", 0x20,0x00,0x21,0x08,0x20,0x90,0x3C,0x00,

      0x47,0xFC,0x48,0x90,0xA0,0x90,0x20,0x94,

      0x27,0xFE,0x20,0x90,0x20,0x90,0x24,0x90,

      0x28,0x90,0x31,0x10,0x22,0x10,0x04,0x10,



"昌", 0x1F,0xF0,0x10,0x10,0x10,0x10,0x1F,0xF0,

      0x10,0x10,0x10,0x10,0x1F,0xF0,0x00,0x08,

      0x3F,0xFC,0x20,0x08,0x20,0x08,0x3F,0xF8,

      0x20,0x08,0x20,0x08,0x3F,0xF8,0x20,0x08,



"除", 0x00,0x40,0x78,0x40,0x48,0xA0,0x50,0xA0,

      0x51,0x10,0x62,0x0E,0x55,0xF4,0x48,0x40,

      0x48,0x50,0x4F,0xFC,0x68,0x40,0x51,0x50,

      0x42,0x4C,0x44,0x44,0x41,0x40,0x40,0x80,

}


其中定义的汉字结构体元素中Index[2]存放汉字,而Msk用于存放点阵码。


具体程序如下:


void show_chinese(uint16_t x, uint16_t y, uint8_t *p, 

                     uint16_t wordColor, uint16_t backColor)

{

uint8_t i, wordByte ;

uint16_t color,wordNum;



u8 k=0;


while(*p != '\0')

{




for(wordNum=0;wordNum<3;wordNum++)

{

if(*p==chinese[wordNum].Index[0] && *(p+1)==chinese[wordNum].Index[1])

tft_set_window(x, y, x+15, y+15);  

for(wordByte = 0;wordByte < 32; wordByte++)

{

uint8_t color = chinese[wordNum].Msk[wordByte];

for ( k = 0;k<8; k++) 

{

if ((color&0x80) == 0x80)

{

tft_wrdat(wordColor);

else

{

tft_wrdat(backColor);


color = color<<1;

}

 

}

p+=2;

x += 16;

if(x > 225)   

{

x = 0;

y += 16; 

}

 

}






}


}


其中tft_set_window(x, y, x+15, y+15)设置要操作的窗口范围,tft_wrdat(wordColor)LCD写数据,


然后就可以直接在主函数中进行汉字的显示程序编写:


int main()

tft_init(); //TFT彩屏初始化 

LED_Init(); //LED初始化

tft_clear_screen(BLACK); //清屏

show_chinese(6,20,"饼昌除",MAGENTA,YELLOW);  //YELLOW

while(1)

led_display(); //LED闪烁


}


具体的LED和TFT的初始化各位应该都是很清楚的,在这就不多说了。


推荐阅读

史海拾趣

Gentron Corp公司的发展小趣事
在演出或活动中作为舞台灯光效果使用,增加舞台氛围。
谷峰(GOFORD)公司的发展小趣事

在电子产品日益追求轻薄化、高效能的大背景下,GStek不断加大研发投入,致力于技术创新和产品研发。公司拥有一支由行业资深专家和年轻技术骨干组成的研发团队,他们紧密跟踪国际前沿技术动态,结合市场需求,不断推出具有自主知识产权的新产品。这些新产品不仅性能优异,而且成本效益显著,深受市场欢迎。通过持续的技术创新和产品升级,GStek在电源管理领域树立了良好的品牌形象。

AntennaHome公司的发展小趣事

随着5G技术的快速发展,电子行业迎来了新的变革。AntennaHome公司面临着来自行业内外的巨大挑战。为了应对这一变革,公司加大了对5G天线技术的研发力度,同时积极调整产品结构和市场策略。经过一段时间的努力,公司成功推出了多款适应5G时代需求的新型天线产品,为公司的持续发展奠定了坚实的基础。

Ampex Data Systems Group公司的发展小趣事

AntennaHome公司自创立之初,便以技术创新为核心竞争力。公司的创始人在无线通信领域拥有深厚的技术背景和丰富的行业经验,他们敏锐地捕捉到了市场对于高性能天线产品的需求。于是,公司投入大量资源进行研发,成功开发出了一款具有高效能、低损耗特点的新型天线产品,这一创新为公司在市场上赢得了良好的口碑。

DFRobot公司的发展小趣事

在竞争激烈的电子行业中,DFRobot始终保持创新精神和技术领先。他们不断推出具有创新性和实用性的新产品和技术解决方案,如基于RISC-V构架的开源硬件产品、人工智能教育产品等。这些新产品和技术不仅满足了客户的需求,也推动了行业的发展和进步。同时,DFRobot还注重知识产权保护,积极申请各类专利和软件著作权,保护公司的创新成果和知识产权。

通过以上五个故事,我们可以看到DFRobot在电子行业中的发展历程和成就。他们凭借对技术的热爱和不懈的努力,逐渐在机器人和开源硬件领域崭露头角,并通过拓展教育市场、国际合作和品牌建设等举措,不断提升公司的竞争力和影响力。

Bay Linear Inc公司的发展小趣事

在电子行业的早期,Bay Linear Inc公司以其精湛的技术和前瞻性的视野,成功研发出了一款高效能、低能耗的线性电源管理芯片。这款产品凭借出色的性能,迅速获得了市场的认可,为公司在行业内赢得了良好的声誉。随着技术的不断进步,公司又陆续推出了多款创新产品,不断巩固和扩大市场份额。

问答坊 | AI 解惑

LED辞典

[hide]表面粘着型LED的出现是在1980年初,是因应更小型封装和工厂自动化而生。初期厂商裹足不前,主要因素是表面粘着LED最早面临的问题是无法完成高温红外线下焊锡回流的步骤。LED的比热较IC低,温度升高时不仅会造成亮度下降,且超过摄氏100度时将 ...…

查看全部问答>

急问:2440+wince5.0 碰到奇怪的音频问题!

原来系统没有问题,将显示驱动由16bit该为24bit之后显示没有问题,但是奇怪的是音频竟然出问题了: 跑explore时有开机声音,但只是一开始响一下就没了,有时是开始正常,点触摸屏几下后或打开个文件夹后触摸点击声就没了! 该回16bit后一切正常 ...…

查看全部问答>

Win32 SDK 用GetMenuItemInfo获取菜单标题用SetMenuItemInfo设置菜单标题

非MFC ATL,Win32 SDK 用GetMenuItemInfo获取菜单标题用SetMenuItemInfo设置菜单标题。哪位高手有经验,给点儿代码,我自己的代码用GetLastError用是返回87,快晕了!help me!! 代码:         MENUITEMINFO mii;   ...…

查看全部问答>

keil中怎么用结构,联合定义位变量?

keil中怎么用结构,联合定义位变量?我在ARM中这么定义正确吗? typedef union _MAC_FRAME_CONTROL{    WORD_VAL word;    struct _MAC_FRAME_CONTROL_bits    {     &nbs ...…

查看全部问答>

TL494的典型应用电路

该电路的能否调试成功取决于硬件电路制作的可靠性和阻容元件的选择。 [ 本帖最后由 wxf1357 于 2011-7-8 10:08 编辑 ]…

查看全部问答>

基于TMS320F2812 flash搬移到RAM里运行实现(转载)

去年在论坛上了“28335 学习系列__FLASH 搬移到RAM 运行实现方法”之后,很多网友提问有没有F2812 FLASH 搬移到RAM 运行实现方法。其实,TI 28系列DSP目前用的很广泛的,关于FLASH搬移到RAM里运行文章也很多,但还有很多人不清楚如何实现,说明这些 ...…

查看全部问答>

C语言的问题

我在学习MSP430的时候,在给出的一个例子中看到在代码中出现这样的定义#error msp430x16x.h file for use with ICC430/A430 only 是什么意思啊    …

查看全部问答>

【视频分享】IDM控制BLDC的使用方法

IDM控制BLDC的使用方法简介   $(\'swf_Q9d\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', encodeURI(\'http://player.youku.co ...…

查看全部问答>

用2600系列数字源表进行IDDQ测试和待机电流测试

CMOS集成电路(CMOS IC)和电池供电产品的制造商需要测量静态(或“待机”)电源电流用于验证生产测试质量。CMOS IC或其中含有CMOS IC成品的漏电电流测量过程被称为IDDQ测试。此测试要求在IC处于静态条件下测量VDD电源电流。测试的目的是检查栅氧 ...…

查看全部问答>