搜索
bottom↓
回复: 4

在网上看了这样对AVR实现位定义,不知道是否可行?

[复制链接]

出0入0汤圆

发表于 2013-7-30 20:57:58 | 显示全部楼层 |阅读模式
#ifndef __MEGA48IOBIT_H__
#define __MEGA48IOBIT_H__
typedef struct _bit_field
{
unsigned bit0:1;
unsigned bit1:1;
unsigned bit2:1;
unsigned bit3:1;
unsigned bit4:1;
unsigned bit5:1;
unsigned bit6:1;
unsigned bit7:1;
}bit_field;
#define _PIND   0x29
#define PIND00   (*(volatile bit_field*)(_PIND)).bit0
#define PIND01   (*(volatile bit_field*)(_PIND)).bit1
#define PIND02   (*(volatile bit_field*)(_PIND)).bit2
#define PIND03   (*(volatile bit_field*)(_PIND)).bit3
#define PIND04   (*(volatile bit_field*)(_PIND)).bit4
#define PIND05   (*(volatile bit_field*)(_PIND)).bit5
#define PIND06   (*(volatile bit_field*)(_PIND)).bit6
#define PIND07   (*(volatile bit_field*)(_PIND)).bit7
#define _DDRD   0x2A
#define DDRD00   (*(volatile bit_field*)(_DDRD)).bit0
#define DDRD01   (*(volatile bit_field*)(_DDRD)).bit1
#define DDRD02   (*(volatile bit_field*)(_DDRD)).bit2
#define DDRD03   (*(volatile bit_field*)(_DDRD)).bit3
#define DDRD04   (*(volatile bit_field*)(_DDRD)).bit4
#define DDRD05   (*(volatile bit_field*)(_DDRD)).bit5
#define DDRD06   (*(volatile bit_field*)(_DDRD)).bit6
#define DDRD07   (*(volatile bit_field*)(_DDRD)).bit7
#define _PORTD  0x2B
#define PORTD00  (*(volatile bit_field*)(_PORTD)).bit0
#define PORTD01  (*(volatile bit_field*)(_PORTD)).bit1
#define PORTD02  (*(volatile bit_field*)(_PORTD)).bit2
#define PORTD03  (*(volatile bit_field*)(_PORTD)).bit3
#define PORTD04  (*(volatile bit_field*)(_PORTD)).bit4
#define PORTD05  (*(volatile bit_field*)(_PORTD)).bit5
#define PORTD06  (*(volatile bit_field*)(_PORTD)).bit6
#define PORTD07  (*(volatile bit_field*)(_PORTD)).bit7
#define _PINC   0x26
#define PINC00   (*(volatile bit_field*)(_PINC)).bit0
#define PINC01   (*(volatile bit_field*)(_PINC)).bit1
#define PINC02   (*(volatile bit_field*)(_PINC)).bit2
#define PINC03   (*(volatile bit_field*)(_PINC)).bit3
#define PINC04   (*(volatile bit_field*)(_PINC)).bit4
#define PINC05   (*(volatile bit_field*)(_PINC)).bit5
#define PINC06   (*(volatile bit_field*)(_PINC)).bit6
#define PINC07   (*(volatile bit_field*)(_PINC)).bit7
#define _DDRC   0x27
#define DDRC00   (*(volatile bit_field*)(_DDRC)).bit0
#define DDRC01   (*(volatile bit_field*)(_DDRC)).bit1
#define DDRC02   (*(volatile bit_field*)(_DDRC)).bit2
#define DDRC03   (*(volatile bit_field*)(_DDRC)).bit3
#define DDRC04   (*(volatile bit_field*)(_DDRC)).bit4
#define DDRC05   (*(volatile bit_field*)(_DDRC)).bit5
#define DDRC06   (*(volatile bit_field*)(_DDRC)).bit6
#define DDRC07   (*(volatile bit_field*)(_DDRC)).bit7
#define _PORTC  0x28
#define PORTC00  (*(volatile bit_field*)(_PORTC)).bit0
#define PORTC01  (*(volatile bit_field*)(_PORTC)).bit1
#define PORTC02  (*(volatile bit_field*)(_PORTC)).bit2
#define PORTC03  (*(volatile bit_field*)(_PORTC)).bit3
#define PORTC04  (*(volatile bit_field*)(_PORTC)).bit4
#define PORTC05  (*(volatile bit_field*)(_PORTC)).bit5
#define PORTC06  (*(volatile bit_field*)(_PORTC)).bit6
#define PORTC07  (*(volatile bit_field*)(_PORTC)).bit7
#define _PINB   0x23
#define PINB00   (*(volatile bit_field*)(_PINB)).bit0
#define PINB01   (*(volatile bit_field*)(_PINB)).bit1
#define PINB02   (*(volatile bit_field*)(_PINB)).bit2
#define PINB03   (*(volatile bit_field*)(_PINB)).bit3
#define PINB04   (*(volatile bit_field*)(_PINB)).bit4
#define PINB05   (*(volatile bit_field*)(_PINB)).bit5
#define PINB06   (*(volatile bit_field*)(_PINB)).bit6
#define PINB07   (*(volatile bit_field*)(_PINB)).bit7
#define _DDRB   0x24
#define DDRB00   (*(volatile bit_field*)(_DDRB)).bit0
#define DDRB01   (*(volatile bit_field*)(_DDRB)).bit1
#define DDRB02   (*(volatile bit_field*)(_DDRB)).bit2
#define DDRB03   (*(volatile bit_field*)(_DDRB)).bit3
#define DDRB04   (*(volatile bit_field*)(_DDRB)).bit4
#define DDRB05   (*(volatile bit_field*)(_DDRB)).bit5
#define DDRB06   (*(volatile bit_field*)(_DDRB)).bit6
#define DDRB07   (*(volatile bit_field*)(_DDRB)).bit7
#define _PORTB  0x25
#define PORTB00  (*(volatile bit_field*)(_PORTB)).bit0
#define PORTB01  (*(volatile bit_field*)(_PORTB)).bit1
#define PORTB02  (*(volatile bit_field*)(_PORTB)).bit2
#define PORTB03  (*(volatile bit_field*)(_PORTB)).bit3
#define PORTB04  (*(volatile bit_field*)(_PORTB)).bit4
#define PORTB05  (*(volatile bit_field*)(_PORTB)).bit5
#define PORTB06  (*(volatile bit_field*)(_PORTB)).bit6
#define PORTB07  (*(volatile bit_field*)(_PORTB)).bit7

