今天看到此帖:[下载]ICCAVR库函数源程序 突然想去看看,于是到ICC的安装目录下,到include文件夹中看了看,感觉有些收获,故发此帖。
打开macros.h看到了一些宏定义:
BIT指令的来历:
#ifndef BIT
#define BIT(x) (1 << (x))
#endif
flash的来历:
#define flash const /* IAR compatibility */
一直不明白在ICC中asm("nop"); _NOP(); NOP(); 是不是一样的,前者容易理解,是在C中嵌入汇编,可为什么后两者都能编译通过呢?看看在macros.h中的两条宏定义你就明白了:
#define NOP() asm("nop")
#define _NOP() asm("nop")
还有几条关于看门狗喂狗的和开总中断关总中断的:
#define WDR() asm("wdr") //喂狗
#define SEI() asm("sei") //开总中断
#define CLI() asm("cli") //关总中断
#define _WDR() asm("wdr")
#define _SEI() asm("sei")
#define _CLI() asm("cli")
明白了一些东西吗?
看看iom16v.h文件,你就可以明白PORTA|=(1< #define PA7 7 也就是说编译时PA7是7,1< 听了上面解释你就明白这个什么意思了吧: void usart_send(unsigned char da { while(!(UCSRA&BIT(UDRE))); //将数据放入缓冲器,发送数据 UDR=da } 以下是对USARA寄存器及寄存器内各个位的定义: #define UCSRA (*(volatile unsigned char *)0x2B) #define RXC 7 #define TXC 6 #define UDRE 5 #define FE 4 #define DOR 3 #define OVR 3 /*This definition differs from the databook*/ #define PE 2 #define U2X 1 #define MPCM 0 #define UDR (*(volatile unsigned char *)0x2C) 明白了吗? 谈一点题外话,是看到这些头文件开头都有的两句话有感说一说一些编程技巧,关于条件编译的吧. 以iom16v.h为例: 开始有这样两句话: #ifndef __iom16v_h ………… …内容… ………… 因此在我们编程时,可以用这种编程思想: 假如说吧: 我们要用到LCD1602的功能函数,而在这个LCD文件(取名为LCD1602.c)时又要用到延时函数(取名为delay.c),在主函数中我们也要用到delay.c,但你就会发现,如果在主函数中加入#include "LCD1602.c"后,再包含#include "delay.c"就会编译出错,说你重复定义`delay文件中的函数。因此我们可以这样: 在LCD1602.c中包含"delay.c"时这样写: #ifndef _delay_c #include "delay.c" #endif 同样在主函数中包含延时时,也按这种方式写,就会避免重复包含同一个文件这个问题了。 可能有许多网友不明白条件编译,解释一下上面几句话吧: #ifndef _delay_c //如果没有定义过_delay_c才对下面的语句进行编译,范围到#endif结束 #include "delay.c" #endif 可能有些网友感觉自已可以运筹帷幄这个问题,但你想过没,如果你编的程序很大,而且经常相互包含文件呢? 以上仅为个人观点,不足与不妥及错误之处敬请广大网友批评指证!
#define __iom16v_h
#endif
这样有一个好处就是不重复定义。
#define _delay_c
#define _delay_c
上一篇:AVR定时/计数器应用设计
下一篇:ATmega128型号标识说明