搜索
bottom↓
回复: 16

AVR端口操作宏定义,方便修改,读起来也直观

[复制链接]

出0入0汤圆

发表于 2009-3-17 09:57:31 | 显示全部楼层 |阅读模式
#define BIT(x)                        (1 << (x))
#define GET_PORT(x, bit)                (PORT ## x)
#define GET_PIN( x, bit)                (PIN ## x)

#define PORT_OUT0(portx_bit)        ( GET_PORT(portx_bit) &= ~BIT(GET_BIT(portx_bit)) )
#define PORT_OUT1(portx_bit)        ( GET_PORT(portx_bit) |=  BIT(GET_BIT(portx_bit)) )
#define PORT_IN(portx_bit)          ( GET_PIN(portx_bit) & BIT(GET_BIT(portx_bit)) )
===================================
我自己写的,定义好这个后,只要再定义端口就好了,
比如
#define KEY1        A,2
#define LED_RED     A,3

if( PORT_IN(KEY1) )
{
    PORT_OUT1(LED_RED);
}

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

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

 楼主| 发表于 2009-3-17 11:22:02 | 显示全部楼层
这里没人用法和我一样吗
感觉这个贴好冷...

出0入0汤圆

发表于 2009-3-17 12:26:28 | 显示全部楼层
我觉得还可以象IAR一样定义位域,都是为了方便;

出0入0汤圆

发表于 2009-3-17 12:44:51 | 显示全部楼层
#ifndef __BITFIELD_H__
#define __BITFIELD_H__

#define GET_BITFIELD(addr)         (*((volatile bitfield *)(addr)))
#define __GET_BIT(addr,b)        GET_BITFIELD(addr).bit##b
#define GET_BIT(addr,b) __GET_BIT(addr,b)
#define GET_Bitfield(addr)         (*(( bitfield *)(addr)))
#define __GET_Bit(addr,b)       GET_Bitfield(addr).bit##b
#define GET_Bit(addr,b)       __GET_Bit(addr,b)
#define BIT_Alias(A,B)   GET_Bit(A,B)
#define BIT_ALIAS(A,B)   GET_BIT(A,B)


#define GET_BITFIELD8(addr)         (*((volatile bitfield8 *)(addr)))
#define __GET_BIT8(addr,b)        GET_BITFIELD8(addr).bit##b
#define GET_BIT8(addr,b) __GET_BIT8(addr,b)
#define GET_Bitfield8(addr)         (*(( bitfield8 *)(addr)))
#define __GET_Bit8(addr,b)       GET_Bitfield8(addr).bit##b
#define GET_Bit8(addr,b)       __GET_Bit8(addr,b)
#define BIT8_Alias(A,B)   GET_Bit8(A,B)
#define BIT8_ALIAS(A,B)   GET_BIT8(A,B)


#define GET_BITFIELD16(addr)         (*((volatile bitfield16 *)(addr)))
#define __GET_BIT16(addr,b)        GET_BITFIELD16(addr).bit##b
#define GET_BIT16(addr,b) __GET_BIT16(addr,b)
#define GET_Bitfield16(addr)         (*(( bitfield16 *)(addr)))
#define __GET_Bit16(addr,b)       GET_Bitfield16(addr).bit##b
#define GET_Bit16(addr,b)       __GET_Bit16(addr,b)
#define BIT16_Alias(A,B)   GET_Bit16(A,B)
#define BIT16_ALIAS(A,B)   GET_BIT16(A,B)

#define GET_BITFIELD32(addr)         (*((volatile bitfield32 *)(addr)))
#define __GET_BIT32(addr,b)        GET_BITFIELD32(addr).bit##b
#define GET_BIT32(addr,b) __GET_BIT32(addr,b)
#define GET_Bitfield32(addr)         (*(( bitfield32 *)(addr)))
#define __GET_Bit32(addr,b)       GET_Bitfield32(addr).bit##b
#define GET_Bit32(addr,b)       __GET_Bit32(addr,b)
#define BIT32_Alias(A,B)   GET_Bit32(A,B)
#define BIT32_ALIAS(A,B)   GET_BIT32(A,B)


#define IO_BIT_ALIAS(A,B)   GET_BIT(A,B)
#define IO_BIT8_ALIAS(A,B)  GET_BIT8(A,B)
#define IO_BIT16_ALIAS(A,B) GET_BIT16(A,B)
#define IO_BIT32_ALIAS(A,B) GET_BIT32(A,B)

#ifdef   __IAR_AVR__                    //IARAVR需要宏定义 __IAR_AVR__
#undef  GET_IO_BITFIELD
#undef  GET_IO_BIT
#undef  GET_IO_BITFIELD8
#undef  GET_IO_BIT8

