STM32教程


前言

在使用STM32驱动OLED屏幕的时候,由于使用的OLED不带中文字库,所以想要显示汉字的时候,每次都需要用取模软件将想要显示的汉字字模数据取出来,比较麻烦,所以自己写了一个可以显示任意汉字的函数,同时制作了一个GB2312的中文字库(目前正在更新中)。


一、GB2312编码

GB2312一共收录了6763个汉字,其中一级汉字3755个,二级汉字3008个,整个字符集又分成94个区,每个区又有94个位,用所在区和位对汉字进行编码,即区位码。这里附上GB2312汉字编码对照表网址,大家可进入此网址查看。
从此网址中,我们可以看到汉字是从第16区开始至88区结束(不包含88区),对应区位码从B0A0开始到F7FF,当然其中有一部分是空字符。

二、函数详解

OLED的库网上多的是,我这边就不把整个库发出来了(需要的可在下方评论)。显示一共使用两个函数,第一个是显示单个汉字的,代码如下:

#define  SetPageStartAddress(n)   0xB0+n //设置页起始命令,范围从0-7
void I2C_OLED_Show_Character(uint8_t x,uint8_t y,uint8_t *str)//OLED指定坐标显示一个汉字
{
	uint8_t Com;
	if(x<=7 && y>=1 && y<=4)//X坐标范围0-7,Y坐标范围1-4,超出无效
	{
		I2C_OLED_WriteCommand(SetPageStartAddress(y*2-2));//发送上半部分页地址(对应16*16汉字)
		I2C_OLED_WriteCommand(0x00); //一个低列地址字节空间显示一个汉字
		I2C_OLED_WriteCommand(0x10+x);//根据x坐标定位高列地址
		for(Com=0;Com<16;Com++)//一个汉字对应宽度为16
		{
			I2C_OLED_WriteData(*str++);
		}
		I2C_OLED_WriteCommand(SetPageStartAddress(y*2-1));//发送下半部分页地址(对应16*16汉字)
		I2C_OLED_WriteCommand(0x00); //一个低列地址字节空间显示一个汉字
		I2C_OLED_WriteCommand(0x10+x);//根据x坐标定位高列地址
		for(Com=0;Com<16;Com++)//一个汉字对应宽度为16
		{
			I2C_OLED_WriteData(*str++);
		}
	}
}

取字模软件中选择字符模式,具体配置如下:
在这里插入图片描述点阵格式选择阴码,取模方式为列行式。
第二个函数显示中文字符串,代码如下:

void I2C_OLED_Show_Character_String(uint8_t x,uint8_t y,uint8_t *str)//OLED对应坐标显示汉字字符串
{
	uint8_t h_byte;
	uint8_t l_byte;
	while(*str!='\0')
	{
		h_byte=*str++;//汉字字节高八位(对应不同区)
		l_byte=*str++;//汉字字节低八位(对应同区不同字)
		if(h_byte>=0xB0 && h_byte <0xB8)//若汉字处于现有字库范围内
		{
			h_byte-=0xB0;//计算不同区的偏移量
		}
		else if(h_byte>=0xB8)//若汉字超出现有字库范围
		{
			h_byte=0XFF;//赋超出范围标志值
		}
		else if(h_byte==0x20)//若为空字符
		{
			h_byte&=0x0f;//清0
		}
		if(l_byte!=0x20 && h_byte!=0xFF)//若汉字处于现有字库范围内且不为空字符
		{
			l_byte-=0xA0;//计算同一个区不同字的偏移量
		}
		else if(l_byte==0x20 || h_byte==0xFF)//若汉字超出现有范围或者为空字符
		{
			l_byte=0;//两偏移量都清0,显示空字符
			h_byte=0;
		}
		I2C_OLED_Show_Character(x++,y,(uint8_t*)GB2312+(l_byte*32)+(h_byte*256*12));//计算整体偏移量,从汉字库中查找对应汉字并显示
	}
}
int main(void)
{
	delay_init();
	I2C_OLED_Init();
	while(1)
	{
		I2C_OLED_Show_Character_String(0,4,"娥恶厄扼遏鄂饿恩");
		I2C_OLED_Show_Character_String(0,4,"佛否夫敷肤孵扶拂");
		I2C_OLED_Show_Character_String(0,4,"背贝钡倍狈备惫焙");
		I2C_OLED_Show_Character_String(0,4,"脆瘁粹淬翠村存寸");
	}
}

在第二个函数中,主要对将显示汉字的编码进行高字节和低字节的分解,随后进行区号和位号的判断,判断完毕后根据汉字的偏移地址从字库中查找对应汉字的字模数据,查到完毕后再使用第一个函数将汉字显示出来。偏移地址计算:高字节地址对应区号,汉字起始区为B0,所以需要减去B0计算区偏移地址;低字节地址对应位号,从A0开始,所以要减去A0计算位偏移地址。由于一个区和下一个区地址偏移了256,所以区地址计算出来后需要乘以256,再乘以12是因为第一个区共有96字符(包括空字符),每个字符对应32个字模数据,96*32/256=12。

三、汉字库

字库链接:
通过百度网盘分享的文件:GB2312.h
链接:https://pan.baidu.com/s/15kzPWx2r1EaB1rtwqBBmAw?pwd=2124
提取码:2124
复制这段内容打开「百度网盘APP 即可获取」
使用时直接包含此文件即可

四、显示效果

在这里插入图片描述字库正在更新中。。。。。

总结

由于汉字库需要的存储空间较大,所以如果使用的型号内存较小不建议使用,还是取字模的方式更实在一点。当然如果有外部FLASH或者内存够大,那用汉字库就非常方便了。

  • 27
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值