你好!欢迎来到 !
语言
当前位置: 首页>> 技术中心>> 单片机入门>> 基于宏定义的超强avr单片机io口操作

基于宏定义的超强avr单片机io口操作

关键字: io口操作 AVR单片机 作者: 来源: 发布时间:2018-12-27 浏览:5

本章重点讲述avr单片机的io口操作,为从51单片机走向嵌入式系统码农的福音,经历了51->MPS430或51->pic 51->avr,这样一些转换,本人粗略学了51,后直接专攻avr,为此有一些心得,和一些雕虫小技的小伎俩,希望能抛砖引玉,引发同行反思,在工作中提供举一反三后的便利。

想像51一样,在winavr中直接写上sbit KEY1 = p1^1,

然后用下列语句扫描键盘吗??

if(KEY1==0) keyval=1;

请看下面的宏定义,其中位段的手法来源于网络,本人纯属借鉴。之后的##,宏链接符,纯属自创,

各位先行使用以下宏后,有问题直接联系本人qq21332560讨论:注明验证信息:io口

//定义新的数据类型,方便进行IO端口操作。

typedef 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 ;
}bit_field;

#define GET_BIT(adr) (*(( volatile bit_field * )(&adr)))

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

#if AUTOINIT==1

#define PORT(m,n) GET_BIT(DDR##m).bit##n=1;\
GET_BIT(PORT##m).bit##n
#else

#define PORT(m,n) GET_BIT(PORT##m).bit##n

#endif
////////////////////////////////////////

#if AUTOINIT==1

#define PIN(m,n)

(!(u08)(GET_BIT(DDR##m).bit##n=0)

&&\
(u08)(GET_BIT(PORT##m).bit##n=1)

&&\
GET_BIT(PIN ##m).bit##n )
#else

#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

在我们实际项目中,需要用到按键输入,继电器,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操作,带来冗余代码。

编辑:admin 最后修改时间:2018-12-27

联系方式

0755-82591179

传真:0755-82591176

邮箱:vicky@yingtexin.net

地址:深圳市龙华区民治街道民治大道973万众润丰创业园A栋2楼A08

Copyright ? 2014-2023 All Rights Reserved.粤ICP备14043402号-4

Baidu
map