#define GET_IO_BITFIELD(A)         (*(( __io volatile   bitfield  *)(A)))
#define GET_IO_BIT(A,B)            GET_IO_BITFIELD(A).bit##B
#define GET_IO_BITFIELD8(A)         (*(( __io volatile   bitfield8  *)(A)))
#define GET_IO_BIT8(A,B)            GET_IO_BITFIELD8(A).bit##B
#endif


typedef union
{
                         struct {
                                unsigned char bit0:1;
                                unsigned char bit1:1;
                                unsigned char bit2:1;
                                unsigned char bit3:1;        
                                unsigned char bit4:1;
                                unsigned char bit5:1;
                                unsigned char bit6:1;
                                unsigned char bit7:1;                                                               
                                };
                         unsigned char Byte;
}bitfield8;

#define bitfield bitfield8

typedef union{
              struct {
                                unsigned char bit0:1;
                                unsigned char bit1:1;
                                unsigned char bit2:1;
                                unsigned char bit3:1;        
                                unsigned char bit4:1;
                                unsigned char bit5:1;
                                unsigned char bit6:1;
                                unsigned char bit7:1;
                                unsigned char bit8:1;
                                unsigned char bit9:1;
                                unsigned char bit10:1;
                                unsigned char bit11:1;        
                                unsigned char bit12:1;
                                unsigned char bit13:1;
                                unsigned char bit14:1;
                                unsigned char bit15:1;                                                        
                                } ;
              unsigned short Word;
}bitfield16;

typedef     union{            
                   struct {
                                unsigned char bit0:1;
                                unsigned char bit1:1;
                                unsigned char bit2:1;
                                unsigned char bit3:1;        
                                unsigned char bit4:1;
                                unsigned char bit5:1;
                                unsigned char bit6:1;
                                unsigned char bit7:1;
                                unsigned char bit8:1;
                                unsigned char bit9:1;
                                unsigned char bit10:1;
                                unsigned char bit11:1;        
                                unsigned char bit12:1;
                                unsigned char bit13:1;
                                unsigned char bit14:1;
                                unsigned char bit15:1;
                                unsigned char bit16:1;
                                unsigned char bit17:1;
                                unsigned char bit18:1;
                                unsigned char bit19:1;        
                                unsigned char bit20:1;
                                unsigned char bit21:1;
                                unsigned char bit22:1;
                                unsigned char bit23:1;
                                unsigned char bit24:1;
                                unsigned char bit25:1;
                                unsigned char bit26:1;
                                unsigned char bit27:1;        
                                unsigned char bit28:1;
                                unsigned char bit29:1;
                                unsigned char bit30:1;
                                unsigned char bit31:1;
                   };
           unsigned long Dword;        
        
} bitfield32;

#endif


IAR AVR:
#define __IAR_AVR__   
#include "bitfield.h"
#define LED     IO_BIT_ALIAS(&PORTA,0)   
LED =0;
LED =1;

GCC AVR:
#include "bitfield.h"
#define LED     IO_BIT_ALIAS(&PORTA,0)   
LED =0;
LED =1;

其他如IAR ARM,IAR MSP430都可使用。

出0入0汤圆

发表于 2009-3-17 12:44:52 | 显示全部楼层
重复了。

出0入0汤圆

发表于 2009-3-17 12:59:00 | 显示全部楼层
这用法用的比较少,学校也没教,不过确实是比较不错,呵呵~~~

话说,avrgcc的目录下面的例子就有,可以参考
D:\WinAVR-20071221\doc\avr-libc\examples\stdiodemo\hd44780.c

出0入0汤圆

 楼主| 发表于 2009-3-17 14:36:28 | 显示全部楼层
icc avr中定义成位有很大不足,编译器不好-_-

我用ST7时就是定义成位操作的....
而且是结构体式,用起来很明了,谁一看都知道是个端口
使用时比如先用enum定义好DIR_UP 和DIR_DOWN就可以用
PIN.BackDIR = DIR_UP;
很明了,谁都知道是操作端口,
可是ICC AVR中这样定义的话,编译器不会当做IO进行直接位操作...

===================================

//---------- 端口 ----------//
#define        IO(io)                u8        io:1;
#define        NC

#define        IO_PORTA        \
/*PA0*/        IO(RemoteR)        /* 遥控信号-编码接收 */        \
/*PA1*/        IO(NC)                /*                                          */        \
/*PA2*/        IO(MotorPWM)        /* 推杆电机-升降调速 */        \
/*PA3*/        IO(WalkPWM)        /* 行走电机-升降调速 */        \
/*PA4*/        IO(KneadPWM)        /* 按摩电机-揉捏调速 */        \
/*PA5*/        IO(KnockPWM)        /* 按摩电机-捶打调速 */        \
/*PA6*/        IO(NC)                /* I2C DATA         */        \
/*PA7*/        IO(NC)                /* I2C CLK         */       

