一、static研究
首先上一段代码让我来探究这个static变量到底是什么鬼?
由图可知,在循环执行下静态变量s_1发生了变化,i没有发生变化。在for循环中static变量赋值一次后(初次赋值)就在不会被重新赋值(说白了就是 static int s_1 = 1;这条语句失效)但是变量i可以继续重新被定义和赋值。
二、单片机编程中C语言之间的差别。
1、在C51中多了 特殊功能寄存器型和位类型
(1)特殊功能寄存器型分别定义格式为:
sfr 特殊功能寄存器名 = 特殊功能寄存器地址常数
sfr16 特殊功能寄存器名 =特殊功能寄存器地址常数
eg:对于MCS-51片内I/O口,定义方法如下。
sfr P1 = 0x90;//定义P1口,地址90H
sfr P2 = 0xA0;//定义P2口,地址A0H
sfr16用于定义16位特殊功能寄存器,如8052的T2定时器,可以定义为:
sfr16 T2 = 0xCC;//这里定义8052定时器2,地址为T2L=CCH,T2H=CDH
🐖:sfr16定义一个16位特殊功能寄存器时,等号后面是他的低位地址,高位地址一定要位于位于低位地址之上,所以sfr16不能用于定时器0和1的定义。
(2)位类型
定义格式:sbit 位变量名 = 位地址
sbit P1_1 = 0X91//同sfr一样sbit的为地址必须位于80H~FFH之间。
sbit 位变量名 = 位地址
sbit P3_1=P3^1
sbit 位变量名 = 字节地址^位位置
sbit P3_1 = 0xB0^1
🐖:1、位变量不能定义一个指针,如不能定义bit *aa
2、不能定义位数,如不能定义 bit array[2]
3、bit与sbit不同,bit不能指定位变量的绝对地址,当需要指针定b位变量的绝对地址(范围必须在0x80~0xff)时需要使用sbit来定义 sbit flag=P1^0.
4、变量的存储类型为bdata时,该变量的某一位可以用sbit来定义,当然也可以用bit。eg
bdata char jj;
sbit mybit7=jj^7;
3、运算符与表达式
位运算: (1)&:按位与 (2)|:按位或 (3) ^:按位异或。 (4)~:按位取反 (5)<<:位左移 (6)>>:位右移
自增自减运算符:(1)++i;//使用i之前,先使i值加1 (2)–i;++i;//使用i之前,先使i值减1 (3)i++;//使用i之后,再使i值加1 (4)i–;//使用i之后,再使i值减1
指针与地址运算符:(1)*:指针运算符。(2)&:取地址运算符
4、函数
函数定义:
函数类型 函数名 (形参表)[reentrant] [interrupt m] [using n]
{函数体;}
函数类型:函数类型说明了函数返回值的类型。
函数名:函数名是用户为自定义函数取的名字以便于调用函数时使用。
形式参数表:用于列录再主函数与被调函数之间进行数据传递的形式参数。
reentrant修饰符
这个修饰符用于把函数定义为可重入函数。所谓可重入函数就是允许被递归调用的函数。
interrupt m修饰符
中断函数必须通过他定义。函数定义时用了interrupt m修饰符,系统编译时把对应函数转化为中断函数,自动加上程序头段和尾段,并按MCS-51系统中断的处理方式自动把安排再程序存储器中的相应位置。
m取值为0~4
0——外部中断0 1——定时/计数器T0 2——-外部中断1 3—-定时/计数器T1 4——-串行口中断
using n 修饰符
用于指定本函数内部使用的工作组寄存器组,其中n取值0~3,表示寄存器组号。
c51编程不用加using n修饰符 由C51编译器自动选择。