标题: 单片机sbit数组的问题 [打印本页]

作者: Aorey    时间: 2019-7-22 10:41
标题: 单片机sbit数组的问题
我想使用串口指令控制单片机的引脚,所以想把引脚对应的变量放在sbit数组中,但是keil好像不支持sbit数组,我应该如这编写?

作者: linzhiqi1    时间: 2019-7-23 09:12
用整形变量,通过位运算,一个字节存8个位变量,实现。用宏的方式定义好了。形式上就类似你所要的功能。
作者: lwh999995    时间: 2019-7-24 01:36
sbit 对应可位移空间的1个位,可位寻址,怎么可能 数组
用 char
作者: glmac    时间: 2019-7-24 10:21
例如: 单个引脚可以使用  sbit  led = P0^0 ;  这个是位变量(bit是位的意思,一位就是一个1或者0)

如果想把整个I/O里面的8个针脚一次性变更名称    需要宏定义:
例: #define   LED  P0    // 后面没有分号  使用的时候和直接操作P0一样
作者: Aorey    时间: 2019-8-8 10:03
glmac 发表于 2019-7-24 10:21
例如: 单个引脚可以使用  sbit  led = P0^0 ;  这个是位变量(bit是位的意思,一位就是一个1或者0)

如 ...

就是因为引脚太多了,所以才想用数组,用循环控制,单个写,编程量太大。
作者: Aorey    时间: 2019-8-8 10:04
lwh999995 发表于 2019-7-24 01:36
sbit 对应可位移空间的1个位,可位寻址,怎么可能 数组
用 char

能举个例子吗?我试了用指针也不行。
作者: zynn    时间: 2019-8-8 11:21
可以用char tab[];
作者: witheMe    时间: 2019-8-10 09:08
sbit不可以对数组操作,这是位寻址命令
作者: yanzhe111    时间: 2021-8-27 15:03
你好  请问下这个问题最后你是怎么解决的
作者: lkc8210    时间: 2021-8-27 17:03
yanzhe111 发表于 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. }
复制代码

作者: npn    时间: 2021-8-27 20:59
sbit、bit不支持数组,原因c51指令集位寻址不支持间接寻址、可以定义一个unsigned char数组,然后用函数移位逻辑运算实现。
作者: Y_G_G    时间: 2021-8-27 22:20
8051的引脚变量是通过影射寄存器的实现的,它都有对应的寄存器,读取寄存器的值就是对应引脚的值,操作对应的寄存器就是操作引脚
如果要保存,一个地址不就可以保存8个端口的状态吗?
要数组要干嘛
作者: 188610329    时间: 2021-8-28 14:47
首先更正一下,不是Keil不支持,使单片机不支持,你如果了解一下汇编会明白,所谓的数组,就是通过@R1, 进行间接寻址,你通过改写R1的值,然后@R1 取出不同地址的值。
而对于位地址,没有间接寻址方式,都是直接通过位地址来寻址,所以不存在"数组“ 这个概念。
就好像,寄存器地址,只能直接寻址,不能间接寻址,你尝试看看编个代码能把所有寄存器的内容读出来?
唯一的办法,就是写一个字函数,子函数里枚举所有的地址,然后调用。代码量肯定是省不了的。
作者: 188610329    时间: 2021-8-28 14:58
Aorey 发表于 2019-8-8 10:04
能举个例子吗?我试了用指针也不行。

搂主提到指针,那么,搂主尝试用指针操作P0,P1,这些,等你发现不行了,就会明白,硬件底层的不支持,是多么的无奈。

最后,说一下代码量,和程序大小,其实单片机编程,更在意编译出来程序的大小,而不在乎代码量。直接寻址你代码写的好,最后程序大小要比间接寻址小的多。这也是为什么寄存器都是直接地址了。
作者: 吕海佳    时间: 2021-8-28 21:38
sbit是一个位操作




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1