按住乙個按鍵不鬆手的加速勻速觸發

2022-07-17 20:06:12 字數 3119 閱讀 3844

/*

實現功能:兩個獨立按鍵s1和s2,s1作為加鍵,s2作為減鍵。每按一次s1鍵,則被設定引數uisetnumber自加1.

如果按住s1鍵不鬆手超過1秒,被設定引數uisetnumber以不斷邊塊的時間間隔往上自加1,這個為加速觸發的功能,

直到到達極限,則以固定的速度加1,這個過程叫勻速。s5作為減法按鍵,每觸發一次,uisetnumber就減1,

其加速和勻速觸發功能跟s1按鍵一樣。當被設定引數uisetnumber小於500的時候,led燈滅;當大於或者等於500

時,led燈亮。

*/#include "reg52.h"

#define const_voice_short 40

#define const_key_time1 20

#define const_key_time2 20

#define const_time_1s 444  //1秒鐘時間需要的定時中斷次數

#define const_initial_set 160  //連續觸發模式時,按鍵剛開始的間隔觸發時間

#define const_min_level 30  /*連續觸發模式時,按鍵經過加速後,

如果一旦發現小於這個值,則直接變到最後的間隔觸發時間*/

#define const_sub_dt 10   //按鍵的加速度,相當於按鍵間隔時間每次的變化量

#define const_last_min_set 5  //連續觸發模式的時候,按鍵經過加速後,最後的間隔觸發時間

#define const_syn_min_level 45 //產生同步聲音的最小閾值,這個必須要比蜂鳴器的時間略長一點

void initial_myself();

void initial_peripheral();

void delay_long(unsigned int uidelaylong);

void t0_time();

void key_service();

void key_scan();

void led_run();

sbit key_sr1=p0^0;

sbit key_sr2=p0^1;

sbit key_gnd_dr=p0^4;

sbit beep_dr=p1^5;

sbit led_dr=p3^5;

unsigned char uckeysec=0; //被觸發的按鍵編號

unsigned int uikeytimecnt1=0; //按鍵去抖動延時計數器

unsigned int uikeyctntycnt1=0; //按鍵連續觸發的間隔延時計數器

unsigned char uckeylock1=0;  //按鍵觸發後自鎖的變數標誌

unsigned int uisynctntycnt1=0; //產生按鍵同步聲音的計數器

unsigned int uictntytimeset1=const_initial_set;  //按鍵每次觸發的時間間隔,這數值不斷變小,導致速度不斷加快

unsigned int uictntysynset1=const_initial_set;  //同步聲音的時間間隔,這數值不斷變小,這速度不斷變快

unsigned char ucctntyflag1=0; //是否處於連續加速觸發模式的標誌位

unsigned int uikeytimecnt2=0; //按鍵去抖動延時計數器

unsigned int uikeyctntycnt2=0; //按鍵連續觸發的間隔延時計數器

unsigned char uckeylock2=0;  //按鍵觸發後自鎖的變數標誌

unsigned int uisynctntycnt2=0; //產生按鍵同步聲音的計數器

unsigned int uictntytimeset2=const_initial_set;  //按鍵每次觸發的時間間隔,這數值不斷變小,導致速度不斷加快

unsigned int uictntysynset2=const_initial_set;  //同步聲音的時間間隔,這數值不斷變小,這速度不斷變快

unsigned char ucctntyflag2=0; //是否處於連續加速觸發模式的標誌位 

unsigned int uivoicecnt=0;  //蜂鳴器鳴叫的持續時間計數器

unsigned int uisetnumber=0;  //設定的資料

void main()

}void led_run()  //led燈應用程式

else

}void key_scan()  //按鍵掃面函式,放在定時中斷裡

else if(uckeylock1==0)

}else if(uikeytimecnt1uictntytimeset1)

else

uikeyctntycnt1=0;

ucctntyflag1=1;  //進入連續加速觸發模式

uckeysec=1;   //觸發1號鍵

}uisynctntycnt1++;  //蜂鳴器連續觸發延時計數器累加

/*按住不鬆手,每隔一段uictntysynset1時間按鍵就觸發一次,

而且uictntysynset1不斷減小,鳴叫節奏就越快

*/if(uisynctntycnt1>uictntysynset1)

}else if(uikeytimecnt2uictntytimeset2)

else

uikeyctntycnt2=0;

ucctntyflag2=1;  //進入連續加速觸發模式

uckeysec=2;   //觸發2號鍵

}uisynctntycnt2++;  //蜂鳴器連續觸發延時計數器累加

/*按住不鬆手,每隔一段uictntysynset2時間按鍵就觸發一次,

而且uictntysynset2不斷減小,鳴叫節奏就越快

*/if(uisynctntycnt2>uictntysynset2)

}void t0_time() interrupt 1

else

th0=0xf8;

tl0=0x2f;

tr0=1;

}void delay_long(unsigned int uidelaylong)

void initial_peripheral()

按住乙個獨立按鍵不鬆手的連續步進觸發

include reg52.h define const voice short 40 define const key time1 20 define const key time2 20 如何知道1秒鐘需要多少個定時中斷?其實前面程式已經說過了,在這再囉嗦一下。這裡需要先編寫一小段程式進行測試,...

pyqt實現乙個按住拖動有效果的按鈕

看到有些部落格上有這種樣式的好看背景彩蛋,因此自己打算用qt去實現一下。這個樣式的實現主要基於控制項的重繪。由於我的 過長,在此我只貼一下核心 def paintevent self,qevent global x,y print 重繪中 x,y 0,0 painter qpainter self ...

乙個按鍵程式的思考

2017.07.26 程式筆記 今天思考乙個關於按鍵的程式 結構體如下 if pc get key key ture 思考了一下,這個可以作為電堆按鍵檢測的乙個大體的框架,結合基本的按鍵處理程式,就可以實現功能if 0 io keyenter 如果有鍵按下了 else while 0 io keye...