cczjw 发表于 2021-11-28 13:45 这都半个月了,还在纠结这个"汉字"? 有这时间,我早就自己写好一个属于自己的OLED代码了,自己去写代码,更能加深理解,也能从别人的代码中得到更好的经验 |
xhaity 发表于 2021-11-20 11:15 哦,我试试呢。谢谢! |
cczjw 发表于 2021-11-14 23:08 我试了一下,uchar改为uint是可以的啊 struct hzk { unsigned int hzk1; unsigned char hzk4[4]; }; struct hzk const hzkk[] = {"时" ,1,2,3,4,"好",5,6,7,8}; |
cczjw 发表于 2021-11-15 17:12 所以说,既然无所谓翻译成什么, 那么: #define "时" 0x4712 或者 #define "时" 0x47,0x12 让编译过去,不好么? |
Y_G_G 发表于 2021-11-14 14:26 我再试试其它编译器看是否编译器的问题。 |
本帖最后由 cczjw 于 2021-11-14 23:26 编辑 xhaity 发表于 2021-11-14 14:04 我将 struct hzk{uchar hzk_2[2],........}; 的 uchar 改为 uint 也不行。 |
xhaity 发表于 2021-11-14 14:04 环境:proteus V8.9 , XC8 V1.31 谢谢! |
188610329 发表于 2021-11-14 22:31 大概明白你的意思。主要是这是别人做的例程,应该是在他的系统中能够通过。关键是这种写汉字的方法非常方便,一句 “OLED_ShowCHinese(12*8,0,"时",1); ”,把你要写的汉字放进去就行了它自己去查找不用我再去查编码。因此 XC8 能够支持更好,若不能,能够找到能支持的编译器也行。谢谢! |
cczjw 发表于 2021-11-14 17:03 不知道该怎么跟你讲…… 这么说吧,如果,你把 时 换成 '0' 的话,编译应该是能通过的。 他会把它翻译成 0x30,做为这个数组的一部分。 那么,如果,他支持汉字,比如内建了 GB2312 字库, 那么,编译的时候,就会把 “时” 翻译成 0x4712 作为这个数组的一部分,而实际上,一般不会这么做,理由很复杂,三两句说不清,主要原因就是字库太多,不管怎么翻都可能会出现错误。编译的时候按GB2312 编译了, 调用的时候用的 UTF8 去找,同样一个 “时” 数组里面确死活找不到。 严归正传,即便支持GB2312 把 “时” 翻译成 0x4712 实际上最后存在 数组当中的, 还是 0x4712, 所以,你对这个 “时” 能不能通过编译,为什么那么执著呢? 而且,会有另一个问题, “时” = 0x4712 是一个16位数据,你数组是 8 位的, 这么混合放入数组, 又会出现新的错误。 除非,你把后面那些 全都两两结合,变成16位数据,数组改成16位的。那么,通过概率还能大点。反正,换了我,宁可用‘S’ 'H' 来索引 也不愿用 “时” 来索引,即便编译器支持。 因为不知道会帮我编译成什么。 |
xhaity 发表于 2021-11-14 14:05 我试了,改为 uint 也不行。 |
188610329 发表于 2021-11-14 14:01 如果真是这样当然要么不用它要么适应它,问题是我现在需确定XC8是否肯定在这种索引操作中不能用 汉字 作索引?还是我语句语法没用对? |
cczjw 发表于 2021-11-14 13:25 看一下数据手册,有没有其它办法,没有的话,就只能输入代码了 GB2312是汉字字库,说白了就是中国 芯片厂商重视中国市场,就搞个兼容,不重视,你爱咋咋的,PIC也就这几年开始重视中国市场,很多芯片都开始有中文的PDF,当初的PIC16F877A这个经典型号可是没有中文PDF的...... |
汉字编码占用两个字节,定义为uint |
你用的是什么开发平台呢,是不是MICROCHIP 的MPLAB X IDE, MPLAB X IDE 菜单tool->option->Embedded->Generic settings->Default Charset 选择 GB2312 应该可以解决这个问题;还有struct hzk{uchar hzk_2[2],........};修改为struct hzk{uint kzk_1,......}; |
cczjw 发表于 2021-11-14 13:25 1) 你迁就编译器, 他说不许,你就不用。(就像前面说的直接用16进制,然后define呗) 2) 编译器迁就你,他不许,你就换别的编译器,直到这个编译器端正态度,给你用为止,你再考虑用回这个编译器。 讲道底, 商业角度讲,这叫买方市场,还是卖方市场。 情感角度,这叫男追女,还是女追男。 要么有一方让步,要么一拍两散,没必要强拧,瓜不甜。 |
188610329 发表于 2021-11-14 13:22 那,这个问题该怎样解决呢? |
一般,严谨的编译器是不会允许使用汉字的,毕竟没有表头指定的话,同样一个汉字GB2312,UTF8, GB18003, 都是不一样的内码,编译器压根不知道应该按哪个字典来给你译, 编译器表示,这个锅,不背。 |
188610329 发表于 2021-11-13 13:14 你说的这样确实能够应急,但我想找到根本原因,便于以后正常使用。 ![]() |
如果,把这个汉字换成两个独立的16进制就不报错的话……, 你可以尝试按地板的说法,换成0x42,0x79, 然后,define 一下“时” 为 0x4279 ? |
有可能这种写法只能在51的环境下运行,如果换了单片机,你可能试一下GB2312码来代替, 比如"时"是:0x42,0x17 (4217)是"时"的代码 不管是SH1106还是SSD1306,网上都有资料,不要去直接复制别人的代码,用个两三天的时间,自己就可以写了 |
把这个 “时”以及后面的逗号一起删掉就好了吧…… 你字库是 16x16 看你一个字 刚好32个字节, 所以,这个“时” 是不应该出现在字库里才对的。 |