289|9

988

帖子

3

资源

纯净的硅(中级)

【GD32E503评测】 汉字及字符串显示的实验 [复制链接]

    在对开发板TFT屏幕显示进行了初步了解之后,这将完成了显示汉字的实验,同时写了一个可以用8*16点阵显示ASCII码和16*16点阵显示汉字的字符串函数,改进了原范例只能显示单个字符的缺陷。下图为显示的效果:

display_07.jpg

 

    显示控制的代码如下图,可以在字符串中任意包含汉字或ASCII字符:

display_05.jpg

 

    汉字字库的结构如下图:

display_06.jpg

    字符串显示的函数如下:

/*!
    \brief      从根据指定位置开始在液晶屏上显示字符串(8*16ASCII和16*16汉字字符集)
    \param[in]  x: the start position of row-coordinate    X坐标
    \param[in]  y: the start position of column-coordinate Y坐标
    \param[in]  text: the char                             要显示的字符串
    \param[in]  char_color: the color of char              字符颜色
    \param[in]  c_format: the structure of char format     字体(字库)
                  font: CHAR_FONT_8_16 or CHAR_FONT_16_24
                  direction: CHAR_DIRECTION_HORIZONTAL or CHAR_DIRECTION_VERTICAL
                  char_color: the color of char
                  bk_color: the color of background
    \param[out] none
    \retval     none
*/
void lcd_strue_display(uint16_t x,uint16_t y,uint8_t *str,char_format_struct c_format)
{
    uint8_t i,j,k,temp_char;
	uint16_t X,Y;
	X = x;
	Y = y;
	while(*str){
        if(((uint8_t)(*str)) < 128){   //显示单字节ASCII(8*16)
            if(*str > 31){
                for (i = 0; i < 16; i++) { //显示16行的点阵
                    temp_char = ascii_8x16[((*str - 0x20) * 16) + i];
                    for (j = 0; j < 8; j++) {
                        if (((temp_char >> (7 - j)) & 0x01) == 0x01) {
                            lcd_point_set(X + j, Y + i, c_format.char_color);
                        } else {
                            lcd_point_set(X + j, Y + i, c_format.bk_color);
                        }
                    }
                }
            }
			str++;	
            X += 8;	
		}
		else{                          //显示双字节汉字(16*16)
		    for(k=0; k<200; k++){      //在汉字字符集中查找小于200次
			    if((GB_16ID[k][0] == *(str)) && (GB_16ID[k][1] == *(str + 1))){
		    		for( i=0; i<16; i++){//显示16行的点阵(左半边)
                        temp_char = GB_16[(k * 32) + i];
                        for (j = 0; j < 8; j++) {
                            if (((temp_char >> (7 - j)) & 0x01) == 0x01) {
                                lcd_point_set(X + j, Y + i, c_format.char_color);
                            } else {
                                lcd_point_set(X + j, Y + i, c_format.bk_color);
                            }
                        }
			    	}
		    		for( i=0; i<16; i++){//显示16行的点阵(右半边)
                        temp_char = GB_16[(k * 32) + i + 16];
                        for (j = 0; j < 8; j++) {
                            if (((temp_char >> (7 - j)) & 0x01) == 0x01) {
                                lcd_point_set(X + j + 8, Y + i, c_format.char_color);
                            } else {
                                lcd_point_set(X + j + 8, Y + i, c_format.bk_color);
                            }
                        }
			    	}
				}
			}
			str += 2;
			X += 16;
		}
	}
}

 

    在这个函数中暂时还没有考虑改变字体方向的问题,稍后准备增加这项功能,以便与范例代码衔接。

 

赞赏

1

查看全部赞赏


回复

713

帖子

2

资源

版主

不错不错!有木有字体点阵的设置方式,行扫描列扫描啥的,可以贴出图片来。

点评

第二幅图片就是:横向取模左高位,数据排列从上到下从左到右。  详情 回复 发表于 7 天前

回复

988

帖子

3

资源

纯净的硅(中级)

w494143467 发表于 2021-1-12 22:19 不错不错!有木有字体点阵的设置方式,行扫描列扫描啥的,可以贴出图片来。

第二幅图片就是:横向取模左高位,数据排列从上到下从左到右。

点评

好嘞,到时候我试一下,这样就不用各种试方向了。  详情 回复 发表于 7 天前

回复

713

帖子

2

资源

版主

hujj 发表于 2021-1-13 09:34 第二幅图片就是:横向取模左高位,数据排列从上到下从左到右。

好嘞,到时候我试一下,这样就不用各种试方向了。


回复

988

帖子

3

资源

纯净的硅(中级)

    经过测试,字符串的水平方向显示也成功了,下面是显示的效果: display_08.jpg

 

    显示的代码如下:

display_09.jpg

 

    显示的函数代码:

