3172|11

13

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

新手关于|=、&=~、^=真心搞糊涂了,求解释 [复制链接]

if(p1|0x01==0)这是个按键的判定程序中的一段,按键后是低电平,不解,从没想过与“1”的逻辑或会=0
p1|=bit_0或者0x00还有一个寄存器经常|=这个寄存器内部的一位,我的解释是前边代表的八位不管是甚么吧与后边这一位是1的相或,当然结果就是那一位变成1拉
至于&=~、^=按上边的都能解释,但是段首的if语句就真搞不懂了,求解释

最新回复

清华出版社出的烂书比好书多得多,只要出钱,再烂的书他们都敢出版  详情 回复 发表于 2013-3-25 20:24
 
点赞 关注

回复
举报

2781

帖子

417

TA的资源

五彩晶圆(中级)

沙发
 
if(p1|0x01==0) 是错的。你那儿看到的?
 
个人签名
 

回复

389

帖子

0

TA的资源

纯净的硅(高级)

板凳
 
我的unsigned int 是4哥字节的
本来用char类型就可以验证了
总结一下:
a|=b  等价于 a=a|b;
a&=~b 等价于  a=a&(~b);
a^=b 等价于 a=a^b;

Image00016.jpg (21.89 KB, 下载次数: 0)

实验结果

实验结果

点评

int不管有符号没符号都两个字节啊  详情 回复 发表于 2013-3-23 08:15
 
 
 

回复

13

帖子

0

TA的资源

一粒金砂(中级)

4
 
那个if语句是在清华出版社的msp430上看到的,是第五章常用接口设计——>键盘接口后边有个例程里有,真是看不懂,莫非是盗版书??
 
 
 

回复

13

帖子

0

TA的资源

一粒金砂(中级)

5
 

回复 板凳 yaoyong 的帖子

int不管有符号没符号都两个字节啊

点评

2个字节没错,就算是4个字节,这个输出都是没错的,你要注意,这里高位段的数据都是0呀。 if(p1|0x01==0) ,这个的写法都是有误的。一般都是或出1来的,与出1的,那有你这样的。 0 ==(P1 | 0x01 ),这个  详情 回复 发表于 2013-3-23 10:52
 
 
 

回复

436

帖子

5

TA的资源

五彩晶圆(初级)

6
 
原帖由 qwe2549325 于 2013-3-23 08:15 发表
int不管有符号没符号都两个字节啊

2个字节没错,就算是4个字节,这个输出都是没错的,你要注意,这里高位段的数据都是0呀。

if(p1|0x01==0) ,这个的写法都是有误的。一般都是或出1来的,与出1的,那有你这样的。

0 ==(P1 | 0x01 ),这个表达式永远都是假,因为最低位一定是1。

点评

打错了,不好意思。 if(p1|0x01==0) ,这个的写法都是有误的。 一般都是或出0来的,例如 0xF7 == (0xF5 | P1) 与出1的,0x05 == (0x05 & P1)。 同样的道理,0x02 ==(P1 & 0x01 ),这个表达式永远都  详情 回复 发表于 2013-3-23 11:00
 
 
 

回复

436

帖子

5

TA的资源

五彩晶圆(初级)

7
 
原帖由 lr2131 于 2013-3-23 10:52 发表

2个字节没错,就算是4个字节,这个输出都是没错的,你要注意,这里高位段的数据都是0呀。

if(p1|0x01==0) ,这个的写法都是有误的。一般都是或出1来的,与出1的,那有你这样的。

0 ==(P1 | 0x01 ),这个表 ...

打错了,不好意思。

if(p1|0x01==0) ,这个的写法都是有误的。

一般都是或出0来的,例如 0xF7 == (0xF5 | P1)
与出1的,0x05 == (0x05 & P1)。
同样的道理,0x02 ==(P1 & 0x01 ),这个表达式永远都是假。
那有你这样的。
 
 
 

回复

13

帖子

0

TA的资源

一粒金砂(中级)

8
 
