单片机C51编程中bdata的问题。
我是新手,请教一个问题:led这个变量控制led灯。若写入led_1=0;led_2=0;led_3=0;led_4=0;则四个led灯全亮。但若用bdata,unsig...
我是新手,请教一个问题:
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。 展开
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。 展开
2个回答
展开全部
晕死了.
你根本就没有分清楚 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;
也就是你上面说的 只有一个灯亮的情况了.
你根本就没有分清楚 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变量就被赋值了
现在
led_1 = MODE_0;
led_2 = MODE_1;
led_3 = MODE_2;
led_4 = MODE_3;
灯的状态就变成了1. 0. 1. 0了
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变量就被赋值了
现在
led_1 = MODE_0;
led_2 = MODE_1;
led_3 = MODE_2;
led_4 = MODE_3;
灯的状态就变成了1. 0. 1. 0了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询