AVR单片机位操作的C语言编程实现
电子报/2011年/1月/16日/第015版
智能电子
AVR单片机位操作的C语言编程实现
湖北 曾安君
一、常规方法
AVR单片机的各类教材或编程应用参考资料,对介绍的端口位操作方法不外乎宏定义及整体和某个常量相或、相与来实现某一单个位状态的改变。如:PORT&=~(1<<1);等价于:PORTB&=oxfd;作用是PB1清零而其余位不变。与之类似的还有:
PORTB1=(1<<4);PB4置位,其余位不变。
PORTBA=(1<<4);PB4翻转,其余位不变。
上述方法,无论是常量值参与还是移位操作,用起来总嫌麻烦,不够直观,且具体常量值还需人工推算,易出错。移位操作生成的目标代码偏大,在大量运用时,占用系统内存或flash空间,执行效率低。
以笔者实际运用效果来看,宏定义比较好。笔者也偏好运用宏定义。C编译器在编译之前会事先进行宏替换,所以,如果宏定义讲究一些技巧,则代码执行效率将得到较大提升,编程时,操作也得心应手。
常规参考手册或资料,建议用以下宏定义:
#define PAO 0
#define PAl 1
#define PA2 2
#define PA3 3
#define PA4 4
#deffine PA5 5
#define PA6 6
#define PA7 7
#define CPL_BIT(x、y)(x^=(1
#define SET_BIT(x、y)(xl=(1
#define CLR_BIT(x、y)(x&=~(1
#define GET_BIT(x、y)(x&=(1
如此宏定义之后,可构成一个头文件,然后加入到新建工程文件中(编译器用ICC的ICC6.31A),但之前需包含相应单片机的头文件,如:MCU为AT-MEGA48,则最先包含iom48V.h之后,再包含此自制头文件,即可在程序中运用:
CPLBIT(PORTA,PA2);//PB2取反
GET_BIT(PORTA,PA6);//读取PA6的状态
CLR_BIT(PORTA,PA5);//清零PA5
SET BIT(PORTA,PAl);//PA1置1
此法在运用时,依旧用了移位操作,只是为了方便程序操作,笔者只在小规模程序中运用。 下面,笔者将充分利用C语言自身的强大位运算能力和指针相结合,构建一个ICC6.31A平台下的位定义头文件,希望能给大家一些启示。
首先明确几个基本概念:位域、地址绑定,和Volatile限定关键字。
在ICC6 31A的安装目录中有个in-elude文件夹,里面有大量编译器开发人员已为我们开发好