STM32显示汉字

以下资料为网络搜集,发现很多都为"原创",无法判断作者了. 自己理解后整理,看官自己另行查找详源
.

也可以参考一下这文章 : STM32F429 之 LTDC汉字显示_ 开发效果图(含代码下载包)

1:一个汉字所占用的空间大小是2B

2: 机内码:计算机中字符的实际存储码。如西文字符,是以ascii码的形式进行存储的,而汉字,是在区位码的基础上加上0xA0,就变成了汉字在计算集中的存储码,也就是机内码。

定义汉字点阵结构体

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;
				    } // end for k
			    } // end for sordByte
				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闪烁
		} 
	}

代码已验证无错, 大家可参考思路!
加油干~~~

猜你喜欢

转载自blog.csdn.net/zhouml_msn/article/details/90022727