目录
前言:
本篇介绍了蓝桥杯单片机按键模块
按键底层代码
#include <STC15F2K60S2.H>
unsigned char ScanKey()
{
unsigned char Temp=0;
P44=0;P34=P35=P42=1;
if(P33==0)Temp=4;
if(P32==0)Temp=5;
if(P31==0)Temp=6;
if(P30==0)Temp=7;
P42=0;P34=P35=P44=1;
if(P33==0)Temp=8;
if(P32==0)Temp=9;
if(P31==0)Temp=10;
if(P30==0)Temp=11;
P35=0;P34=P44=P42=1;
if(P33==0)Temp=12;
if(P32==0)Temp=13;
if(P31==0)Temp=14;
if(P30==0)Temp=15;
P34=0;P44=P35=P42=1;
if(P33==0)Temp=16;
if(P32==0)Temp=17;
if(P31==0)Temp=18;
if(P30==0)Temp=19;
return Temp;
}
/*
unsigned char ScanKey()
{
unsigned char temp = 0;
if(P33 == 0) temp = 4;
if(P32 == 0) temp = 5;
if(P31 == 0) temp = 6;
if(P30 == 0) temp = 7;
return temp;
}
*/
三行代码消抖(具体原理不清楚的可以去搜索,这里就不做解释了) ,按键不同的两种触发方式
void Key_Loop()
{
Key_Val=ScanKey();
Key_Down=Key_Val&(Key_Old^Key_Val);
Key_Up=~Key_Val&(Key_Old^Key_Val);
Key_Old=Key_Val;
}
定时器扫描:每10ms扫描一次有效避免了因为使用Delay延时造成的不便
void ServiceTimer0() interrupt 1
{
static unsigned char count1=0;
TH0=(65535-1000)/256;
TL0=(65535-1000)%256;
count1++;
if(count1==10)
{
count1=0;
Key_Loop();
}
使用方法:
在Key_Loop函数内直接用Key_Down或Key_Up读取键值