搜索
bottom↓
回复: 27

ICC AVR 位操作可这样定义

[复制链接]

出0入104汤圆

发表于 2004-11-26 11:51:45 | 显示全部楼层 |阅读模式
#include <iom8v.h> //和单片机类型相对应的头文件,选择Atmega8做实验;

#include <macros.h>



//定义BIT 0-7 置1

#define                BIT0_POS        (1<<0)  

#define                BIT1_POS        (1<<1)

#define                BIT2_POS        (1<<2)

#define                BIT3_POS        (1<<3)

#define                BIT4_POS        (1<<4)

#define                BIT5_POS        (1<<5)

#define                BIT6_POS        (1<<6)

#define                BIT7_POS        (1<<7)



//定义BIT 0-7 清零

#define                BIT0_NEG        ((unsigned char)(~(1<<0)))

#define                BIT1_NEG        ((unsigned char)(~(1<<1)))

#define                BIT2_NEG        ((unsigned char)(~(1<<2)))

#define                BIT3_NEG        ((unsigned char)(~(1<<3)))

#define                BIT4_NEG        ((unsigned char)(~(1<<4)))

#define                BIT5_NEG        ((unsigned char)(~(1<<5)))

#define                BIT6_NEG        ((unsigned char)(~(1<<6)))

#define                BIT7_NEG        ((unsigned char)(~(1<<7)))



//定义红色LED熄灭、亮、翻转

#define                LED_red_OFF        PORTB&=BIT0_NEG

#define                LED_red_ON          PORTB|=BIT0_POS  

#define                LED_red_OTN        PORTB^=BIT0_POS



//定义绿色LED熄灭、亮、翻转

#define                LED_green_OFF        PORTB&=BIT1_NEG

#define                LED_green_ON        PORTB|=BIT1_POS

#define                LED_green_OTN        PORTB^=BIT1_POS



void delay_1ms(void); //函数声明,本实验中会用到这两个函数

void delay_nms(unsigned int n);

void main(void) //主函数

{

  OSCCAL=0X9E;//系统时钟校准,不同的芯片和不同的频率,

  DDRB=0B00000011; //定义B口的PB0、PB1为输出口

  LED_red_ON;      //红色LED亮

  LED_green_OFF;   //绿色LED熄灭

  

  delay_nms(5000); //延时5秒

  LED_red_OFF;     //红色LED熄灭     

  LED_green_ON;    //绿色LED亮



  delay_nms(5000); //延时5秒

  while(1) //程序一直执行该循环

  {

   LED_red_OTN;    //红色LED翻转

   LED_green_OTN;  //绿色LED翻转

   delay_nms(2000);

  }

}

void delay_1ms(void)//1ms延时函数

{

  unsigned int i;

  for (i=0;i<150;i++)

  {

  }

}

void delay_nms(unsigned int n)//延时n毫秒

{

  unsigned int i;

  for (i=0;i<n;i++)//执行n次1毫秒延时

  delay_1ms();

}

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

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2004-11-26 13:03:20 | 显示全部楼层
进行位操作时的简便方法是在应用程序中声明以下预定义:

#define SETBIT(x,y) ( x |= ( 1 << y ) )      //Set Bit y of Byte x

#define CLRBIT(x,y) ( x &= ( ~ ( 1 << y ) )  //Clear Bit y of Byte x

#define CHKBIT(x,y) ( x & ( 1 << y ) )       //Check Bit y of Byte x

#define INVBIT(x,y) ( x ^= ( 1 << y ) )      //Invert Bit y of Byte x

出0入0汤圆

发表于 2004-11-26 18:28:54 | 显示全部楼层
谢谢共享经验

出0入0汤圆

发表于 2004-12-2 14:20:56 | 显示全部楼层
解决了我的难题。谢谢各位!

出0入0汤圆

发表于 2004-12-3 15:49:52 | 显示全部楼层
ICCAVR编译器自己定义了这些宏阿,为什么还要自己定义阿???不懂.....

出0入0汤圆

发表于 2004-12-4 15:36:03 | 显示全部楼层
我的方法是定义位域,如:

struct

{unsigned i1:1,i2:1,i3:1}

如果要整体使用可以定义共用体

union

{struct{i1:1,i2:1,i3:1}bit;

unsigned char byte}

我随手写写.

出0入0汤圆

发表于 2005-1-12 12:06:27 | 显示全部楼层
各位:何必这么麻烦,按以下方法即可

typedef         struct _BITS

{

  unsigned  a                      : 1;

  unsigned  b                   : 1;

  unsigned  c                     : 1;

} bits;

出0入0汤圆

发表于 2005-1-12 16:08:15 | 显示全部楼层
“ICCAVR编译器自己定义了这些宏阿,为什么还要自己定义阿???不懂”

    是那些宏啊??

出0入0汤圆

发表于 2005-1-12 16:20:50 | 显示全部楼层
很直观,但不必要,已经有了却重复劳动。

to :

   ffzlf

   也很直观,但浪费空间,结构型变量里的变量至少是字节变量不是位变量。

出0入0汤圆

发表于 2010-4-19 09:32:59 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-19 23:04:52 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-17 15:02:31 | 显示全部楼层
定义的位变量,用模拟仿真看不到结果,结果的内容是 “Not in scope” ,为何用struct或type定义的位,模拟仿真看不到实际的结果?????

出0入0汤圆

发表于 2010-7-17 17:19:57 | 显示全部楼层
学习下!!

出0入0汤圆

发表于 2010-7-17 23:56:59 | 显示全部楼层
mark~

出0入0汤圆

