当前位置:首页 > 单片机 > 单片机
[导读]从业近十年!手把手教你单片机程序框架 第69讲开场白:本来这一节打算开始讲液晶屏的,但是昨天经过网友“任军”的点拨,我发现了一个惊天秘密,原来static关键字是这么好的东西我却错过了那么多年。以前就

从业近十年!手把手教你单片机程序框架 第69讲

开场白:

本来这一节打算开始讲液晶屏的,但是昨天经过网友“任军”的点拨,我发现了一个惊天秘密,原来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液晶屏的常用点阵字体程序。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

本设计的控制系统主要包括:倾斜模块、超声波模块、语音模块、光敏电阻模块及电源等。

关键字: 单片机 STC51

本文针对电动两轮车自燃防控装置的开发与分析进行了研究。通过电动两轮车自燃原因分析,提出了电动两轮车的自燃防控智能装置设计思路,介绍了电动两轮车的自燃防控智能

关键字: STC89C52RC 单片机 微控制器

现在市面上还不存在一种方便实验人员选取芯片,以及方便管理人员对芯片进行智能化管理的芯片柜,为此希望通过研发这款智能芯片柜,来解决以上问题。​

关键字: 单片机 芯片

这款全新的中端MCU系列为设计人员提供了更高水平的安全性和灵活性

关键字: 嵌入式 单片机

单片机是一种嵌入式系统,它是一块集成电路芯片,内部包含了处理器、存储器和输入输出接口等功能。

关键字: 单片机 编写程序 嵌入式

在现代电子技术的快速发展中,单片机以其高度的集成性、稳定性和可靠性,在工业自动化、智能家居、医疗设备、航空航天等诸多领域得到了广泛应用。S32单片机,作为其中的佼佼者,其引脚功能丰富多样,是实现与外部设备通信、控制、数据...

关键字: s32单片机引脚 单片机

在微控制器领域,MSP430与STM32无疑是两颗璀璨的明星。它们各自凭借其独特的技术特点和广泛的应用领域,在市场上占据了重要的位置。本文将深入解析MSP430与STM32之间的区别,探讨它们在不同应用场景下的优势和局限...

关键字: MSP430 STM32 单片机

该系列产品有助于嵌入式设计人员在更广泛的系统中轻松实现USB功能

关键字: 单片机 嵌入式设计 USB

单片机编程语言是程序员与微控制器进行交流的桥梁,它们构成了单片机系统的软件开发基石,决定着如何有效、高效地控制和管理单片机的各项资源。随着微控制器技术的不断发展,针对不同应用场景的需求,形成了丰富多样的编程语言体系。本文...

关键字: 单片机 微控制器

单片机,全称为“单片微型计算机”或“微控制器”(Microcontroller Unit,简称MCU),是一种高度集成化的电子器件,它是现代科技领域的关键组件,尤其在自动化控制、物联网、消费电子、汽车电子、工业控制等领域...

关键字: 单片机 MCU
关闭
关闭