51转AVR

/*--------------------------------------------------------------*/
//ICC-AVR application builder : 2009-7-22 20:46:10
// Target : M8
// Crystal: 1.000Mhz
/*--------------------------------------------------------------*/


/*--------------------------------------------------------------*/
//防止重复定义
#ifndef __ICCAVRIO_H__
#define __ICCAVRIO_H__


/*--------------------------------------------------------------*/
//定义新的数据类型,方便进行IO端口操作。
//定义一个8字节的位域 bit0~7是每个位域名称, 1代表一位, bit_field就是整个位域的名称
typedef struct
 {
    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 GET_BIT(adr)   (*(( volatile bit_field * )(&adr)))


/*--------------------------------------------------------------*/
//设置是否自动初始化IO方向寄存器
//自动初始化IO方向寄存器无需在初始化程序中用PORTA=0X..;形式来初始化io控制寄存器,
//同时也不争的证明了avr单片机的端口输入/出切换功能
#define AUTOINIT 1  
//     0 //手动配置IO方向寄存器
//     1 //自动配置IO方向寄存器     


/*--------------------------------------------------------------*/
//输出端口设置
#if (AUTOINIT == 1)  //自动初始化IO方向寄存器
 #define PORT(m, n) GET_BIT(DDR##m).bit##n = 1;/
      GET_BIT(PORT##m).bit##n

#else     //需手动配置IO方向寄存器
 #define PORT(m, n) GET_BIT(PORT##m).bit##n
#endif


/*--------------------------------------------------------------*/
//输入端口设置(检测输入端口)
#if (AUTOINIT == 1)  //自动初始化IO方向寄存器
 #define PIN(m, n) (!(GET_BIT(DDR##m).bit##n = 0) &&/
       (GET_BIT(PORT##m).bit##n = 1) &&/
       GET_BIT(PIN##m).bit##n)

#else     //需手动配置IO方向寄存器
 #define PIN(m, n) GET_BIT(PIN##m).bit##n
#endif


/*-------------------------------------------------------------*/
//端口输入输出方向设置
//方便直观操作 自由设定单个io口的方向
#define DRA(n)   GET_BIT(DDRA).bit##n
#define DRB(n)   GET_BIT(DDRB).bit##n
#define DRC(n)   GET_BIT(DDRC).bit##n
#define DRD(n)   GET_BIT(DDRD).bit##n
#define DDR(m, n)  GET_BIT(DDR##m).bit##n


/*--------------------------------------------------------------*/
#endif

 

/*-------------------------------------------------------------*/
/*
//在我们实际项目中,需要用到按键输入,继电器,SPI器件输出,
//两者分别为输入,和输出之用,这时候可以方面的在各自c文件对应的.h文件中写下如下语句:
#define KEY1 PIN(C, 3)  //定义三个按键,使能上拉
#define KEY2 PIN(C, 4)
#define KEY3 PIN(C, 5)

#define SCLK_SPI PORT(B, 5) //定义spi口的两个控制引脚
#define CS_SPI  PORT(C, 0)


//上述PIN PORT 自动化定义的方法中,有些不足,
//如:在DS18B20这样的应用中,需要切换引脚的输入输出,就必须为18B20的引脚安排两套定义,
//类似于: 
  #define DS18B20_IN   PIN(A, 1)
  #define DS18B20_OUT  PORT(A, 1)


//此外:PORT和PIN的自动化定义中,含有DDR的操作,
//凡是用到PIN和PORT定义过的端口的地方都需要重复DDR操作,带来冗余代码。
//希望朋友们能够用得上!
/*-------------------------------------------------------------*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值