熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時(shí)間: 2021-11-12 22:22
正文摘要:如下 : 原源文件是51系統(tǒng)的。 環(huán)境:proteus V8.9 , XC8 V1.31 |
cczjw 發(fā)表于 2021-11-28 13:45 這都半個(gè)月了,還在糾結(jié)這個(gè)"漢字"? 有這時(shí)間,我早就自己寫好一個(gè)屬于自己的OLED代碼了,自己去寫代碼,更能加深理解,也能從別人的代碼中得到更好的經(jīng)驗(yàn) |
xhaity 發(fā)表于 2021-11-20 11:15 哦,我試試呢。謝謝! |
cczjw 發(fā)表于 2021-11-14 23:08 我試了一下,uchar改為uint是可以的啊 struct hzk { unsigned int hzk1; unsigned char hzk4[4]; }; struct hzk const hzkk[] = {"時(shí)" ,1,2,3,4,"好",5,6,7,8}; |
cczjw 發(fā)表于 2021-11-15 17:12 所以說(shuō),既然無(wú)所謂翻譯成什么, 那么: #define "時(shí)" 0x4712 或者 #define "時(shí)" 0x47,0x12 讓編譯過去,不好么? |
Y_G_G 發(fā)表于 2021-11-14 14:26 我再試試其它編譯器看是否編譯器的問題。 |
本帖最后由 cczjw 于 2021-11-14 23:26 編輯 xhaity 發(fā)表于 2021-11-14 14:04 我將 struct hzk{uchar hzk_2[2],........}; 的 uchar 改為 uint 也不行。 |
xhaity 發(fā)表于 2021-11-14 14:04 環(huán)境:proteus V8.9 , XC8 V1.31 謝謝! |
188610329 發(fā)表于 2021-11-14 22:31 大概明白你的意思。主要是這是別人做的例程,應(yīng)該是在他的系統(tǒng)中能夠通過。關(guān)鍵是這種寫漢字的方法非常方便,一句 “OLED_ShowCHinese(12*8,0,"時(shí)",1); ”,把你要寫的漢字放進(jìn)去就行了它自己去查找不用我再去查編碼。因此 XC8 能夠支持更好,若不能,能夠找到能支持的編譯器也行。謝謝! |
cczjw 發(fā)表于 2021-11-14 17:03 不知道該怎么跟你講…… 這么說(shuō)吧,如果,你把 時(shí) 換成 '0' 的話,編譯應(yīng)該是能通過的。 他會(huì)把它翻譯成 0x30,做為這個(gè)數(shù)組的一部分。 那么,如果,他支持漢字,比如內(nèi)建了 GB2312 字庫(kù), 那么,編譯的時(shí)候,就會(huì)把 “時(shí)” 翻譯成 0x4712 作為這個(gè)數(shù)組的一部分,而實(shí)際上,一般不會(huì)這么做,理由很復(fù)雜,三兩句說(shuō)不清,主要原因就是字庫(kù)太多,不管怎么翻都可能會(huì)出現(xiàn)錯(cuò)誤。編譯的時(shí)候按GB2312 編譯了, 調(diào)用的時(shí)候用的 UTF8 去找,同樣一個(gè) “時(shí)” 數(shù)組里面確死活找不到。 嚴(yán)歸正傳,即便支持GB2312 把 “時(shí)” 翻譯成 0x4712 實(shí)際上最后存在 數(shù)組當(dāng)中的, 還是 0x4712, 所以,你對(duì)這個(gè) “時(shí)” 能不能通過編譯,為什么那么執(zhí)著呢? 而且,會(huì)有另一個(gè)問題, “時(shí)” = 0x4712 是一個(gè)16位數(shù)據(jù),你數(shù)組是 8 位的, 這么混合放入數(shù)組, 又會(huì)出現(xiàn)新的錯(cuò)誤。 除非,你把后面那些 全都兩兩結(jié)合,變成16位數(shù)據(jù),數(shù)組改成16位的。那么,通過概率還能大點(diǎn)。反正,換了我,寧可用‘S’ 'H' 來(lái)索引 也不愿用 “時(shí)” 來(lái)索引,即便編譯器支持。 因?yàn)椴恢罆?huì)幫我編譯成什么。 |
xhaity 發(fā)表于 2021-11-14 14:05 我試了,改為 uint 也不行。 |
188610329 發(fā)表于 2021-11-14 14:01 如果真是這樣當(dāng)然要么不用它要么適應(yīng)它,問題是我現(xiàn)在需確定XC8是否肯定在這種索引操作中不能用 漢字 作索引?還是我語(yǔ)句語(yǔ)法沒用對(duì)? |
cczjw 發(fā)表于 2021-11-14 13:25 看一下數(shù)據(jù)手冊(cè),有沒有其它辦法,沒有的話,就只能輸入代碼了 GB2312是漢字字庫(kù),說(shuō)白了就是中國(guó) 芯片廠商重視中國(guó)市場(chǎng),就搞個(gè)兼容,不重視,你愛咋咋的,PIC也就這幾年開始重視中國(guó)市場(chǎng),很多芯片都開始有中文的PDF,當(dāng)初的PIC16F877A這個(gè)經(jīng)典型號(hào)可是沒有中文PDF的...... |
漢字編碼占用兩個(gè)字節(jié),定義為uint |
你用的是什么開發(fā)平臺(tái)呢,是不是MICROCHIP 的MPLAB X IDE, MPLAB X IDE 菜單tool->option->Embedded->Generic settings->Default Charset 選擇 GB2312 應(yīng)該可以解決這個(gè)問題;還有struct hzk{uchar hzk_2[2],........};修改為struct hzk{uint kzk_1,......}; |
cczjw 發(fā)表于 2021-11-14 13:25 1) 你遷就編譯器, 他說(shuō)不許,你就不用。(就像前面說(shuō)的直接用16進(jìn)制,然后define唄) 2) 編譯器遷就你,他不許,你就換別的編譯器,直到這個(gè)編譯器端正態(tài)度,給你用為止,你再考慮用回這個(gè)編譯器。 講道底, 商業(yè)角度講,這叫買方市場(chǎng),還是賣方市場(chǎng)。 情感角度,這叫男追女,還是女追男。 要么有一方讓步,要么一拍兩散,沒必要強(qiáng)擰,瓜不甜。 |
188610329 發(fā)表于 2021-11-14 13:22 那,這個(gè)問題該怎樣解決呢? |
一般,嚴(yán)謹(jǐn)?shù)木幾g器是不會(huì)允許使用漢字的,畢竟沒有表頭指定的話,同樣一個(gè)漢字GB2312,UTF8, GB18003, 都是不一樣的內(nèi)碼,編譯器壓根不知道應(yīng)該按哪個(gè)字典來(lái)給你譯, 編譯器表示,這個(gè)鍋,不背。 |
188610329 發(fā)表于 2021-11-13 13:14 你說(shuō)的這樣確實(shí)能夠應(yīng)急,但我想找到根本原因,便于以后正常使用。 ![]() |
如果,把這個(gè)漢字換成兩個(gè)獨(dú)立的16進(jìn)制就不報(bào)錯(cuò)的話……, 你可以嘗試按地板的說(shuō)法,換成0x42,0x79, 然后,define 一下“時(shí)” 為 0x4279 ? |
有可能這種寫法只能在51的環(huán)境下運(yùn)行,如果換了單片機(jī),你可能試一下GB2312碼來(lái)代替, 比如"時(shí)"是:0x42,0x17 (4217)是"時(shí)"的代碼 不管是SH1106還是SSD1306,網(wǎng)上都有資料,不要去直接復(fù)制別人的代碼,用個(gè)兩三天的時(shí)間,自己就可以寫了 |
把這個(gè) “時(shí)”以及后面的逗號(hào)一起刪掉就好了吧…… 你字庫(kù)是 16x16 看你一個(gè)字 剛好32個(gè)字節(jié), 所以,這個(gè)“時(shí)” 是不應(yīng)該出現(xiàn)在字庫(kù)里才對(duì)的。 |
Powered by 單片機(jī)教程網(wǎng)