最新熱點:
簡體版
訂閱頻道
訂閱電子報
Facebook
Instagram
主頁
專題報導
新聞中心
新品快遞
賣場報價
會員消息
討論區
搜索
我的文章
導航
說明
搜索
註冊
登錄
私人消息 (0)
公共消息 (0)
系統消息 (0)
好友消息 (0)
帖子消息 (0)
電腦領域 HKEPC Hardware
»
程式編寫
» 請教 8051 C的4個 1byte 合併成 4byte 方法
1
2
下一頁
返回列表
發帖
likuen
發短消息
加為好友
likuen
當前離線
UID
105457
帖子
1017
精華
0
積分
753
EPC Dollar
753
註冊時間
2007-12-18
最後登錄
2026-5-25
中級會員
1
#
跳轉到
»
倒序看帖
打印
字體大小:
t
T
發表於 2016-9-7 15:52
|
只看該作者
請教 8051 C的4個 1byte 合併成 4byte 方法
各位師兄,小弟又有一個問題,請各位指點一下。
我由EEPROM 讀入4byte資料,例如:0x00,0x00,0x04,0xD2
希望將它合併成一個 long 的內容,即 0x000004D2 的 Hex內容(即是十進制的1234)
請問可以使甚麼方法合併起來?
還是我想錯方向?
收藏
分享
0
0
天下無雙
發短消息
加為好友
天下無雙
當前離線
UID
142697
帖子
848
精華
0
積分
240
EPC Dollar
240
註冊時間
2009-4-16
最後登錄
2026-4-21
中級會員
2
#
發表於 2016-9-7 16:26
|
只看該作者
Hint: little endian, big endian
TOP
likuen
發短消息
加為好友
likuen
當前離線
UID
105457
帖子
1017
精華
0
積分
753
EPC Dollar
753
註冊時間
2007-12-18
最後登錄
2026-5-25
中級會員
3
#
發表於 2016-9-7 17:47
|
只看該作者
謝謝師兄提示,從你的keyword搜尋到一些線索,我用以下程式控制,但又出現了一些問題,程式大約是這樣:
unsigned long test;
unsigned buff[4] ={0x12,0x34,0x56,0x78};
test = (buff[0] & 0x000000ff)<<8 | (buff[1] & 0x000000ff)<<8 | (buff[2] & 0x000000ff)<<8 | (buff[3] & 0x000000ff);
我希望結果是 test=0x12345678 , 但實際結果是 test=0x00005678
我做了一些測試,就是沒辦法再向左推,請問我那裡想的不對?我用的是 keil C,謝謝
TOP
燕飛
發短消息
加為好友
燕飛
當前離線
UID
31052
帖子
5101
精華
0
積分
2487
EPC Dollar
2487
註冊時間
2005-9-7
最後登錄
2026-6-25
進階會員
4
#
發表於 2016-9-7 17:56
|
只看該作者
回復
3 #
likuen
<<8 =>推左一個 byte <<16先係推兩個 byte
Btw 8051玩32 bit?
via HKEPC Reader for Android
TOP
likuen
發短消息
加為好友
likuen
當前離線
UID
105457
帖子
1017
精華
0
積分
753
EPC Dollar
753
註冊時間
2007-12-18
最後登錄
2026-5-25
中級會員
5
#
發表於 2016-9-7 18:24
|
只看該作者
本帖最後由 likuen 於 2016-9-7 18:28 編輯
回復 likuen
燕飛 發表於 2016-9-7 17:56
謝謝師兄回答,因我有一個較大的數據作處理,放在EEPROM 內容大約是0-100,000,我理解是用 long 作儲存及運算,所以需要在EEPROM 叫出4個1byte ,隨後結合成1個4byte使用。不知道對嗎?
師兄的提示是否如下:
test = (buff[0] & 0x000000ff)<<8 | (buff[1] & 0x000000ff)<<16 | (buff[2] & 0x000000ff)<<8 | (buff[3] & 0x000000ff);
以上我沒試過,但試了<<20,<<24 也不行。是不是我現在用了32Bit 數據,但8051 不能達到這種計算能力?
TOP
燕飛
發短消息
加為好友
燕飛
當前離線
UID
31052
帖子
5101
精華
0
積分
2487
EPC Dollar
2487
註冊時間
2005-9-7
最後登錄
2026-6-25
進階會員
6
#
發表於 2016-9-7 20:31
|
只看該作者
本帖最後由 燕飛 於 2016-9-7 20:33 編輯
回覆
5#
likuen
8051 <- 8 bit instruction set
用16 bit register 已經係出cheat先得
你用緊咩Compiler?
有冇睇過disassembly?
TOP
likuen
發短消息
加為好友
likuen
當前離線
UID
105457
帖子
1017
精華
0
積分
753
EPC Dollar
753
註冊時間
2007-12-18
最後登錄
2026-5-25
中級會員
7
#
發表於 2016-9-7 20:54
|
只看該作者
回覆
6#
燕飛
非常感謝你的提醒,在你的提醒下,我開始解釋到我遇到的問題。
請問甚麼是disassembly?
我用keil c compiler.
TOP
Charcoal99
發短消息
加為好友
Charcoal99
當前離線
UID
255738
帖子
618
精華
0
積分
617
EPC Dollar
617
來自
HK
註冊時間
2012-5-12
最後登錄
2021-7-9
中級會員
8
#
發表於 2016-9-7 21:46
|
只看該作者
本帖最後由 Charcoal99 於 2016-9-7 22:59 編輯
基本上這問題是不用做算術運算的,只需要把byte陣列表達為long variable type 即可,
兩個簡單方法:
1) 使用 Union
union {
unsigned char u8[4];
unsigned long u32;
} buffer;
unsigned long test;
buffer.u8[0] = 0x12;
buffer.u8[1] = 0x34;
buffer.u8[2] = 0x56;
buffer.u8[4] = 0x78;
test = buffer.u32;
複製代碼
2) cast char pointer into long pointer
unsigned long test;
unsigned char buffer[4] = { 0x12, 0x34, 0x56, 0x78 };
test = *(long *)buffer; //或者是 test = *(long *)&buffer[0];
複製代碼
Keil C51 的貯存方式是 Big endian, 即4個byte的order是前方byte0 是higher order byte.
如果你仍堅持要做算術運算(對8bitCPU來說效率較差), 那應該是
test = (unsigned long)buff[0]<<24 |
(unsigned long)buff[1]<<16 |
buff[2]<<8 |
buff[3];
複製代碼
Keil C51 在做算術運算 << 時, 運算元 buff[] 的default型態為 int 或 unsigned int, 即只有 16bit,
超過16bit 時要先 promote 到 32bit 的 long 型態。 所以你的做法只有低16bit的結果。
對8bit 運算元 來說 &0x000000ff 的bit Mask 操作是不必要及多餘的,也不會把前者promote到32bit 的 。
TOP
likuen
發短消息
加為好友
likuen
當前離線
UID
105457
帖子
1017
精華
0
積分
753
EPC Dollar
753
註冊時間
2007-12-18
最後登錄
2026-5-25
中級會員
9
#
發表於 2016-9-7 23:22
|
只看該作者
回覆
8#
Charcoal99
超感謝師兄的指點,我使用的是16bit MCU, 我明天試一下你提供的程式,再一次謝謝你。
TOP
likuen
發短消息
加為好友
likuen
當前離線
UID
105457
帖子
1017
精華
0
積分
753
EPC Dollar
753
註冊時間
2007-12-18
最後登錄
2026-5-25
中級會員
10
#
發表於 2016-9-8 17:41
|
只看該作者
回覆
8#
Charcoal99
今天已試過三種方式,正如師兄說效能最差是第三種,我選了第二種,貪佢簡單。但不是很明白第2個"*"是甚麼意思( test=*(long *)buffer; )
請問你是看那類型的參考書?因我翻遍我的書也沒有提這個,可否介紹一下書本或網上資源讓我進修。
再次謝謝你。
TOP
1
2
下一頁
返回列表
HKEPC
本站公告
最新消息
網站問題回報
大型電腦展
Event
完結活動記錄區
Sapphire HD 7770 組別
SEAGATE Wireless Plus 試用體驗分享
XFX R9 系列繪圖卡使用體驗分享
NVIDIA x Inno3D 繪圖卡超頻比賽
Linksys 「WRT1200AC」試用分享
「SAPPHIRE Next Gen 2015」徵文活動
「 ASUS ROG Insight 2015 」徵文活動專區
Linksys WRT 用家專享禮遇
「 ASROCK OCF 2015 」徵文活動專區
「LINKSYS EA7500.開箱」專區
Synology DSM 6.0 開箱文活動
LINKSYS EA9500 旗艦開箱文專區
LINKSYS MaxStream 系列‧無縫連接新體驗
「 LINKSYS VELOP .開箱文專區」
ASUSTOR AS6302T .開箱文提交專區
Sapphire HD 7700 超頻比賽(完結)
Sapphire HD 7750 組別
免費升級Galaxy GTX660
Everbest x HKEPC「ECS MOD」取消
舊"U" 迎新春 - 升級「Piledriver」
分享、教學精華文投稿
Plextor M6Pro SSD 開箱文比賽
ASUSTOR AS4004T.開箱文提交專區
AsRock Z77主機板開箱賞(完結)
Ducky Zero DK2108 試用徵文
WD Connected to Life 口號創作比賽
協助美女挑選 Plextor SSD
CM女郎「邊個夠佢靚」攝影比賽
WD Computex2013 大激賞
ANTEC TruePower Classic 550W 開箱文專區
WD Black2雙硬碟試用體驗」
XFX R9 系列 Benchmark 競猜活動
GALAX GTX970 / 980 開箱文分享
Synology RT1900ac 試用評測
Synology MR2200ac 開箱文開箱文試用體驗
我的 Antec 電源供應器包裝盒設計(完結)
Antec 產品聖誕寫真大激賞
GALAXY 送你全新3D Mark 序號
WD 包裝盒環保設計比賽
NVIDIA SHIELD 體驗會分享區
Plextor M6S 雙重賞
ASUS 主機板至尊十年霸
「 ASUS ROG Insight 2014 」分享活動專區
Inno3D GAME PACK 開箱文(已完結)
WD My Book Live 個人雲端 "智"幫手
Antec GX700 試用大激賞
ASUS Tech Forum 體驗會分享
Inno3D iChill 9 系繪圖卡開箱分享
Philips 揚聲器、耳機使用分享
NVIDIA SHIELD 體驗分享
ASUS STRIX Techday2015徵文活動專區
HKEPC足球挑戰賽
Plextor 「 M5 Pro 系列發佈會後感」分享
ZOTAC 「開箱文」分享
RAZER TOUR 徵文活動提交
Hardware
系統組件
系統故障
砌機組合
電腦資訊轉貼
顯卡討論
顯示屏幕
超頻領域
儲存燒錄
固態硬碟
外置儲存
HKEPC OC Lab
網絡寬頻
Linksys WRT 技術交流
NAS 專集
單板電腦
Portable Computer
行動電腦
NetBook 族群
Eeepc 專區
平板電腦
Computer Accessories
散熱特區
液冷降溫
機箱博覽
硬件周邊
DIY 地帶
電子世界
DIY地帶精華區
Diyer 個人展覽館
立體製作空間
輸入裝置
虛擬實境
Apple World
蘋果國度
蘋果影音
蘋果軟件
蘋果 iPhone
蘋果 iPad
iOS apps
出機攻略
Mobile Phone
Android Phone
Android Phone 軟件
Smart Phone
Smart Phone 軟件
Symbian Phone
Symbian Phone 軟件
電訊網絡
手機周邊
Software
軟體討論
Linux玩家
程式編寫
病毒攻防
Windows 探索
Microsoft Office 應用
Game Zone
電玩硬件
電玩軟體
手遊熱玩
Digital
數碼視聽
攝影學堂
作品藝廊
影音領域
耳界大開
數碼廣播
節目資訊
Leisure
興趣百科
動漫狂迷
體育世界
愛車人士
單車會社
Trading
交易廣場(電腦類)
交換/徵求
交易廣場 (電腦周邊及電玩類)
徵求/交換
交易廣場(其它類)
徵求/交換
易手格價
團購專區
組團諮詢
epc $ 拍賣場
拍賣完畢
徵求/問價
交易完結
[收藏此主題]
[關注此主題的新回覆]
[通過 QQ、MSN 分享給朋友]