蓝桥杯使用定时器代替延时控制按键

举报
yd_274589494 发表于 2023/07/22 09:51:08 2023/07/22
【摘要】 @TOC 前言本篇文章主要带领大家了解为什么要使用定时器代替延时函数。 一、延时函数的优点和缺点优点:编写简单,容易理解。缺点:阻塞程序,让一直一直处于等待状态,工作效率低极大的浪费了CPU的资源。 二、代码详解#include<STC15F2K60S2.H>//按键引脚声明sbit S7=P3^0;sbit S6=P3^1;sbit S5=P3^2;sbit S4=P3^3;//变量类型宏...

@TOC

前言

本篇文章主要带领大家了解为什么要使用定时器代替延时函数。

一、延时函数的优点和缺点

优点:编写简单,容易理解。
缺点:阻塞程序,让一直一直处于等待状态,工作效率低极大的浪费了CPU的资源。

二、代码详解

#include<STC15F2K60S2.H>

//按键引脚声明
sbit S7=P3^0;
sbit S6=P3^1;
sbit S5=P3^2;
sbit S4=P3^3;

//变量类型宏定义(定义变量多时可以减少代码的书写量)
#define unsigned char u8
#define unsigned short u16
#define unsigned int u32

u8 Key_VOL;//记录按键键值

static u8 Key_scan(void);//按键控制函数
static void key_ser(void);//按键服务函数(用来处理键值)

//***********定时器初始化
void Timer0Init(void)		//1毫秒@11.0592MHz
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0xCD;		//设置定时初值
	TH0 = 0xD4;		//设置定时初值
	EA=1;
	ET0=1;
	TR0 = 1;		//定时器0开始计时
}

//**********定时器服务函数
//(中断服务函数要求快进快出建议大家在这里少写代码)
void serviceTimer0() interrupt 1
{
	
	Key_scan();
}


u8 Key_scan(void)
{
    static u32 count=0;
	
	//下面为控制S7的代码其余按键可以进行复制处理加快编写代码速度	
	if(S7==0)
	{
		if(S7==0)
		{
			count++;
			if(count>=10)//消抖
			{
				count=0;
				key_VOL=1;//记录按键值
			}
		}		
		else//按键未按下
		{
			count=0;//计数值清零
		}
	}
			
	
	return Key_VOL;
}

void key_ser(void)
{

	switch(Key_VOL)//根据键值处理功能
	{
		case 1:
		{
			
		}
		break;
	}
}

void main(void)
{
	while(1)
	{
		key_ser();
	}
}

大多数朋友都是在按键扫描函数里面写功能代码,我其实不建议这样,我更推荐使用一个变量记录按键的状态,后面再重新编写一个函数单独来实现具体的功能。
这样看起来可能写了更多代码,但是这种写法非常方便Debug,在实际操作中会更加高效。

总结

使用此方法可以使得按键更加灵敏,大家下去可以自己试一试。有什么不会的大家留意交流。
喜欢的朋友点个赞。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。