编辑: 丶蓶一 | 2014-10-18 |
如果不是第一次调用,那么它的值就是上一次函数调用结束后的值. 在 某一些场合中,一些变量只在一个函数中使用了,但是这个变量每次变化的值我们还想保存,如果定义成局部动态变量的话,每次进入函数后上一次的值就丢失了, 如果定义成全局变量的话,又违背了我们上面提到的关于全局变量使用的一般原则,这个时候我们就可以定义成局部静态变量了. 比如上节课中断程序中有一个用于动态刷新数码管控制的变量j,我们上节课的程序是定义成了全局变量,现在我们可以直接改成局部静态变量来试试. #include?包含寄存器的库文件? sbit??ADDR0?=?P1^0;
sbit??ADDR1?=?P1^1;
sbit??ADDR2?=?P1^2;
sbit??ADDR3?=?P1^3;
sbit??ENLED?=?P1^4;
unsigned?char?code?LedChar[用数组来表示数码管真值表 ????0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, ???? 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8e, };
unsigned?char?LedNumber[6]?=?{0};
?//定义全局变量 unsigned?int?counter?=?0;
? void?main() { ????unsigned?long?stopwatch?=0;
? ???? ENLED?=?0;
?ADDR3?=?1;
?P0?=?0XFF;
???//74HC138和P0初始化部分 ???? TMOD?=?0x01;
??//设置定时器0为模式1 ???? TH0??=?0xFC;
????TL0??=?0x67;
??//定时值初值,定时1ms ????TR0??=?1;
打开定时器0 ????EA?=?1;
打开中中断 ???? ET0?=?1;
打开定时器0中断 ????while(1) ???? { ????????if(1000?==?counter)判断定时器0溢出是否达到50次 counter?=?0;
stopwatch++;
LedNumber[0]?=?stopwatch%10;
LedNumber[1]?=?stopwatch/10%10;
LedNumber[2]?=?stopwatch/100%10;
LedNumber[3]?=?stopwatch/1000%10;
LedNumber[4]?=?stopwatch/10000%10;
LedNumber[5]?=?stopwatch/100000%10;
????} }? ? void?InterruptTimer0() ?interrupt?1?中断函数的特殊写法,数字'
1'
为中断入口号 { ????static?unsigned?char?j?=?0;
????TH0?=?0xFC;
???//溢出后进入中断重新赋值 ???? TL0?=?0x67;
????counter+计数值counter加1 ????P0?=?0xFF;
???//消隐 ???? switch(j) ????{ case?0:?ADDR0=0;
?ADDR1=0;
?ADDR2=0;
?j++;
?P0=LedChar[LedNumber[0]];
?break;
? ????????case?1:?ADDR0=1;
?ADDR1=0;
?ADDR2=0;
?j++;
?P0=LedChar[LedNumber[1]];
?break;
case?2: ?ADDR0=0;
?ADDR1=1;
?ADDR2=0;
?j++;
?P0=LedChar[LedNumber[2]];
?break;
case?3:? ADDR0=1;
?ADDR1=1;
?ADDR2=0;
?j++;
?P0=LedChar[LedNumber[3]];
?break;
????????case?4: ?ADDR0=0;
?ADDR1=0;
?ADDR2=1;
?j++;
?P0=LedChar[LedNumber[4]];
?break;
case?5: ?ADDR0=1;
?ADDR1=0;
?ADDR2=1;
?j=0;
?P0=LedChar[LedNumber[5]];
?break;
????????default:?break;
动态刷新 }??? ????大家注意看这个程序的中断函数的静态变量j,如果加上了static,他的初始化j?=?0操作只进行一次,下边的程序会进行j++操作,下次进入中断函数的时候,j会保持上次的值.但是如果去掉static这个关键字,那每次进入函数后,j都会被初始化成0,大家可以自己修改程序做尝试. 1.3?点阵LED的初步认识 点阵LED显示屏作为一种现代电子媒体,具有灵活的显示面积(可分割、任意拼装)、高亮度、长寿命、数字化、实时性等特点,应用非常广泛. 前边学了LED小灯和LED数码管后,学LED点阵就要轻松得多了.一个数码管是8个LED组成,同理,一个8*8的点阵是由64个LED小灯组成.图7-1就是一个点阵LED最小单元,一个8*8的点阵LED,图7-2是它的内部结构图. 图7-1?8*8点阵LED 7-2?8*8点阵LED结构原理图 ????点阵LED内部原理图如图7-2所示,从7-2图上可以看出来,其实点阵LED点亮原理还是很简单的.在我们图上蓝色方框外侧的就是点阵LED的引脚号,左侧的8个引脚是接的内部LED的阳........