MSP430-IO中断方式按键检测.txt                                                                                     //分别使用了采个三个按键接到MSP430的通用IO口,按任意一个按键可以使板上的LED反转.
      //例程中,单片机一直处于最低功耗状态,用户可以通过按下按键后唤醒单片机.单片机唤醒
      //后再进行去抖动动作.同时执行键处理程序.处理完后再次进入LPM4低功耗模式.
      //在本程序中用户可以灵活地修改程序来实现你相关的功能.
      //本程序适用在手持设备或电池供电的设计中.此程序结构比较通用,级用户可参与或套用修改.
      //应用目标板:MC430F14x开发板
      /*************************************************************************/
      #include

      #define key1 0x01
      #define key2 0x02
      #define key3 0x04
      #define delay_small 200

      #define key_1 0xfe      //定义返回键值1
      #define key_2 0xfd      //定义返回键值2
      #define key_3 0xfb      //定义返回键值3

      void key_process_0(void);
      void key_process_1(void);
      void key_process_2(void);
      void key_check (void);
      unsigned char key_value;          //定义键值全局变是
      //*************************************************************************
      void main(void)
      {
      WDTCTL = WDTPW + WDTHOLD;              // 停止看门狗
      P1OUT |= BIT1;                         //关LED
        P1DIR |= BIT1;                        // 设置P1.1为输出

        //以下设置是采用不同的编写方式,新手可以参考使用
        P2IE |= BIT0+BIT1+BIT2;               // P2.0-P2.2 IO口中断使能
        P2IES |= 0x07;                        // P2.0-P2.2 IO口边沿触发中断方式设置
        P2IFG &= ~(key1+key2+key3);           // P2.0-P2.2 IO口中断标志位清除  
        _EINT();                              //中断允许
        // 或直接写成 _BIS_SR(LPM4_bits + GIE);           
      LPM4;                                  // 进入低功耗LPM4,此时单片机功耗最低

      while(1)
      {
        P2IE &= ~(BIT0+BIT1+BIT2);        // P2.0-P2.2 IO口关闭中断允许
        P2IFG &= ~0x07;                   // P2.0-P2.2 IO口中断标志位清除
        key_check ();
        switch (key_value)                //对键值进行处理.采switch语法结构查询
         {
         case key_1: key_process_0();      //调用键处理程序1
                    break;
         case key_2: key_process_1();      //调用键处理程序2
                    break;  
         case key_3: key_process_2();      //调用键处理程序2
                    break;
         default:   break;                                    
         }
        key_value=0x00;                    //键值清除
        P2IE |= BIT0+BIT1+BIT2;            // P2.0-P2.2 IO口中断使能
        P2IFG &= ~0x07;                   // P2.0-P2.2 IO口中断标志位清除
        LPM4;
      }

      }

      //*************************************************************************
      //P2中断服务程序
      #pragma vector=PORT2_VECTOR
      __interrupt void Port_2(void)
      {  
      switch (P2IFG)
        {  
         case 0x01: key_value=0xfe;
                    break;
         case 0x02: key_value=0xfd;
                    break;
         case 0x04: key_value=0xfb;
                    break;   
        default:  P2IFG &= ~0x07;             // P2.0-P2.2 IO口中断标志位清除
                    break;           
        }
        P2IFG &= ~0x07;           // P2.0-P2.2 IO口中断标志位清除
        LPM4_EXIT;
      }


      //*************************************************************************
      void key_process_0(void)          //值处理,用户可以自己修改...
      {
      P1OUT ^= BIT1;  
      }
      //*************************************************************************
      void key_process_1(void)        //值处理,用户可以自己修改...
      {
      P1OUT ^= BIT1;  
      }
      //*************************************************************************
      void key_process_2(void)      //值处理,用户可以自己修改...
      {
      P1OUT ^= BIT1;  
      }

      //**************************************************************************
      void key_check (void)
      { unsigned int i;
      for(i=0;i       if(0xff !=(P2IN & 0xf8))           //是否有键存在?
        {
          while(0xff !=( P2IN | 0xf8));   //一直等待按键松开
        }
      else
         key_value = 0x00;                //延时去抖动无键按下,则清除键变量.
      }
      //**************************************************************************
      //如果在按键电路中加RC滤波电路,实现按键去抖动的效果会更显著此.寻寻觅觅,冷冷清清,凄凄惨惨戚戚。此夜曲中闻折柳,何人不起故园情。
 
 
 

回复

13

帖子

0

TA的资源

一粒金砂(中级)

9
 
请看key_check函数
 
 
 

回复

13

帖子

0

TA的资源

一粒金砂(中级)

10
 
一个是清华的教科书,一个是网上下的,难道脑子都进水了,到底怎么回事
 
 
 

回复

13

帖子

0

TA的资源

一粒金砂(中级)

11
 
我终于想通了,再好的程序员也经常会脑子进水写错几个地方,不调试根本不知道
 
 
 

回复

75

帖子

4

TA的资源

纯净的硅(中级)

12
 
清华出版社出的烂书比好书多得多,只要出钱,再烂的书他们都敢出版
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表