蓝桥杯使用定时器代替延时控制按键
【摘要】 @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)