前面的内容,我们从传统的51单片机出发,从硬件的基础上,一步步衍生出了增强型51单片机所增强的地方。现在我们可以清楚地了解,增强型51单片机对比传统的51单片机,增强的地方在于存储器的扩展。而51单片机对于片内内存的寻址方式和片外内存的寻址方式有着很大的不同。因此,我们在使用C语言对增强型51单片机编程的时候,也需要按照寄存器位置的不同,采用不同的操作方式。
1寄存器位于内部的特殊功能寄存器区
我们之前介绍传统8051单片机的时候,曾经列出了传统8051单片机已经使用的21个特殊功能寄存器,因此扩展外设寄存器的一个办法就是利于剩余的特殊功能存储器空间。
由于51单片机的特殊功能寄存器寻址方式只能是直接寻址,不可间接寻址,因此在C语言中无法使用指针的方式去操作这些特殊功能寄存器。因为对于C语言指针来说,它对应的汇编语言是一种间接寻址的方式。基于此,C51在标准的C语言基础上,衍生出了一些额外的语法,如当需要定义这些特殊功能寄存器以便于程序访问的时候,C51加入了一个关键词“sfr”,使用“sfr”关键词可以将特殊功能寄存器区的地址,定义成某个变量,如“sfr P0 = 0x80;”,这句语句的意思就是将位于内部RAM 0x80地址上的寄存器,定义成P0,由于0x80位于特殊功能寄存器区,因此这个定义是完全合法的。在后面想要对P0进行操作,只需要在C语言中直接使用“P0”这个标号即可。如“P0 = 0xff;”。
我们可以打开传统的keil C51头文件“reg51.h”,可以发现这个头文件中,将传统8051的所有寄存器全部定义出来了,如图1所示。
图1传统8051单片机的特殊功能寄存器定义
对于增强型51单片机来说,那些被排放在特殊功能寄存器区的外设控制寄存器只能使用“sfr”关键词的方式去定义,如图2所示。
图2增强型单片机增加的资源示例
除了“sfr”关键词之外,Keil C51还支持使用“sbit”关键词定义特殊功能寄存器的某一位,是因为51单片机是所有单片机中唯一支持寄存器位寻址的芯片。不过为了程序方便移植到其它平台上去,对于这些特殊的关键词,还是尽可能将其限制在少量的文件中。
2寄存器位于内部的扩展的RAM中
当内部的特殊功能寄存器区用完之后,如果想要继续增加寄存器,那么唯一可以选择的空间也就只有特殊功能寄存器以外的区域了。对于增强型51单片机来说,它的内存空间刨去特殊功能寄存器区,还可以给其使用的空间有两个,一个是内置RAM剩余空间,还有一个是内置的外扩RAM。
对于STC8A8K系列的芯片来说,这些寄存器被设计到了内置的外扩RAM上。因此,对于这一段内存上的寄存器,我们可以在C语言中使用常量指针的形式去定义,但是,还是需要使用C51的关键词“xdata”去声明这些地址,当然,去优化的“volatile”关键词也不能少,如图3所示。
图3内置外扩SRAM上寄存器的定义