发布网友 发布时间:2022-11-05 17:53
共4个回答
热心网友 时间:2023-10-23 08:08
你那么写不是不对,但是要看具体的情况.追答额,那PA.3口设置成输出写DDRA=0XF7不行吗?为什么要加&呢(这个与有什么效果)?还有有些为什么加"|"啊,比如DDRA |=0B11110111tangram_guid_1358952779097
举个例子,假设,原来的PA中,PA.0,PA.2是输入状态,PA.3是输出状态,现在我需要把PA.3改变为输入状态,那么,如果按照你的写法,DDRA = 0xF7,这句话的结果,PA.3的确如你所愿变成了输入,但是,同时,你也把PA.0,PA.2的状态改变了,这是不符合要求的.
你的C语言基础有待再扎实一下,&表示"位与"的意思,我随便举个例子:
例如: 0x55 & 0x67 = ?
这样算,把两个数字都打成二进制,然后一位一位的进行"与"运算,即双1才得1,有0则0
任何一位,不管它是1,还是0,只要是与 1相与,都保持不变,1&1 = 1,0&1 = 0
任何一位,不管它是1,还是0,只要是与 0相与,都要变成0 ,1&0 = 0,0&0 = 0
0x55 = 01010101
0x67 = 01100111
-------------------------------
01000101
所以 0x55 & 0x67 = 0x45
所以 DDRA &= 0xF7 ,0xF7 = 1111 0111
根据我说的,
任何一位,不管它是1,还是0,只要是与 1相与,都保持不变,1&1 = 1,0&1 = 0
任何一位,不管它是1,还是0,只要是与 0相与,都要变成0 ,1&0 = 0,0&0 = 0
所以,只有第三位变成了0,而其他位,因为是与"1"相与,所以保持原来状态不变.
所以,再达到第三位变成0的目的的同时,也没有改变其他位的状态.
而你后面提到的那个 "位或" ,就是"|"这个符号,与&的表现差不多,是按位进行"或"运算.
运算的原则是:双0才得0,有1即为1;
任何一位,不管它是1,还是0,只要是与 1相或,都要变成1, 1|1 = 1,0|1 = 1
任何一位,不管它是1,还是0,只要是与 0相或,都保持不变 ,1|0 = 1,0|0 = 0
所以,你明白:DDRA |=0B11110111为什么这么写了吗?
热心网友 时间:2023-10-23 08:09
采用读-修改-写操作,防止修改其它不应修改的位。热心网友 时间:2023-10-23 08:09
简单些说&操作可以清0某些位而不会影响到其他位的原来状态,| 操作可以置1某些位而不影响其他位的原来状态。就是这样,一个是清0指定位,一个是置1指定位,两者都不会影响其他位的操作热心网友 时间:2023-10-23 08:10
可以,