前言
本篇文章主要带领大家了解为什么要使用定时器代替延时函数。
一、延时函数的优点和缺点
优点:编写简单,容易理解。
缺点:阻塞程序,让一直一直处于等待状态,工作效率低极大的浪费了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,在实际操作中会更加高效。
总结
使用此方法可以使得按键更加灵敏,大家下去可以自己试一试。有什么不会的大家留意交流。
喜欢的朋友点个赞。