Keil C 编程
- 对端口P0-7的读操作,需要先置1,然后再读。置1的状态是复位上电的默认状态(高电平); P1=0xFF;
- 关键字sfr是将地址赋给寄存器名,一般将寄存器大写命名;sfr T3MOD=0xC0; 指寄存器T3MOD的地址是0xC0;Sfr是volatile的,必须在函数外面申明;
Sfr是字节(8位)操作;sfr16是字(16位)操作;
3. Keil C的存储结构是高字节在低地址,而sfr16定义的字操作,是将单片机的高地址认为是高字节,低地址认为是低字节,跟Keil C是相反的;
4. sbit指令可以将端口的位映射为位变量,以方便位读写,其中^后的数字表示字节中的第几位;sbit P13 = P1^3; sbit类型的变量也必须在函数外面申明;
5. 外部存储指定地址的读写操作,用XBYTE,XBYTE指令相当于MOVX指令;absacc.h里面提供了用法;
6. 中断关键字,通过interrupt和using来实现。Interrupt决定中断矢量入口,using决定使用哪些寄存器。C51寄存器组0-3,每个寄存器组分别有R0-R7组成。
中断矢量入口根据datasheet上中断请求源表格,从0开始数,空行也算数。
比如:
void Uart(void) interrupt 4
void Uart3Isr() interrupt 17 using 1
7. _at_关键字:指定变量定义到指定空间;xdata 变量名 _at_ 地址;
8. 鲁棒性:所谓“鲁棒性”,是指控制系统在一定(结构,大小)的参数摄动下,维持其它某些性能的特性。 鲁棒是Robust的音译,也就是健壮和强壮的意思;
9. 存储空间分配:
空间 | 指令 | 数据类型 | 寻址方式 | |
片内内存 | MOX | data | DATA | 直接寻址 |
idata | IDATA | 间接寻址MOV @R0, #VAL | ||
片外内存 | MOVX | pPdata | PDATA页寻址空间 | MOVX @Ri |
xdata | XDATA | MOVX @DPTR | ||
程序空间 | MOVC | code | MOVC @A+DPTR |
10.
CPU指令系统:
直接寻址:
MOV A #3AH --->表示把3AH这个立即数放到累加器A里面
MOV A 3AH ---->表示将3AH这个地址里面的内容放到累加器A里面
间接寻址:
ANL A @R0 ---->R0寄存器,将R0寄存器的内容假设是60H作为地址,将60H地址的内容和累加器A里面的内容进行逻辑与,结果放到累加A里面
寄存器寻址:
ANL A R0 ------>将R0寄存器里面的内容和累加器A进行逻辑与,结果放到累加器A里面;
INC R0 --->将R0寄存器的内容加1,结果放在R0里面;
相对寻址模式:
11.
char (*p)[2]; 这个指针是指向数组的指针。数组的长度是2。
char *p[2]; 这个是指针数组,有两个指针。
12.
char (*f)() 这个是函数的指针,函数名可以直接当做函数的指针f。
char *f() 这个是指针的函数,返回值为指针的函数。
13.
Printf、scanf 参量允许的总字节数由C51库限制,8051存储结构有限:
SMALL和COMPACT模式下,最多传递15个字节;
LARGE模式下,最多传递40个字节;
14.
typedef定义规则:从左往右看,找到第一个没有定义的字符串,用这个字符串代替除了typedef和本身后的字符串。
typedef int inta[10];
从左往右看,第一个没有定义的字符串为inta, 代替除了typedef和inta后的字符串即int[10]
也就是,inta出现的地方,即指代int[10]