数码之家

 找回密码
 立即注册
搜索
查看: 2380|回复: 19

[C51] 请教关于Keil C51中的汉字数组问题

[复制链接]
发表于 2023-7-27 15:32:55 | 显示全部楼层 |阅读模式
本帖最后由 lmn2005 于 2023-7-27 17:09 编辑

用到LCD屏,需要显示汉字,因此需要汉字编码数组。但是,keil可能对中文不太友好,所以出现如下的问题.
单片机用STC12C5A60S2
先定义一个汉字索引数组:
  1. unsigned char code index_hanzi[] = {"年月日正一二"};
复制代码
然后写了一个搜索汉字的函数:
  1. uchar find_hanzi(uchar *hz) // 搜索汉字索引,返回汉字的位置
  2. {
  3.   uchar i;
  4.   for (i = 0; i < (sizeof(index_hanzi) / 2); i++)
  5.   {
  6.     if (index_hanzi[i * 2] == *hz && index_hanzi[i * 2 + 1] == *(hz + 1))
  7.     {
  8.       return i;    }
  9.   }
  10.   return 255;
  11. }
复制代码
然后用打印函数进行检验:
  1.   printf("%d\r\n", (uint)find_hanzi("年"));
  2.   printf("%d\r\n", (uint)find_hanzi("月"));
  3.   printf("%d\r\n", (uint)find_hanzi("日"));
  4. printf("%d\r\n", (uint)find_hanzi("正"));
  5.   printf("%d\r\n", (uint)find_hanzi("一"));
  6.   printf("%d\r\n", (uint)find_hanzi("二"));
复制代码
结果打印如下:
其中前三个汉字可以正常搜索到,而后面三个汉字无法在汉字数组中搜索到。
使用其他汉字进行检验,也出现同样的问题,
就是一些汉字可以搜索得到,一些汉字无法搜索到,不知道是什么原因。
请各位大佬指教,谢谢!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
头像被屏蔽
发表于 2023-7-27 16:50:37 | 显示全部楼层
可去STCAIMCU的网站问STC研发人员
回复 支持 反对

使用道具 举报

发表于 2023-7-27 18:24:45 | 显示全部楼层
keil有个bug一直不改……搜一下“C51 汉字补丁”,按提示操作一下就可以了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-27 18:52:36 | 显示全部楼层
本帖最后由 lmn2005 于 2023-7-27 18:53 编辑
amo73 发表于 2023-7-27 18:24
keil有个bug一直不改……搜一下“C51 汉字补丁”,按提示操作一下就可以了
我试试=======

回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-27 18:54:04 | 显示全部楼层
STC新高度 发表于 2023-7-27 16:50
可去STCAIMCU的网站问STC研发人员

应该不是单片机的问题
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-27 19:37:53 | 显示全部楼层
补丁打了,好了,果真是FD问题,感谢@amo73!
回复 支持 1 反对 0

使用道具 举报

发表于 2023-7-28 08:30:23 | 显示全部楼层



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 2 反对 0

使用道具 举报

 楼主| 发表于 2023-7-28 09:14:36 | 显示全部楼层

这个问题以前好像有看过,但以为printf打印汉字才会出问题,没想到搜索汉字数组也会出问题。
回复 支持 反对

使用道具 举报

发表于 2023-7-28 09:50:54 | 显示全部楼层
打印汉字要有字库吧,要不LCD自带字库,要不static字库
回复 支持 反对

使用道具 举报

发表于 2023-7-28 12:00:32 | 显示全部楼层
现在直接手动转码操作了,"\xE8\xBD\xAF\xE4\xBB\xB6\xE6\x9B\xB4\xE6\x96\xB0...",//软件更新...比如这样是转的UTF8,这样不管啥编码都不怕了
回复 支持 反对

使用道具 举报

发表于 2023-7-31 09:50:47 | 显示全部楼层
lmn2005 发表于 2023-7-27 19:37
补丁打了,好了,果真是FD问题,感谢@amo73!

我最开始也是猜是不是0xFD问题,但看后边几个汉字也有问题,以为猜错了。现在又学到一个新知识,看来只要有这个0xFD问题,那后边的也会受影响。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-1 07:40:52 | 显示全部楼层
kanson 发表于 2023-7-28 09:50
打印汉字要有字库吧,要不LCD自带字库,要不static字库

通过串口向电脑打印信息的
回复 支持 反对

使用道具 举报

发表于 2023-8-1 19:01:57 | 显示全部楼层
千年老病了,含有0xfd的不能正常编译
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-8-24 13:29:19 | 显示全部楼层
本帖最后由 lmn2005 于 2023-8-24 18:45 编辑

keil MDK也出现类似的问题:
编译Lcd_P16x16Ch(0, 0,"正");//在LCD单色屏上显示汉字
会出现下面的警告:
../Src/main.c(117): warning: passing 'char [3]' to parameter of type 'uint8_t *' (aka 'unsigned char *') converts between pointers to integer types where one is of the unique plain 'char' type and the other is not [-Wpointer-sign]
        Lcd_P16x16Ch(0, 0,"<D5><FD>");
                          ^~~~~~~~~~
../Inc\ST6567.h(19): note: passing argument to parameter 'hz' here
void Lcd_P16x16Ch(uint8_t x, uint8_t y, uint8_t *hz);
                                                 ^
1 warning generated.
请教,这个又该如何解决呢?

附:函数原型为:
void Lcd_P16x16Ch(uint8_t x, uint8_t y,uint8_t *hz)
回复 支持 反对

使用道具 举报

发表于 2023-8-24 13:57:46 来自手机浏览器 | 显示全部楼层
有些特殊的字符需要特殊处理
回复 支持 反对

使用道具 举报

发表于 2023-8-24 14:42:17 | 显示全部楼层
这个问题遇到过,最初练习1602屏幕的时候想显示公司名字,玛德,死活出不来
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-24 14:59:24 | 显示全部楼层
wangxiangtan2 发表于 2023-8-24 14:42
这个问题遇到过,最初练习1602屏幕的时候想显示公司名字,玛德,死活出不来 ...

我的只是警告,但却能正常在LCD9632上显示汉字。
回复 支持 反对

使用道具 举报

发表于 2023-8-24 16:09:36 | 显示全部楼层
lmn2005 发表于 2023-7-28 09:14
这个问题以前好像有看过,但以为printf打印汉字才会出问题,没想到搜索汉字数组也会出问题。 ...

keil c51/c251 丢弃了0xfd, 所有都会有影响。
回复 支持 反对

使用道具 举报

发表于 2023-8-24 16:14:13 | 显示全部楼层
xueyeteng 发表于 2023-7-31 09:50
我最开始也是猜是不是0xFD问题,但看后边几个汉字也有问题,以为猜错了。现在又学到一个新知识,看来只要 ...

keil 因 丢弃了0xfd,  后面的汉字就错位了,导致所有都会有影响。按7楼的方法处理一下。
自用可以使用汉字补丁,一劳永逸。有人提到源码可能会在打了补丁及未打补丁的用户造成不统一,可在代码中增加一下注释即可。可百度搜索 “0XFD 冠铭版”,新版支持C51及STC32所用的C251编译器。


1101
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-24 17:28:11 | 显示全部楼层
keil  C51 C251的这个问题解决了,直接用KeilFDfix(FD补丁冠铭同学版),但MDK涉及汉字的类似问题至今还无法解决,因为KeilFDfix(FD补丁冠铭同学版)只针对C51或 C251 的。
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-22 17:43 , Processed in 0.265201 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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