Keil C51 笔记

我只是做了一个汇总。转载请注明出处。
不时更新中。
内容比较杂,如果下面的内容有什么问题,请告诉我。谢谢!

参考资料:
http://blog.csdn.net/zhbsniper/article/details/7176136
http://blog.csdn.net/husion01/article/details/8443289

Keil C 使用经过扩展的 ANSI C 作为编写语言,不支持结构体内的函数和函数内联,函数体内所有的变量定义都应放在其它代码的前面,且 for 循环初始条件中作为计数器的变量是不能像C++那样即用即定义的。
1.51单片机的存储器配置为:
1.1.内存 256B,地址为0x00 – 0xFF。其中
1.1.1.低128B(data/idata)可直接/间接寻址,包括寄存器也使用这部分的内存。
1.1.2.高128B(idata)只可间接寻址(Intel 8052)。
1.2.特殊功能寄存器(sfr),128B,其内存地址使用的是 0x80 – 0xFF,只可直接寻址。也就是说,SFR与内存的高128B的地址是一样的,但存储并不是重叠的。它们依靠不同的寻址方式来区分。
1.3.外存(xdata),64KB,地址为 0x0000 – 0xFFFF。使用16位的 DPTR 间接寻址。
1.4.代码区(code),64KB,地址为 0x0000 – 0xFFFF。
因此,Keil C 中的指针有三种,分别对应不同的存储区域:

char xdata *px;       /* ptr to xdata */
char idata *pi;       /* ptr to idata */
char code  *pc;       /* ptr to code  */

2.可以使用 bit 数据类型来定义布尔型变量。但无法定义 bit 数组或指针。
3.可以使用 #define 指令来定义简单的数值常量,这样可以保证程序效率最高。如果使用 const 修饰符定义常量数组或结构体,则在编译时会根据变量前的其他修饰符(如 idata、xdata、pdata)占用相应的内存区域,这是十分浪费的。一般定义常量的方法是将常量放在程序段。例如

code const char data[16] = {1, 2, 3, ...};

由于程序段一般是只读的,因此更加常用的声明方法是

code char data[16] = {1, 2, 3, ...};

在默认情况下,Keil会将程序中使用到的字符串常量放在程序段。 Continue reading “Keil C51 笔记”

Content is available under CC BY-SA 3.0 unless otherwise noted.