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-17 12:37
设计资源 培训 开发板 精华推荐
- [未验证]QC协议诱骗器(纯硬件Mini版)
- 用于电源管理的 15V 交流转直流单输出电源
- PCB象棋
- LT1306、2 节电池至 3.3V 输出转换器
- 基于esp01s的联网加热杯垫
- 反向降压35W,LED电流由具有模拟/ PWM调光调节的HVLED002控制
- 使用 Clare OptoMOS 组件的 FXO/DAA 设计,使用 LDA100 进行环路电流检测
- CLEV6630A: MFRC630和SLRC610 NFC前端开发板
- MIKROE-3486,用于 Kinetis MK24FN256VDC12 的 MCU 卡
- 使用 Analog Devices 的 LT1317BIS8 的参考设计