此按鍵處理函數功能是按一次按鍵不管按鍵抬不抬起都只執行一次按鍵操作,且延時很短,程序不會停在按鍵處
單片機源程序如下:
- /**************************************************/
- //長按按鍵后快速變動
- #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
|