开场白:
原本这一节计划开端讲液晶屏的,可是昨日通过网友“任军”的指点,我发现了一个惊天隐秘,本来static要害字是这么好的东西我却错过了那么多年。曾经就有一些网友诉苦,鸿哥的程序好是好,便是全局变量满天飞,其时我觉得我也没招呀,C言语就全局变量和局部变量,单单靠局部变量必定不可,局部变量每次进入函数内部数值都会被初始化改动,所以我在许多场合也只能靠全局变量了。可是自从昨日知道了static要害字的隐秘后,我茅塞顿开,许多场合只要在局部变量前面加上static要害字,就能够大大削减全局变量的运用了。
这一节要教会我们一个知识点:
我们都知道,一般的局部变量在每次程序履行到函数内部的时分,数值都会被从头初始化,数值会发生变化,不能坚持之前的数值。可是在局部变量加上static要害字后,体系在刚上电的时分就现已把带static的局部变量赋初始值了,从此程序每次进入函数内部,都不会初始化带static要害字的局部变量,它会坚持最近一次被程序履行更改的数值不变,像全局变量相同。跟全局变量仅有的差别是,带static要害字的局部变量的效果域仅仅在函数内部,而一般全局变量的效果域是整个工程。
本程序例程是直接在第八节程序上修正,大大削减了全局变量的运用。具体内容,请看源代码解说。
(1)硬件渠道:
根据朱兆祺51单片机学习板。用矩阵键盘中的S1和S5号键作为独立按键,记得把输出线P0.4一向输出低电平,模仿独立按键的触发地GND。
(2)完成功用:跟前面第八节的功用一模相同,有两个独立按键,每按一个独立按键,蜂鸣器宣布“滴”的一声后就停。
(3)源代码解说如下:
#include “REG52.H”
#define const_voice_short 40
#define const_key_time1 20
#define const_key_time2 20
void initial_myself();
void initial_peripheral();
void delay_long(unsigned int uiDelaylong);
void T0_time();
void key_service();
void key_scan();
sbit key_sr1=P0^0;
sbit key_sr2=P0^1;
sbit key_gnd_dr=P0^4;
sbit beep_dr=P2^7;
unsigned char ucKeySec=0; //一些需要在不同函数之间运用的中心变量,只能用全局变量
unsigned int uiVoiceCnt=0; //一些需要在不同函数之间运用的中心变量,只能用全局变量
void main()
{
initial_myself();
delay_long(100);
initial_peripheral();
while(1)
{
key_service();
}
}
void key_scan()
{
/* 注释一:
(1)我们都知道,一般的局部变量在每次程序履行到函数内部的时分,数值都会被从头初始化,
数值会发生变化,不能坚持之前的数值。
(2)可是在局部变量加上static要害字后,体系在刚上电的时分就现已把带static的局部变量
赋初始值了,从此程序每次进入函数内部,都不会初始化带static要害字的局部变量,它会坚持
最近一次被程序履行更改的数值不变,像全局变量相同。跟全局变量仅有的差别是,带static要害字
的局部变量的效果域仅仅在函数内部,而一般全局变量的效果域是整个工程。
(3)以下这些变量我本来在第八节是用一般全局变量的,现在改成用static的局部变量了,削减了全局变量
的运用,让程序阅览起来愈加简练。我们也能够试试把以下变量的static去掉试试,成果会发现去掉了static后,
按键就不会被触发了。
*/
static unsigned int uiKeyTimeCnt1=0; //带static的局部变量
static unsigned char ucKeyLock1=0;
static unsigned int uiKeyTimeCnt2=0;
static unsigned char ucKeyLock2=0;
if(key_sr1==1)//IO是高电平,阐明按键没有被按下,这时要及时清零一些标志位
{
ucKeyLock1=0; //按键自锁标志清零
uiKeyTimeCnt1=0;//按键去颤动延时计数器清零,此行十分奇妙,是我实战中探索出来的。
}
else if(ucKeyLock1==0)//有按键按下,且是第一次被按下
{
uiKeyTimeCnt1++; //累加守时中止次数
if(uiKeyTimeCnt1>const_key_time1)
{
uiKeyTimeCnt1=0;
ucKeyLock1=1; //自锁按键置位,防止一向触发
ucKeySec=1; //触发1号键
}
}
if(key_sr2==1)
{
ucKeyLock2=0;
uiKeyTimeCnt2=0;
}
else if(ucKeyLock2==0)
{
uiKeyTimeCnt2++;
if(uiKeyTimeCnt2>const_key_time2)
{
uiKeyTimeCnt2=0;
ucKeyLock2=1;
ucKeySec=2;
}
}
}
void key_service()
{
switch(ucKeySec)
{
case 1:
uiVoiceCnt=const_voice_short;
ucKeySec=0;
break;
case 2:
uiVoiceCnt=const_voice_short;
ucKeySec=0;
break;
}
}
void T0_time() interrupt 1
{
TF0=0;
TR0=0;
key_scan();
if(uiVoiceCnt!=0)
{
uiVoiceCnt–;
beep_dr=0;
}
else
{
;
beep_dr=1;
}
TH0=0xf8;
TL0=0x2f;
TR0=1;
}
void delay_long(unsigned int uiDelayLong)
{
unsigned int i;
unsigned int j;
for(i=0;i
{
for(j=0;j<500;j++)
{
;
}
}
}
void initial_myself()
{
key_gnd_dr=0;
beep_dr=1;
TMOD=0x01;
TH0=0xf8;
TL0=0x2f;
}
void initial_peripheral()
{
EA=1;
ET0=1;
TR0=1;
}
总结陈词:
下一节开端讲液晶屏显现方面的内容。欲知概况,请听下回分解—-带字库12864液晶屏的常用点阵字体程序。