一向以来在论坛常见到网友们说什么包括库文件后是不是就不必自已写器材的驱动程序了?(比如说LCD的,延时函数,SPI,UART,E2PROM等等),编了这么久的程序,也一向是“闷”着头写程序,只知道BIT指令等等是在macros.h中界说的,PA等等端口的地址也是在iomXXv.h中界说的,也没细想过什么,知其然即可,呵呵,囫囵吞枣。。。
今日看到此帖:avr.com/bbs/dispbbs.asp?boardid=2&Id=30″ rel=”nofollow”>[下载]ICCAVR库函数源程序 忽然想去看看,所以到ICC的装置目录下,到include文件夹中看了看,感觉有些收成,故发此帖。
翻开macros.h看到了一些宏界说:
BIT指令的来历:
#ifndef BIT
#define BIT(x)(1 << (x))
#endif
flash的来历:
#define flashconst/* 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
以上仅为个人观点,缺乏与不当及过错之处敬请广阔网友批判指证!