include关键字用法

1
2
3
4
5
#include            // 包含一个源代码文件的头文件
#include <文件名> // 如果需要包含标准库头文件或者实现版本所提供的头文件
#include “文件名” // 如果需要包含针对程序所开发的源文件
#include <math.h>
#include “myfile.h”

使用尖括号< >和双引号" "的区别在于头文件的搜索路径不同:

使用尖括号< >,编译器会到系统路径下查找头文件;
使用双引号" ",编译器首先在当前目录下查找头文件,如果没有找到,再到系统路径下查找。

系统路径:在开发软件的INC文件夹中
tip:双引号" “比尖括号< >功能更加强大,可以导入工程中的其他函数,但是一般来讲我们会使用”"引用自己的函数,而用<>引用官方库函数,提升代码可读性。

sfr关键字用法(特殊功能寄存器sfr)

写程序的过程就是对特殊功能寄存器赋值,sfr 定义特殊功能寄存器中的字节。类似于C语言中的宏定义,对选定字节地址进行某特殊功能的命名。
sfr将单片机所有的字节寄存器的字节地址在头文件中定义了,一个地址表示了多个位,这将Keil与单片机的寄存器关联起来。
这一般是单片机厂商就已经编写好的,他们在.h中将硬件层的寄存器地址与寄存器缩写关联起来,便于进一步开发。

格式为:

1
sfr 功能命名 = 地址(位地址首位)

sbit关键字用法

sbit 用于特殊功能寄存器中可位寻址的位地址。类似于C语言中的宏定义,对选定位地址进行某特殊功能的命名。
一般也由单片机厂商在.h文件中编写好。

格式为:

1
sbit 功能命名 = 位地址

sfr针对字节,sbit针对位,以下是官方.h文件节选,用于体会两者用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//内核特殊功能寄存器        // 复位值   描述
sfr ACC = 0xE0; //0000,0000 累加器Accumulator
sfr B = 0xF0; //0000,0000 B寄存器
sfr PSW = 0xD0; //0000,0000 程序状态字
sbit CY = PSW^7;
sbit AC = PSW^6;
sbit F0 = PSW^5;
sbit RS1 = PSW^4;
sbit RS0 = PSW^3;
sbit OV = PSW^2;
sbit F1 = PSW^1;
sbit P = PSW^0;
sfr SP = 0x81; //0000,0111 堆栈指针
sfr DPL = 0x82; //0000,0000 数据指针低字节
sfr DPH = 0x83; //0000,0000 数据指针高字节

//I/O 口特殊功能寄存器
sfr P0 = 0x80; //1111,1111 端口0
sbit P00 = P0^0;
sbit P01 = P0^1;
sbit P02 = P0^2;
sbit P03 = P0^3;
sbit P04 = P0^4;
sbit P05 = P0^5;
sbit P06 = P0^6;
sbit P07 = P0^7;
sfr P1 = 0x90; //1111,1111 端口1
sbit P10 = P1^0;
sbit P11 = P1^1;
sbit P12 = P1^2;
sbit P13 = P1^3;
sbit P14 = P1^4;
sbit P15 = P1^5;
sbit P16 = P1^6;
sbit P17 = P1^7;