搜索
bottom↓
回复: 7

有关IAR for 430 的 位运算 技巧

[复制链接]

出0入0汤圆

发表于 2014-7-30 13:04:03 | 显示全部楼层 |阅读模式
本帖最后由 yiyamala 于 2014-7-30 15:51 编辑

众所周知,IAR for 430 已经不再支持bit型,bit型已经被bool型取代,但是bool型却占用了8个位!!!

熟悉KEIL C51的朋友都知道,sbit 可以用来定义字节中的某一位,然后可以对该位进行置1、置0、取反操作,还能直接写进 if 条件判断语句当中,非常方便。
举个例子:
sbit LDE = P1^0; //定义51单片机的P10口接了一个LED

LED = 0; //这个位置0,点亮LED
LED = 1; //这个位置1,熄灭LED
LED=!LED; (或者LED=~LED,反正是1位,取非和取反效果一样)
if(LED==0) //如果LDE被点亮
{
//用户代码
}

但是IAR中不支持未定义,IAR中的位访问是通过位段的形式来实现的。
大家可以这么来写。
#define SET_1(a,b) a=(a|(1<<b))  //a字节的第b位置1
#define SET_0(a,b) a=(a&~(1<<b)) //a字节的第b位置0
#define SET_COM(a,b) a=(a^(1<<b))//a字节的第b位置取反
#define GET(a,b)   (a&(1<<b))    //获取a字节的b位置
举个例子:
SET_0(P3SEL,4);//P34口为普通IO口用
SET_1(P3DIR,4);//P34口为输出口,默认输出高电平
SET_0(P1SEL,0);//P10口为普通IO口用
SET_0(P1DIR,0);//P10口为输入口

SET_0(P3OUT,4);//P34输出低电平,LED1点亮
if(GET(P1IN,0)==0)//如果K0被按下
{
      delay_ms(5);//延时去抖
      if(GET(P1IN,0)==0)//真的被按下了
      {
        while(!GET(P1IN,0));
        //用户代码区
        SET_COM(P3OUT,4);//LED1取反
      }
}

这样就简化了430单片机编程时,位运算的复杂度。

阿莫论坛20周年了!感谢大家的支持与爱护!!

阿莫论坛才是最爱国的,关心国家的经济、社会的发展、担心国家被别国牵连卷入战争、知道珍惜来之不易的和平发展,知道师夷之长,关注世界的先进文化与技术,也探讨中国文化的博大精深,也懂得警惕民粹主义的祸国殃民等等等等,无不是爱国忧民的表现。(坛友:tianxian)

出0入0汤圆

发表于 2014-7-30 13:44:18 | 显示全部楼层
楼主的做法不错。不过现在位运算用的少了,毕竟内存比51宽裕了。

出0入0汤圆

发表于 2014-7-30 14:13:54 | 显示全部楼层
学习了,谢谢分享!

出0入0汤圆

发表于 2014-7-30 14:26:34 | 显示全部楼层
......bool型却占用了8个字节!!!
地大物博么?呵呵呵

出0入0汤圆

 楼主| 发表于 2014-7-30 15:52:00 | 显示全部楼层
BroadWay-Elec. 发表于 2014-7-30 14:26
......bool型却占用了8个字节!!!
地大物博么?呵呵呵

笔下误,应该是1个字节,8个位

出30入54汤圆

发表于 2014-8-8 22:24:17 | 显示全部楼层
其实你在引用“io430.h”这个头文件后再编译就会发现有更好的方法,就是用联合和结构体来定义单独的位:
__no_init volatile union
{
  unsigned __READ short PAIN;   /* Port A Input */

  struct
  {
    unsigned __READ short PAIN0           : 1; /*  */
    unsigned __READ short PAIN1           : 1; /*  */
    unsigned __READ short PAIN2           : 1; /*  */
    unsigned __READ short PAIN3           : 1; /*  */
    unsigned __READ short PAIN4           : 1; /*  */
    unsigned __READ short PAIN5           : 1; /*  */
    unsigned __READ short PAIN6           : 1; /*  */
    unsigned __READ short PAIN7           : 1; /*  */
    unsigned __READ short PAIN8           : 1; /*  */
    unsigned __READ short PAIN9           : 1; /*  */
    unsigned __READ short PAIN10          : 1; /*  */
    unsigned __READ short PAIN11          : 1; /*  */
    unsigned __READ short PAIN12          : 1; /*  */
    unsigned __READ short PAIN13          : 1; /*  */
    unsigned __READ short PAIN14          : 1; /*  */
    unsigned __READ short PAIN15          : 1; /*  */
  } PAIN_bit;

  struct
  {
    unsigned __READ char PAIN_L;
    unsigned __READ char PAIN_H;
  };
  struct
  {
    unsigned char P1IN;   /* Port 1 Input */
    unsigned char P2IN;   /* Port 2 Input */
  };
  struct
  {
    struct
    {
      unsigned char P1IN0           : 1; /*  */
      unsigned char P1IN1           : 1; /*  */
      unsigned char P1IN2           : 1; /*  */
      unsigned char P1IN3           : 1; /*  */
      unsigned char P1IN4           : 1; /*  */
      unsigned char P1IN5           : 1; /*  */
      unsigned char P1IN6           : 1; /*  */
      unsigned char P1IN7           : 1; /*  */
    } P1IN_bit;

    struct
    {
      unsigned char P2IN0           : 1; /*  */
      unsigned char P2IN1           : 1; /*  */
      unsigned char P2IN2           : 1; /*  */
      unsigned char P2IN3           : 1; /*  */
      unsigned char P2IN4           : 1; /*  */
      unsigned char P2IN5           : 1; /*  */
      unsigned char P2IN6           : 1; /*  */
      unsigned char P2IN7           : 1; /*  */
    } P2IN_bit;
  };
} @0x0200;
上面的代码来自5438的头文件。这样访问P2.1的输入可以这样写x = P2IN_bit.P2IN1;  非常方便

当然啦,如果你看它的汇编形式就会发现这句话和用移位运算的结果是同一条汇编语句,所以在单片机处理上是没有区别的只不过让编程方便了些。

出0入0汤圆

发表于 2014-11-10 21:21:52 | 显示全部楼层
谢谢,很有参考价值

出0入0汤圆

发表于 2014-11-18 10:26:01 | 显示全部楼层
学些了,谢谢楼主
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-16 20:40

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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