找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8060|回復(fù): 14
收起左側(cè)

單片機(jī)sbit數(shù)組的問題

  [復(fù)制鏈接]
ID:136789 發(fā)表于 2019-7-22 10:41 | 顯示全部樓層 |閱讀模式
我想使用串口指令控制單片機(jī)的引腳,所以想把引腳對應(yīng)的變量放在sbit數(shù)組中,但是keil好像不支持sbit數(shù)組,我應(yīng)該如這編寫?
回復(fù)

使用道具 舉報

ID:532541 發(fā)表于 2019-7-23 09:12 | 顯示全部樓層
用整形變量,通過位運(yùn)算,一個字節(jié)存8個位變量,實現(xiàn)。用宏的方式定義好了。形式上就類似你所要的功能。
回復(fù)

使用道具 舉報

ID:207421 發(fā)表于 2019-7-24 01:36 | 顯示全部樓層
sbit 對應(yīng)可位移空間的1個位,可位尋址,怎么可能 數(shù)組
用 char
回復(fù)

使用道具 舉報

ID:589400 發(fā)表于 2019-7-24 10:21 | 顯示全部樓層
例如: 單個引腳可以使用  sbit  led = P0^0 ;  這個是位變量(bit是位的意思,一位就是一個1或者0)

如果想把整個I/O里面的8個針腳一次性變更名稱    需要宏定義:
例: #define   LED  P0    // 后面沒有分號  使用的時候和直接操作P0一樣
回復(fù)

使用道具 舉報

ID:136789 發(fā)表于 2019-8-8 10:03 | 顯示全部樓層
glmac 發(fā)表于 2019-7-24 10:21
例如: 單個引腳可以使用  sbit  led = P0^0 ;  這個是位變量(bit是位的意思,一位就是一個1或者0)

如 ...

就是因為引腳太多了,所以才想用數(shù)組,用循環(huán)控制,單個寫,編程量太大。
回復(fù)

使用道具 舉報

ID:136789 發(fā)表于 2019-8-8 10:04 | 顯示全部樓層
lwh999995 發(fā)表于 2019-7-24 01:36
sbit 對應(yīng)可位移空間的1個位,可位尋址,怎么可能 數(shù)組
用 char

能舉個例子嗎?我試了用指針也不行。
回復(fù)

使用道具 舉報

ID:515975 發(fā)表于 2019-8-8 11:21 | 顯示全部樓層
可以用char tab[];
回復(fù)

使用道具 舉報

ID:542954 發(fā)表于 2019-8-10 09:08 來自手機(jī) | 顯示全部樓層
sbit不可以對數(shù)組操作,這是位尋址命令
回復(fù)

使用道具 舉報

ID:897750 發(fā)表于 2021-8-27 15:03 | 顯示全部樓層
你好  請問下這個問題最后你是怎么解決的
回復(fù)

使用道具 舉報

ID:161164 發(fā)表于 2021-8-27 17:03 | 顯示全部樓層
yanzhe111 發(fā)表于 2021-8-27 15:03
你好  請問下這個問題最后你是怎么解決的

可以這樣
  1. void IO_out(uchar dat)
  2. {
  3.   P34=dat&0x80;
  4.   P30=dat&0x40;
  5.   P12=dat&0x20;
  6.   P10=dat&0x10;
  7.   P30=dat&0x08;
  8.   P33=dat&0x04;
  9.   P13=dat&0x02;
  10.   P11=dat&0x01;
  11. }
復(fù)制代碼
回復(fù)

使用道具 舉報

ID:57657 發(fā)表于 2021-8-27 20:59 | 顯示全部樓層
sbit、bit不支持?jǐn)?shù)組,原因c51指令集位尋址不支持間接尋址、可以定義一個unsigned char數(shù)組,然后用函數(shù)移位邏輯運(yùn)算實現(xiàn)。
回復(fù)

使用道具 舉報

ID:401564 發(fā)表于 2021-8-27 22:20 | 顯示全部樓層
8051的引腳變量是通過影射寄存器的實現(xiàn)的,它都有對應(yīng)的寄存器,讀取寄存器的值就是對應(yīng)引腳的值,操作對應(yīng)的寄存器就是操作引腳
如果要保存,一個地址不就可以保存8個端口的狀態(tài)嗎?
要數(shù)組要干嘛
回復(fù)

使用道具 舉報

ID:624769 發(fā)表于 2021-8-28 14:47 | 顯示全部樓層
首先更正一下,不是Keil不支持,使單片機(jī)不支持,你如果了解一下匯編會明白,所謂的數(shù)組,就是通過@R1, 進(jìn)行間接尋址,你通過改寫R1的值,然后@R1 取出不同地址的值。
而對于位地址,沒有間接尋址方式,都是直接通過位地址來尋址,所以不存在"數(shù)組“ 這個概念。
就好像,寄存器地址,只能直接尋址,不能間接尋址,你嘗試看看編個代碼能把所有寄存器的內(nèi)容讀出來?
唯一的辦法,就是寫一個字函數(shù),子函數(shù)里枚舉所有的地址,然后調(diào)用。代碼量肯定是省不了的。
回復(fù)

使用道具 舉報

ID:624769 發(fā)表于 2021-8-28 14:58 | 顯示全部樓層
Aorey 發(fā)表于 2019-8-8 10:04
能舉個例子嗎?我試了用指針也不行。

摟主提到指針,那么,摟主嘗試用指針操作P0,P1,這些,等你發(fā)現(xiàn)不行了,就會明白,硬件底層的不支持,是多么的無奈。

最后,說一下代碼量,和程序大小,其實單片機(jī)編程,更在意編譯出來程序的大小,而不在乎代碼量。直接尋址你代碼寫的好,最后程序大小要比間接尋址小的多。這也是為什么寄存器都是直接地址了。
回復(fù)

使用道具 舉報

ID:302400 發(fā)表于 2021-8-28 21:38 | 顯示全部樓層
sbit是一個位操作
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表