找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6365|回复: 14
打印 上一主题 下一主题
收起左侧

单片机sbit数组的问题

  [复制链接]
跳转到指定楼层
楼主
ID:136789 发表于 2019-7-22 10:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我想使用串口指令控制单片机的引脚,所以想把引脚对应的变量放在sbit数组中,但是keil好像不支持sbit数组,我应该如这编写?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:532541 发表于 2019-7-23 09:12 | 只看该作者
用整形变量,通过位运算,一个字节存8个位变量,实现。用宏的方式定义好了。形式上就类似你所要的功能。
回复

使用道具 举报

板凳
ID:207421 发表于 2019-7-24 01:36 | 只看该作者
sbit 对应可位移空间的1个位,可位寻址,怎么可能 数组
用 char
回复

使用道具 举报

地板
ID:589400 发表于 2019-7-24 10:21 | 只看该作者
例如: 单个引脚可以使用  sbit  led = P0^0 ;  这个是位变量(bit是位的意思,一位就是一个1或者0)

如果想把整个I/O里面的8个针脚一次性变更名称    需要宏定义:
例: #define   LED  P0    // 后面没有分号  使用的时候和直接操作P0一样
回复

使用道具 举报

5#
ID:136789 发表于 2019-8-8 10:03 | 只看该作者
glmac 发表于 2019-7-24 10:21
例如: 单个引脚可以使用  sbit  led = P0^0 ;  这个是位变量(bit是位的意思,一位就是一个1或者0)

如 ...

就是因为引脚太多了,所以才想用数组,用循环控制,单个写,编程量太大。
回复

使用道具 举报

6#
ID:136789 发表于 2019-8-8 10:04 | 只看该作者
lwh999995 发表于 2019-7-24 01:36
sbit 对应可位移空间的1个位,可位寻址,怎么可能 数组
用 char

能举个例子吗?我试了用指针也不行。
回复

使用道具 举报

7#
ID:515975 发表于 2019-8-8 11:21 | 只看该作者
可以用char tab[];
回复

使用道具 举报

8#
ID:542954 发表于 2019-8-10 09:08 来自手机 | 只看该作者
sbit不可以对数组操作,这是位寻址命令
回复

使用道具 举报

9#
ID:897750 发表于 2021-8-27 15:03 | 只看该作者
你好  请问下这个问题最后你是怎么解决的
回复

使用道具 举报

10#
ID:161164 发表于 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. }
复制代码
回复

使用道具 举报

11#
ID:57657 发表于 2021-8-27 20:59 | 只看该作者
sbit、bit不支持数组,原因c51指令集位寻址不支持间接寻址、可以定义一个unsigned char数组,然后用函数移位逻辑运算实现。
回复

使用道具 举报

12#
ID:401564 发表于 2021-8-27 22:20 | 只看该作者
8051的引脚变量是通过影射寄存器的实现的,它都有对应的寄存器,读取寄存器的值就是对应引脚的值,操作对应的寄存器就是操作引脚
如果要保存,一个地址不就可以保存8个端口的状态吗?
要数组要干嘛
回复

使用道具 举报

13#
ID:624769 发表于 2021-8-28 14:47 | 只看该作者
首先更正一下,不是Keil不支持,使单片机不支持,你如果了解一下汇编会明白,所谓的数组,就是通过@R1, 进行间接寻址,你通过改写R1的值,然后@R1 取出不同地址的值。
而对于位地址,没有间接寻址方式,都是直接通过位地址来寻址,所以不存在"数组“ 这个概念。
就好像,寄存器地址,只能直接寻址,不能间接寻址,你尝试看看编个代码能把所有寄存器的内容读出来?
唯一的办法,就是写一个字函数,子函数里枚举所有的地址,然后调用。代码量肯定是省不了的。
回复

使用道具 举报

14#
ID:624769 发表于 2021-8-28 14:58 | 只看该作者
Aorey 发表于 2019-8-8 10:04
能举个例子吗?我试了用指针也不行。

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

最后,说一下代码量,和程序大小,其实单片机编程,更在意编译出来程序的大小,而不在乎代码量。直接寻址你代码写的好,最后程序大小要比间接寻址小的多。这也是为什么寄存器都是直接地址了。
回复

使用道具 举报

15#
ID:302400 发表于 2021-8-28 21:38 | 只看该作者
sbit是一个位操作
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表