×
单片机 > 单片机程序设计 > 详情

看了看ICCAVR的库文件,谈几点感想

发布时间:2020-05-29 发布时间:
|
一直以来在论坛常见到网友们说什么包含库文件后是不是就不用自已写器件的驱动程序了?(比如说LCD的,延时函数,SPI,UART,E2PROM等等),编了这么久的程序,也一直是“闷”着头写程序,只知道BIT指令等等是在macros.h中定义的,PA等等端口的地址也是在iomXXv.h中定义的,也没细想过什么,知其然即可,呵呵,不求甚解。。。

 

今天看到此帖:[下载]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 data)//串口单字节发送函数

{

    while(!(UCSRA&BIT(UDRE)));

 //将数据放入缓冲器,发送数据

 UDR=data; 

}

以下是对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
#define __iom16v_h

…………

…内容…

…………
#endif
这样有一个好处就是不重复定义。

 

因此在我们编程时,可以用这种编程思想:

假如说吧:

我们要用到LCD1602的功能函数,而在这个LCD文件(取名为LCD1602.c)时又要用到延时函数(取名为delay.c),在主函数中我们也要用到delay.c,但你就会发现,如果在主函数中加入#include "LCD1602.c"后,再包含#include "delay.c"就会编译出错,说你重复定义`delay文件中的函数。因此我们可以这样:

在LCD1602.c中包含"delay.c"时这样写:

#ifndef _delay_c
#define _delay_c

#include "delay.c"

#endif

同样在主函数中包含延时时,也按这种方式写,就会避免重复包含同一个文件这个问题了。

可能有许多网友不明白条件编译,解释一下上面几句话吧:

#ifndef _delay_c   //如果没有定义过_delay_c才对下面的语句进行编译,范围到#endif结束
#define _delay_c

#include "delay.c"

#endif

可能有些网友感觉自已可以运筹帷幄这个问题,但你想过没,如果你编的程序很大,而且经常相互包含文件呢?

 

以上仅为个人观点,不足与不妥及错误之处敬请广大网友批评指证!



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机中高阻态的实质及意义