#endif

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2013-7-30 21:54:27 | 显示全部楼层
可以的                                                                                                                       

出0入0汤圆

 楼主| 发表于 2013-7-30 22:20:46 | 显示全部楼层
renpeng009 发表于 2013-7-30 21:54
可以的                                                                                               ...

#ifndef __BITWISE_H
#define __BITWISE_H
#ifdef __cplusplus
extern "C" {
#endif
#define _BITFIELD_(_W)        \
    typedef union {           \
        struct {              \
            uint8_t used :_W; \
        };                    \
        uint8_t dummy;        \
    } _bit_0_ ## _W ## _t
#define _BITFIELD1_(_S, _W)   \
    typedef union {           \
        struct {              \
            uint8_t :_S;      \
            uint8_t used :_W; \
        };                    \
        uint8_t dummy;        \
    } _bit_ ## _S ## _ ## _W ## _t
_BITFIELD_(1);
_BITFIELD_(2);
_BITFIELD_(3);
_BITFIELD_(4);
_BITFIELD_(5);
_BITFIELD_(6);
_BITFIELD_(7);
_BITFIELD_(8);
_BITFIELD1_(1, 1);
_BITFIELD1_(1, 2);
_BITFIELD1_(1, 3);
_BITFIELD1_(1, 4);
_BITFIELD1_(1, 5);
_BITFIELD1_(1, 6);
_BITFIELD1_(1, 7);
_BITFIELD1_(2, 1);
_BITFIELD1_(2, 2);
_BITFIELD1_(2, 3);
_BITFIELD1_(2, 4);
_BITFIELD1_(2, 5);
_BITFIELD1_(2, 6);
_BITFIELD1_(3, 1);
_BITFIELD1_(3, 2);
_BITFIELD1_(3, 3);
_BITFIELD1_(3, 4);
_BITFIELD1_(3, 5);
_BITFIELD1_(4, 1);
_BITFIELD1_(4, 2);
_BITFIELD1_(4, 3);
_BITFIELD1_(4, 4);
_BITFIELD1_(5, 1);
_BITFIELD1_(5, 2);
_BITFIELD1_(5, 3);
_BITFIELD1_(6, 1);
_BITFIELD1_(6, 2);
_BITFIELD1_(7, 1);
#define SFR(_P, _S, _W) (*(_bit_ ## _S ## _ ## _W ## _t volatile*)(_SFR_ADDR(_P))).used
#ifdef __cplusplus
}
#endif
#endif

#define LED SFR(PORTB, 0, 1)

展开之后是这样:
(*(_bit_0_1_t volatile*)(((uint16_t) &((*(volatile uint8_t *)((0x18) + 0x20)))))).used

这种好复杂啊,看的不是很明白,能解释一下吗?

出0入0汤圆

发表于 2013-7-30 22:45:38 | 显示全部楼层
又不是原子操作 何必搞得这么复杂

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-7-24 01:26

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

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