#define        IO_PORTB        \
/*PB0*/        IO(ReadWidth)        /* 按摩机构-读取宽度 */        \
/*PB1*/        IO(ReadHeight)        /* 按摩机构-肩部高度 */        \
/*PB2*/        IO(ShockBack)        /* 震动电机-背部启停 */        \
/*PB3*/        IO(ShockSeat)        /* 震动电机-座部启停 */        \
/*PB4*/        IO(BackDIR)        /* 推杆电机-椅背方向 */        \
/*PB5*/        IO(BackON)        /* 推杆电机-椅背启停 */        \
/*PB6*/        IO(SeatON)        /* 推杆电机-支座启停 */        \
/*PB7*/        IO(WalkCount)        /* 行走机构-转圈计数 */


#define        IO_PORTC        \
/*PC0*/        IO(SeatDIR)        /* 推杆电机-支座方向 */        \
/*PC1*/        IO(Buzzer)        /* 遥控信号-编码发送 */        \
/*PC2*/        IO(NC)                /* 下载接口-ICC_DATA */        \
/*PC3*/        IO(NC)                /* 下载接口-ICC_CLK  */        \
/*PC4*/        IO(WalkCheck)        /* 行走机构-位置检测 */        \
/*PC5*/        IO(WalkDIR)        /* 行走电机-升降方向 */        \
/*PC6*/        IO(KnockDIR)        /* 按摩电机-捶打方向 */        \
/*PC7*/        IO(KneadDIR)        /* 按摩电机-揉捏方向 */


//---------- 输出 ----------//
typedef        struct
{
        IO_PORTA        //        PortRA
        IO_PORTB        //        PortRB
#ifdef        IO_PORTC
        IO_PORTC        //        PortRC
#endif
} OUT_MAPPING;

extern        OUT_MAPPING                OUT;

#define        OUT_PORTA                ( PTR_BYTE(OUT)[0] )
#define        OUT_PORTB                ( PTR_BYTE(OUT)[1] )
#ifdef        IO_PORTC
#define        OUT_PORTC                ( PTR_BYTE(OUT)[2] )
#endif
//---------- 输入 ----------//
struct
{
        IO_PORTA        //        PADR
        u8        :8;
        u8        :8;
        IO_PORTB        //        PBDR
#ifdef        IO_PORTC
        u8        :8;
        u8        :8;
        IO_PORTC        //        PCDR
#endif
} PIN        @PADR;

struct
{
        IO_PORTA        //        PADR
} PINA        @PADR;

struct
{
        IO_PORTB        //        PBDR
} PINB        @PBDR;

#ifdef        IO_PORTC
struct
{
        IO_PORTC        //        PBDR
} PINC        @PCDR;
#endif
//---------- 方向 ----------//
struct
{
        IO_PORTA        //        PADDR
        u8        :8;
        u8        :8;
        IO_PORTB        //        PBDDR
#ifdef        IO_PORTC
        u8        :8;
        u8        :8;
        IO_PORTC        //        PCDDR
#endif
} DDR        @PADDR;

struct
{
        IO_PORTA        //        PADDR
} DDRA        @PADDR;

struct
{
        IO_PORTB        //        PBDDR
} DDRB        @PBDDR;

#ifdef        IO_PORTC
struct
{
        IO_PORTC        //        PCDDR
} DDRC        @PCDDR;
#endif
//---------- 上拉 ----------//
struct
{
        IO_PORTA        //        PAOR
        u8        :8;
        u8        :8;
        IO_PORTB        //        PBOR
#ifdef        IO_PORTC
        u8        :8;
        u8        :8;
        IO_PORTC        //        PCOR
#endif
} POR        @PAOR;

struct
{
        IO_PORTA        //        PAOR
} PORA        @PAOR;

struct
{
        IO_PORTB        //        PBOR
} PORB        @PBOR;

#ifdef        IO_PORTC
struct
{
        IO_PORTC        //        PCOR
} PORC        @PCOR;
#endif

出0入0汤圆

发表于 2009-6-12 12:02:10 | 显示全部楼层
标记,学习

出0入0汤圆

发表于 2012-2-10 23:16:55 | 显示全部楼层
mark!

出0入0汤圆

发表于 2012-2-13 18:34:26 | 显示全部楼层
标记,Mark

出0入0汤圆

发表于 2012-2-16 17:16:46 | 显示全部楼层
宏定义很重要,可以养成好习惯啊~~~

出0入0汤圆

发表于 2012-6-15 22:39:48 来自手机 | 显示全部楼层
还得补习呀

出0入0汤圆

发表于 2014-6-13 08:58:13 | 显示全部楼层
不错,很有用。

出0入0汤圆

发表于 2014-6-17 08:49:41 | 显示全部楼层
经典。顶一个。

出0入0汤圆

发表于 2014-8-11 10:27:43 | 显示全部楼层
就这几种常用的方法,看情况用了

出0入0汤圆

发表于 2014-8-15 14:58:08 | 显示全部楼层
标记,学习

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-10-3 09:17

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

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