这是网上的一个介绍,好像是ATmega 8的
/定义新的数据类型,方便进行IO端口操作。
#ifndef _bit_h
#define _bit_h
typedef struct //定义一个8字节的位段 bit0~7是每个位段名称 1代表一位 PBIT就是整个位段的名称
{
unsigned bit0 : 1 ;
unsigned bit1 : 1 ;
unsigned bit2 : 1 ;
unsigned bit3 : 1 ;
unsigned bit4 : 1 ;
unsigned bit5 : 1 ;
unsigned bit6 : 1 ;
unsigned bit7 : 1 ;
}PBIT;
#define PORTABIT (*(volatile PBIAVR口宏定义_文档下载http://www.wendangxiazai.com/b-0382d31aa76e58fafab0037b.htmlT *)0x3B)
/*0x3B是PORTA的地址 (volatile PBIT *)0x3B 就是将这个地址强制类型装换为我们前面定义过的位段
volatile关键字还不懂的话去查点资料~~前面加个*号 不用我说也知道什么意思吧*/
#define DDRABIT (*(volatile PBIT *)0x3A)
#define PINABIT (*(volatile PBIT *)0x39)
#define PORTBBIT (*(volatile PBIT *)0x38)
#define DDRBBIT (*(volatile PBIT *)0x37)
#define PINBBIT (*(volatile PBIT *)0x36)
下面这个是师兄的定义,ATMEGA 168
typedef struct
{
uint8_t bit0:1;
uint8_t bit1:1;
uint8_t bit2:1;
uint8_t bit3:1;
uint8_t bit4:1;
uint8_t bit5:1;
uint8_t bit6:1;
uint8_t bit7:1;
}
PBIT;
#define PORTBBIT (*(volatile PBIT *)0x25)
#defineRed_ledPORTBBIT.bit7
#defineGreen_ledPORTBBIT.bit6
#defineRS485_DIRPORTBBIT.bit1
#defineweg_data0PORTBBIT.bit0
#define PORTCBIT (*(volatile PBIT *)0x28)
#defineSpeakerPORTCBIT.bit0
#defineMOSI_1702PORTCBIT.bit3
#defineNSS_1702PORTCBIT.bit4
#defineSCK_1702PORTCBIT.bit5
#defineweg_data1PORTCBIT.bit1
但是AVR官方内部是这么定义的
#define PORTB _SFR_IO8(0x05)
#define PORTB7 7
#define PORTB6 6
#define PORTB5 5
#define PORTB4 4
#define PORTB3 3
#define PORTB2 2
#define PORTB1 1
#define PORTB0 0
求解师兄定义中PORTB的地址是怎么得到的
/定义新的数据类型,方便进行IO端口操作。
#ifndef _bit_h
#define _bit_h
typedef struct //定义一个8字节的位段 bit0~7是每个位段名称 1代表一位 PBIT就是整个位段的名称
{
unsigned bit0 : 1 ;
unsigned bit1 : 1 ;
unsigned bit2 : 1 ;
unsigned bit3 : 1 ;
unsigned bit4 : 1 ;
unsigned bit5 : 1 ;
unsigned bit6 : 1 ;
unsigned bit7 : 1 ;
}PBIT;
#define PORTABIT (*(volatile PBIAVR口宏定义_文档下载http://www.wendangxiazai.com/b-0382d31aa76e58fafab0037b.htmlT *)0x3B)
/*0x3B是PORTA的地址 (volatile PBIT *)0x3B 就是将这个地址强制类型装换为我们前面定义过的位段
volatile关键字还不懂的话去查点资料~~前面加个*号 不用我说也知道什么意思吧*/
#define DDRABIT (*(volatile PBIT *)0x3A)
#define PINABIT (*(volatile PBIT *)0x39)
#define PORTBBIT (*(volatile PBIT *)0x38)
#define DDRBBIT (*(volatile PBIT *)0x37)
#define PINBBIT (*(volatile PBIT *)0x36)
下面这个是师兄的定义,ATMEGA 168
typedef struct
{
uint8_t bit0:1;
uint8_t bit1:1;
uint8_t bit2:1;
uint8_t bit3:1;
uint8_t bit4:1;
uint8_t bit5:1;
uint8_t bit6:1;
uint8_t bit7:1;
}
PBIT;
#define PORTBBIT (*(volatile PBIT *)0x25)
#defineRed_ledPORTBBIT.bit7
#defineGreen_ledPORTBBIT.bit6
#defineRS485_DIRPORTBBIT.bit1
#defineweg_data0PORTBBIT.bit0
#define PORTCBIT (*(volatile PBIT *)0x28)
#defineSpeakerPORTCBIT.bit0
#defineMOSI_1702PORTCBIT.bit3
#defineNSS_1702PORTCBIT.bit4
#defineSCK_1702PORTCBIT.bit5
#defineweg_data1PORTCBIT.bit1
但是AVR官方内部是这么定义的
#define PORTB _SFR_IO8(0x05)
#define PORTB7 7
#define PORTB6 6
#define PORTB5 5
#define PORTB4 4
#define PORTB3 3
#define PORTB2 2
#define PORTB1 1
#define PORTB0 0
求解师兄定义中PORTB的地址是怎么得到的