1.static
static一般不用在主函数中,大多数在中断函数和封装好的子函数里运用,它的作用是保证在子函数或中断函数中定义的变量每次调用完之后都可以保持调用完时候的值,《手把手教你学51单片机》文档7.2节有这个知识点的讲解,不过我们还是用代码来解释这个static的作用吧。
2.举例
我们要实现像第四章第2讲的实验现象让数码管0从0到F循环显示。本次我们用的是函数封装,代码如下
#include sbit ADDR2 = P1^2; sbit ADDR1 = P1^1; sbit ADDR0 = P1^0; sbit ENLED = P1^4; sbit ADDR3 = P1^3; unsigned char code LedChar[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//数码管状态值初始化 void delay_ms(unsigned int x) { unsigned int i,j; if(x==1000) { for(i=0;i<19601;i++)//延时1s { for(j=5;j>0;j--); } } else while(x--)for(j=115;j>0;j--); } void SEG0_task() { unsigned char i=0; P0=LedChar[i]; i++; if(i>=16)i=0; //让i在0~15之间变化 } void main() { ADDR3 = 1;//使能三八译码器 ENLED = 0;// ADDR2 = 0;//************************** ADDR1 = 0;//只让数码管0显示 ADDR0 = 0;//************************** while(1) { SEG0_task(); delay_ms(1000);//延时1s } } 我们看到的是数码管0一直显示0,这是因为主函数的死循环里每次调用“SEG0_task()”时开头i的值都被初始化为0了,虽然第一次调用完这个函数时,已经执行过“i++;”,但是第二次调用该函数时i又被初始化为0了,导致永远执行的是“P0= LedChar[0];” 而我们只要在SEG0_task()函数中加上static的关键字去定义i,就可以使i成为局部静态变量,从而实现变量在函数调用结束之后仍然保持着当前的值,第二次调用该函数时不会被再次初始化为0。 代码修改如下 static unsigned char i=0; 这样就可以实现我们想要的实验现象了。 3.回归按键 按键的执行任务也可以封装为函数,同样需要static去定义key_up,因为它需要跟着KEY4变化,而不是每次都被初始化为同一个值。 代码如下 #include sbit ADDR2 = P1^2; sbit ADDR1 = P1^1; sbit ADDR0 = P1^0; sbit ENLED = P1^4; sbit ADDR3 = P1^3; sbit LED2 = P0^0; sbit KEY4 = P2^7; void delay_ms(unsigned int x) { unsigned int i,j; if(x==1000) { for(i=0;i<19601;i++)//延时1s { for(j=5;j>0;j--); } } else while(x--)for(j=115;j>0;j--); } void KEY_task() { static unsigned char key_up=1; if(key_up==0) { if(KEY4==1)//不支持连按 { LED2 = !LED2; } } key_up=KEY4; //如果不松手,key_up就会等于0 } void main() { ADDR3 = 1;//使能三八译码器 ENLED = 0;// ADDR2 = 1;//************ ADDR1 = 1;//只让小灯显示 ADDR0 = 0;//************ P2 = 0xF7;//让K4能具备有被拉低的条件先 while(1) { KEY_task(); //按键功能任务 delay_ms(2);//假设这部分是要执行的其他程序 } }
上一篇:51单片机-不支持连按
下一篇:51单片机-支持连按与全局变量
推荐阅读最新更新时间:2024-11-02 10:18
设计资源 培训 开发板 精华推荐
- 使用 MaxLinear, Inc 的 SPX385AN-1.2 的参考设计
- LTC3624EDD-23.3 3.3V 输出电压、2A 同步降压稳压器的典型应用,具有 800mA 突发钳位,fSW = 1MHz
- FPC转接板(OLED24转32)
- FAN53601 6MHZ 600MA/1A同步降压稳压器典型应用
- 基于ATA5795 MCU的遥控钥匙应用电路
- LT3692AHFE、12V、3.3V、2.5V、1.2V 四路输出、具有外部同步、输出排序和跟踪应用的典型应用电路
- 【南京邮电校赛】BoostPFC
- 使用 Diodes Incorporated 的 ZR78L033 的参考设计
- LT1074IT 负升压转换器的典型应用
- 使用具有 B 类 EMI 滤波(单输出)的 RP10-1205SA DC/DC 转换器的典型应用