单片机C51编程中bdata的问题。

来源:百度知道 编辑:UC知道 时间:2024/06/28 06:02:02
我是新手,请教一个问题:

led这个变量控制led灯。
若写入
led_1 = 0;
led_2 = 0;
led_3 = 0;
led_4 = 0;
则四个led灯全亮。

但若用bdata,
unsigned char bdata temp;
temp=0x00;
led_1 = temp^0;
led_2 = temp^1;
led_3 = temp^2;
led_4 = temp^3;
四个灯却不全亮,而是1,0,1,1,只有第二个灯亮。
而temp中0,1,2,3位分明是0,0,0,0,为什么?
前面还有定义过
unsigned char bdata output_sel;
sbit led_1 = output_sel^5;
sbit led_2 = output_sel^6;
sbit led_3 = output_sel^7;
sbit led_4 = output_sel^4;

其中output_sel送到锁存器,再从锁存器连到四个LED。

晕死了.
你根本就没有分清楚 C51中位操作.和 C语言中的异或操作符号.
sbit led_1 = output_sel^5; //这个是位操作
led_1 = temp^0; //这个是异或操作..

如果
temp = 0x0;
temp^0 = 0b0000,0000 ^ 0b0000,0000 = 0b0000,0000
所以led_1 = 0;
同理
temp^1 = 0b0000,0001 ->led_2 = 1;
temp^2 = 0b0000,0010 ->led_3 = 1;
temp^2 = 0b0000,0011 ->led_4 = 1;
也就是你上面说的 只有一个灯亮的情况了.

楼主误解了这个 位寻址区的妙用了!
led_1 = temp^0; 这个语句绝对是异或运算,结果是8位的,
bdata如何使用它呢?
若程序需要8个或者更多的bit变量,如果你想一次性给8个变量赋值的话就不方便了,(举个例子说说它的方便之处,想更深入的了解请在应用中自己琢磨)又不可以定义bit数组,只有一个方法
char bdata MODE;
sbit MODE_7 = MODE^7;
sbit MODE_6 = MODE^6;
sbit MODE_5 = MODE^5;
sbit MODE_4 = MODE^4;
sbit MODE_3 = MODE^3;
sbit MODE_2 = MODE^2;
sbit MODE_1 = MODE^1;
sbit MODE_0 = MODE^0;
8个bit变量MODE_n 就定义好了
这是定义语句,Keilc 的特殊数据类型。记住一定要是sbit
不能 bit MODE_0 = MODE^0;
赋值语句要是这么些C语言就视为异或运算

若有赋值语句MODE=0xB5;(10110101)
可想而只,8个bit变量就被赋值了