/*!
    \brief      从根据指定位置开始在液晶屏上显示字符串(8*16ASCII和16*16汉字字符集)
    \param[in]  x: the start position of row-coordinate    X坐标
    \param[in]  y: the start position of column-coordinate Y坐标
    \param[in]  text: the char                             要显示的字符串
    \param[in]  char_color: the color of char              字符颜色
    \param[in]  c_format: the structure of char format     字体(字库)
                  font: CHAR_FONT_8_16 or CHAR_FONT_16_24
                  direction: CHAR_DIRECTION_HORIZONTAL or CHAR_DIRECTION_VERTICAL
                  char_color: the color of char
                  bk_color: the color of background
    \param[out] none
    \retval     none
*/
void lcd_strue_display(uint16_t x,uint16_t y,uint8_t *str,char_format_struct c_format)
{
    uint8_t i,j,k,temp_char;
	uint16_t X,Y;
	X = x;
	Y = y;
	while(*str){
        if(((uint8_t)(*str)) < 128){   //显示单字节ASCII(8*16)
            if(*str > 31){
				if(CHAR_DIRECTION_HORIZONTAL == c_format.direction){//水平显示
                    for (i = 0; i < 16; i++) { //显示16行的点阵
                        temp_char = ascii_8x16[((*str - 0x20) * 16) + i];
                        for (j = 0; j < 8; j++) {
                            if (((temp_char >> (7 - j)) & 0x01) == 0x01) {
                                lcd_point_set(X - i, Y + j, c_format.char_color);
                            } else {
                                lcd_point_set(X - i, Y + j, c_format.bk_color);
                            }
                        }
                    }
					Y += 8;
			    }else{
				    for (i = 0; i < 16; i++) { //显示16行的点阵
                        temp_char = ascii_8x16[((*str - 0x20) * 16) + i];
                        for (j = 0; j < 8; j++) {
                            if (((temp_char >> (7 - j)) & 0x01) == 0x01)
                                lcd_point_set(X + j, Y + i, c_format.char_color);
                            else
                                lcd_point_set(X + j, Y + i, c_format.bk_color);
                        }
                    }
		    		X += 8;
				}

            }
			str++;
		}
		else{                          //显示双字节汉字(16*16)
		    for(k=0; k<200; k++){      //在汉字字符集中查找小于200次
			    if((GB_16ID[k][0] == *(str)) && (GB_16ID[k][1] == *(str + 1))){
					if(CHAR_DIRECTION_HORIZONTAL == c_format.direction){  //水平显示
                		for( i=0; i<16; i++){//显示16行的点阵(左半边)
                            temp_char = GB_16[(k * 32) + i];
                            for (j = 0; j < 8; j++) {
                                if (((temp_char >> (7 - j)) & 0x01) == 0x01)
                                    lcd_point_set(X - i, Y + j, c_format.char_color);
                                else
                                    lcd_point_set(X - i, Y + j, c_format.bk_color);
                            }
                        }
			            for( i=0; i<16; i++){//显示16行的点阵(右半边)
                            temp_char = GB_16[(k * 32) + i + 16];
                            for (j = 0; j < 8; j++) {
                                if (((temp_char >> (7 - j)) & 0x01) == 0x01)
                                    lcd_point_set(X - i, Y + j + 8, c_format.char_color);
                                else
                                    lcd_point_set(X - i, Y + j + 8, c_format.bk_color);
                            }
                        }
						Y += 16;
			    	} else {
                		for( i=0; i<16; i++){//显示16行的点阵(左半边)
                            temp_char = GB_16[(k * 32) + i];
                            for (j = 0; j < 8; j++) {
                                if (((temp_char >> (7 - j)) & 0x01) == 0x01)
                                    lcd_point_set(X + j, Y + i, c_format.char_color);
                                else
                                    lcd_point_set(X + j, Y + i, c_format.bk_color);
                            }
                        }
			            for( i=0; i<16; i++){//显示16行的点阵(右半边)
                            temp_char = GB_16[(k * 32) + i + 16];
                            for (j = 0; j < 8; j++) {
                                if (((temp_char >> (7 - j)) & 0x01) == 0x01)
                                    lcd_point_set(X + j + 8, Y + i, c_format.char_color);
                                else
                                    lcd_point_set(X + j + 8, Y + i, c_format.bk_color);
                            }
                        }
						X += 16;
					}
				}
			}
			str += 2;
		}
	}
}

 


回复

3182

帖子

1

资源

五彩晶圆(初级)

谢谢分享,期待后续!

个人签名人已离开,无事别找,找也找不到。

回复

175

帖子

0

资源

一粒金砂(中级)

牛!昨天晚上还在研究这个,没搞出来~

点评

这是参照范例照葫芦画瓢,就是水平(横向)和垂直(竖向)有点懵圈,测试了多次才成功的。  详情 回复 发表于 6 天前
个人签名

gitee/casy


回复

988

帖子

3

资源

纯净的硅(中级)

caizhiwei 发表于 2021-1-14 08:18 牛!昨天晚上还在研究这个,没搞出来~

这是参照范例照葫芦画瓢,就是水平(横向)和垂直(竖向)有点懵圈,测试了多次才成功的。


回复

175

帖子

0

资源

一粒金砂(中级)

汉字或者图片取模的软件,能分享一下吗?

个人签名

gitee/casy


回复

988

帖子

3

资源

纯净的硅(中级)

这个软件也是从网上获得的,我已经用习惯了,感觉很好用,完全可以满足我的需要。顺便感谢一下软件的作者!

lcd汉字取模软件.rar (2.9 MB, 下载次数: 3)


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

最新文章 更多>>
    关闭
    站长推荐上一条 1/7 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2021 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表