标题:
自己捉摸的一个按键处理单片机函数
[打印本页]
作者:
liyu124118
时间:
2018-3-12 16:01
标题:
自己捉摸的一个按键处理单片机函数
此按键处理函数功能是按一次按键不管按键抬不抬起都只执行一次按键操作,且延时很短,程序不会停在按键处
单片机源程序如下:
/**************************************************/
//长按按键后快速变动
#include"reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit k1=P1^0;
u16 i=2;
u16 a,b;
u16 kn;
u8 l_key,key0;
u8 val[8];
u8 nums_smg[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay(u16 i)
{
while(i--);
}
void smg_s()
{
u8 i;
for(i=0;i<8;i++)
{
switch(i)
{
case(0):LSC=0;LSB=0;LSA=0;break;
case(1):LSC=0;LSB=0;LSA=1;break;
case(2):LSC=0;LSB=1;LSA=0;break;
case(3):LSC=0;LSB=1;LSA=1;break;
case(4):LSC=1;LSB=0;LSA=0;break;
case(5):LSC=1;LSB=0;LSA=1;break;
case(6):LSC=1;LSB=1;LSA=0;break;
case(7):LSC=1;LSB=1;LSA=1;break;
}
P0=val[i];
delay(100);
P0=0x00;
}
}
void smg_x()
{
val[0]=nums_smg[i/10];
val[1]=nums_smg[i%10];
val[2]=0x00;
val[3]=0x00;
val[4]=0x00;
val[5]=0x00;
val[6]=0x00;
val[7]=0x00;
}
u16 k_1(u16 i)
{
if(i==20)
i=0;
else
i++;
return i;
}
u16 key_chuli(u16 (*keys)(u16 i),u8 key)
{
if((key==0)&&(key0==1)||((kn==0)||(kn==a)||(kn==b)))
{
kn=1;
if(key==0)
{
delay(1000);
if(key==0)
{
i=keys(i);
}
}
else
{
i=keys(i);
}
if(l_key==1)
{
b=a/3;
}
}
else
if((key==0)&&(key0==0))
{
kn++;
if(kn==2)
{
l_key=1;
}
}
else if((key==1)&&(key0==1))
{
key=1;
}
else if((key==1)&&(key0==0))
{
delay(1000);
key=1;
if(key==1)
{
kn=0;
a=50;
b=0;
l_key=0;
}
}
key0=key;
return i;
}
void main()
{ kn=0;
a=50;
b=0;
l_key=0;
while(1)
{
i=key_chuli(k_1,k1);
smg_x();
smg_s();
}
}
复制代码
所有资料51hei提供下载:
key_chuli.rar
(745 Bytes, 下载次数: 13)
2018-3-12 15:59 上传
点击文件名下载附件
按键处理
下载积分: 黑币 -5
作者:
yn0879
时间:
2018-4-10 02:01
谢谢分享,真是好程序
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1