此按键处理函数功能是按一次按键不管按键抬不抬起都只执行一次按键操作,且延时很短,程序不会停在按键处
单片机源程序如下:
- /**************************************************/
- //长按按键后快速变动
- #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)
|