找回密码
 立即注册

QQ登录

只需一步,快速开始

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

keil位变量能不能定义数据?

  [复制链接]
跳转到指定楼层
楼主
ID:72649 发表于 2025-10-30 20:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
// 状态标志位,记录每个通道是否已经触发延时
bit adc_triggered[ADC_CHANNELS] = {0};
unsigned char adc_triggered[ADC_CHANNELS] = {0};
第一句位变量定义,是否可以用下面的代替,功能一样吗?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:57657 发表于 2025-10-30 21:54 | 只看该作者
keil不支持位变量,51单片机没有间接位寻址指令,用移位逻辑运算代替。
回复

使用道具 举报

板凳
ID:72649 发表于 2025-10-31 04:03 来自触屏版 | 只看该作者
npn 发表于 2025-10-30 21:54
keil不支持位变量,51单片机没有间接位寻址指令,用移位逻辑运算代替。

上面这句应该怎样修改?
回复

使用道具 举报

地板
ID:277550 发表于 2025-10-31 08:54 | 只看该作者

第一行,不可以,编译不通过
第二行,可以
回复

使用道具 举报

5#
ID:476527 发表于 2025-10-31 12:04 | 只看该作者
可以试试用位结构体+联合体吧。
/* 标志结合体 */
typedef union{
        unsigned char all;
        struct{
                unsigned char CH0: 1;
                unsigned char CH1: 1;
                unsigned char CH2: 1;
                unsigned char CH3: 1;
                unsigned char CH4: 1;
                unsigned char NO_USE:3;
        }part;
}UNION_ADC_CHANNEL;
UNION_ADC_CHANNEL adc_triggered;  //用于表示当前的按键情况
------------------------------------
此后,可以用adc_triggered.all = 0一键清空所有标志。
或者用adc_triggered.part.CH1 = 1单独设置某个标志位。
回复

使用道具 举报

6#
ID:1138150 发表于 2025-11-1 01:08 | 只看该作者
// 位数组方式 - 节省内存
bit adc_triggered[ADC_CHANNELS] = {0};

// 字节数组方式 - 使用更多内存,但操作更直观
unsigned char adc_triggered[ADC_CHANNELS] = {0};

// 使用时的区别:
// 位数组
adc_triggered[0] = 1;        // 直接赋值
if(adc_triggered[0]) {...}   // 直接判断

// 字节数组  
adc_triggered[0] = 1;        // 同样赋值
if(adc_triggered[0] != 0) {...} // 建议明确判断
回复

使用道具 举报

7#
ID:1110477 发表于 2025-11-1 03:53 | 只看该作者
好像C51不能定义位变量数组,因为数组的本质是连续存储并通过指针进行线性间接变址访问,但是51机器指令码对于内存的20H到2F的位存储区,无法利用R0、R1寄存器间接寻址方式访问,所以无法定义“位类型”的数组
回复

使用道具 举报

8#
ID:1110477 发表于 2025-11-1 03:54 | 只看该作者
源洋川 发表于 2025-11-1 01:08
// 位数组方式 - 节省内存
bit adc_triggered[ADC_CHANNELS] = {0};

你真的在C51的编译环境下定义并通过了位数组,我要试一试
回复

使用道具 举报

9#
ID:879809 发表于 2025-11-1 18:09 | 只看该作者
如果这么定义:bit adc_triggered[ADC_CHANNELS]
那么如果x是个变量,无法对adc_triggered[x]进行读写,从机器码层面上就不存在这种操作,想都不用想这种定义就是错的。
回复

使用道具 举报

10#
ID:879348 发表于 2025-11-3 08:24 | 只看该作者
目前的单片机都不缺RAM了,没必要一定用bit处理问题,反正我做项目是从来不定义位变量
回复

使用道具 举报

11#
ID:491577 发表于 2025-11-3 22:25 | 只看该作者
keil支持位变量,但是不支持位数组。要使用位变量只能够一个个定义不可用数组。
回复

使用道具 举报

12#
ID:1162267 发表于 2025-11-4 14:57 | 只看该作者
能替代,核心功能(记录通道是否触发的 0/1 标志)一致,但有两点关键区别: 内存:bit 数组每个元素占 1 位,更省空间;unsigned char 数组每个元素占 1 字节,耗内存更多。 兼容性:bit 是编译器扩展类型(如 C51),移植性差;unsigned char 是标准 C 类型,所有编译器都支持。
回复

使用道具 举报

13#
ID:1146065 发表于 2025-11-4 15:27 | 只看该作者
不能替代,本身就是错误的
回复

使用道具 举报

14#
ID:879809 发表于 2025-11-12 16:52 | 只看该作者
ozq123 发表于 2025-11-4 14:57
能替代,核心功能(记录通道是否触发的 0/1 标志)一致,但有两点关键区别: 内存:bit 数组每个元素占 1  ...

你定义一个“bit 数组”出来让大家也乐一乐。
回复

使用道具 举报

15#
ID:235200 发表于 2025-11-12 21:10 | 只看该作者
在汇编语言中可以定义的,学会汇编与C语言混编程,可以轻松解决
如:
data EQU 20H          ;必须具有位寻址的存储器
x1 EQU data^0
x2 EQU data^1
x3 EQU data^2
x4 EQU data^3
x5 EQU data^4
x6 EQU data^5
x7 EQU data^6
x8 EQU data^7
回复

使用道具 举报

16#
ID:275826 发表于 2025-11-16 19:50 | 只看该作者
unsigned char  bdata  a; a相当于位数组
回复

使用道具 举报

17#
ID:883242 发表于 2025-11-18 05:17 | 只看该作者
csmyldl 发表于 2025-11-12 21:10
在汇编语言中可以定义的,学会汇编与C语言混编程,可以轻松解决
如:
data EQU 20H          ;必须具有位 ...

规范的写法第一个equ应该是bdata,后面的8个equ是bit,这样汇编才是relocatable,你这种写法如果用BL51连接就全乱套了。
回复

使用道具 举报

18#
ID:1034262 发表于 2025-11-18 18:07 | 只看该作者
不能,KEIL不支持位数组。
回复

使用道具 举报

19#
ID:1163294 发表于 2025-11-18 23:11 | 只看该作者

keil支持位变量,但是不支持位数组。要使用位变量只能够一个个定义不可用数组。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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