发表于 2010-7-18 17:58:14 | 显示全部楼层
象keil一样有sbit关键字就好了,
sbit p1.0=P1^0;
p1.0=0;
p1.0=1;
!p1.00;

出0入0汤圆

发表于 2012-3-29 13:39:51 | 显示全部楼层
#include <iom16v.h>
#include <macros.h>
#define  RED_LED            PB0
#define  SET_RED_LED      PORTA|=BIT(PB0)//置位
#define  CLR_RED_LED       PORTA&=~BIT(PB0)//清0
这样比较简单

出0入0汤圆

发表于 2012-3-30 11:05:29 | 显示全部楼层
还没搞懂!!!

出0入0汤圆

发表于 2012-5-16 19:57:17 | 显示全部楼层
懂了

出0入0汤圆

发表于 2012-5-17 23:45:08 | 显示全部楼层
学习了

出0入0汤圆

发表于 2012-5-18 00:42:13 | 显示全部楼层
  1. #define SETBIT(x,y) ( x |= ( 1 << y ) )      //Set Bit y of Byte x
复制代码
almost there:
  1. #define SETBIT(x,y) ( x |= ( 1 << (y) ) )      //Set Bit y of Byte x
复制代码
just a good habit.

出0入0汤圆

发表于 2013-4-28 13:12:58 | 显示全部楼层
fatboy 发表于 2004-11-26 13:03
进行位操作时的简便方法是在应用程序中声明以下预定义:

#define SETBIT(x,y) ( x |= ( 1  ...

is very good code/ thanks

出0入0汤圆

发表于 2013-4-28 17:43:26 | 显示全部楼层
Mark!又学习了

出0入0汤圆

发表于 2013-4-28 21:30:13 | 显示全部楼层
fatboy 发表于 2004-11-26 13:03
进行位操作时的简便方法是在应用程序中声明以下预定义:

#define SETBIT(x,y) ( x |= ( 1  ...

不错,学习学习

出0入0汤圆

发表于 2013-4-28 23:21:23 | 显示全部楼层
不错,学习了。很好的封装啊

出0入0汤圆

发表于 2013-7-30 18:41:58 | 显示全部楼层
millwood0 发表于 2012-5-18 00:42
almost there:just a good habit.

#define CHKBIT(x,y) ( x & ( 1 << y ) )       //Check Bit y of Byte x
这样对吗?我在书上看的读取某个端口的电平是读 PINX的电平。CHKBIT(PORTA,3)可以吗?

出0入0汤圆

发表于 2013-8-6 14:22:03 | 显示全部楼层
本帖最后由 naiqiqnus 于 2013-8-6 14:24 编辑

我是这样操作的

#define sBit(x)                 _BV(x)                                        // (1<<x)                                                               
#define sADD(x,y)                 x  ##   y                           // 字符串合并                                                       
#define Ddr1(x,y)                 sADD(DDR,x)|=sBit(y)        // DDRx|=(1<<y);                                               
#define Ddr0(x,y)                 sADD(DDR,x)&=~sBit(y)        // DDRx&=~(1<<y);                                               
#define Port1(x,y)                 sADD(PORT,x)|=sBit(y)        // PORTx|=(1<<y);                                               
#define Port0(x,y)                 sADD(PORT,x)&=~sBit(y)        // PORTx&=~(1<<y);                                               
#define PortFlash(x,y)        sADD(PORT,x)^=sBit(y)        // PORTx^=(1<<y);                                                                       
#define DdrFlash(x,y)        sADD(DDR,x)^=sBit(y)        // PORTx^=(1<<y);                                                                       
#define PinBit1(x,y)        (sADD(PIN,x)&sBit(y))        // (PINx&(1<<y)) 两字节占用                                               
#define PinBit0(x,y)        (!PinBit1(x,y))                        //                                                                                                                                                                                                                                                                                        
// 这个不常用吧                                                                                                                                                                               
#define PinPort1(x,y)        ((sADD(PIN,x)&y)==y)        // PINx & y == y   
#define PinPort0(x,y)        ((sADD(PIN,x)&y)!=y)                                       

示例:

//端口设置
// SetA
#define SetAport         B
#define SetAnum                4
// SetB
#define SetBport         B
#define SetBnum                0
// AUX 状态返回
#define AUXport         B
#define AUXnum                2

#define TxMode();                         { Port0(SetAport,SetAnum);Port0(SetBport,SetBnum); }                // 正常模式
#define UtcMode1();                 { Port0(SetAport,SetAnum);Port0(SetBport,SetBnum); }                // 正常模式
#define UtcMode2();                 { Port0(SetAport,SetAnum);Port1(SetBport,SetBnum); }                // 主动唤醒,呼叫模式
#define UtcMode3();                 { Port1(SetAport,SetAnum);Port0(SetBport,SetBnum); }                // 省电,被动唤醒模式
#define UtcMode4();                 { Port1(SetAport,SetAnum);Port1(SetBport,SetBnum); }                // 配置状态
#define SleepMode();                 { Port1(SetAport,SetAnum);Port1(SetBport,SetBnum); }                // 配置状态
#define ReveOver();                 {while(PinBit0(AUXport,AUXnum));} //发送接收时为低电平
#define TROver();                         {while(PinBit0(AUXport,AUXnum));}
#define WaitForOver(x);         {_delay_ms(x); while(PinBit0(AUXport,AUXnum));}

出0入0汤圆

发表于 2013-8-6 14:45:20 | 显示全部楼层
对宏的使用才刚刚开始,理解起来比较慢
只能看到别人怎么写的,就拿过来用,还不理解是怎么回事的。

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-8-26 18:20

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

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