按鍵演算法
❶ 單片機怎樣識別按鍵是單機,雙擊還是長按,演算法應該是怎樣
按鍵的處理進行時間判斷.在一定的時間內如果按下按鍵,當時間小於這個時間,那麼為單次按鍵,當時間超過一定時間為為長按,當兩次按的中間有高電平時,為雙擊.你可以參考參考.
❷ 嵌入式編程 求一個四個按鍵實現10種功能的演算法,只要思路,不要程序。滿意加分!
【1】輕觸A、B、C或D,取反輸出控制。
【2】長按A、B、C或D,進入時間編程。此後,A(add)加時間,D(Decrease)減時間。
編程時,需判斷按鍵的時間。當未達到規定時間時(如3秒),按【1】執行。
否則,執行【2】。退出時間設定,按B或C(Cancel)任意鍵。
另外,進入【2】模式下,需考慮用戶誤操作,等待2秒內無操作,立即恢復,忽略此次控制或配置。
❸ 按鍵精靈坐標演算法問題
Dim x1, y1//假設(x1,y1)是前台坐標
Rect = Plugin.Window.GetClientRect(Hwnd)
MyArray = Split(Rect, "|")
x2 = Clng(MyArray(0))
y2 = Clng(MyArray(1))//(x2,y2)是游戲窗口客戶區左上角的坐標
x = x1 - x2
y = y1 - y2//(x,y)就是樓主所需的後台坐標
❹ 按鍵精靈快速排序(比冒泡更快更有效率的演算法)是怎麼樣的
冒泡排序為O(N^2),在排序過程中其實是效率較低的。在掃拍賣或者其他需要比拼速度的時候,時間就是金錢~越快越能搶佔先機。
今天我們介紹另一種更快更有效率的排序——快速排序,時間復雜度為O(n*logn)。
快速排序的演算法思想
快速排序採用了一種分治的策略,通常稱其為分治法(Divide-and-ConquerMethod)。
該方法的基本思想是:
1.先從數列中取出一個數作為基準數。(不要被這個名詞嚇到了,就是一個用來參照的數,待會你就知道它用來做啥的了)。
2.分區過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。
3 . 再對左右區間重復第二步,直到各區間只有一個數。
白話講解演算法:
假設我們現在對「6 1 2 7 9 3 4 5 10 8」這個10個數進行排序。就讓第一個數6作為基準數吧。接下來,需要將這個序列中所有比基準數大的數放在6的右邊,比基準數小的數放在6的左邊。
方法其實很簡單:分別從初始序列「6 1 2 7 9 3 4 5 10 8」兩端開始「探測」。先從右往左找一個小於6的數,再從左往右找一個大於6的數,然後交換他們。這里可以用兩個變數i和j,分別指向序列最左邊和最右邊。我們為這兩個變數起個好聽的名字「哨兵i」和「哨兵j」。剛開始的時候讓哨兵i指向序列的最左邊(即i=1),指向數字6。讓哨兵j指向序列的最右邊(即=10),指向數字。
2014-8-29 13:45 上傳
下載附件 (9.51 KB)
首先哨兵j開始出動。因為此處設置的基準數是最左邊的數,所以需要讓哨兵j先出動,這一點非常重要(請自己想一想為什麼)。哨兵j一步一步地向左挪動(即j--),直到找到一個小於6的數停下來。接下來哨兵i再一步一步向右挪動(即i++),直到找到一個數大於6的數停下來。最後哨兵j停在了數字5面前,哨兵i停在了數字7面前。
2014-8-29 13:45 上傳
下載附件 (9.74 KB)
2014-8-29 13:45 上傳
下載附件 (8.13 KB)
現在交換哨兵i和哨兵j所指向的元素的值。交換之後的序列如下:
6 1 2 5 9 3 4 7 10 8
2014-8-29 13:45 上傳
下載附件 (9.74 KB)
2014-8-29 13:45 上傳
下載附件 (8.37 KB)
到此,第一次交換結束。接下來開始哨兵j繼續向左挪動(再友情提醒,每次必須是哨兵j先出發)。他發現了4(比基準數6要小,滿足要求)之後停了下來。哨兵i也繼續向右挪動的,他發現了9(比基準數6要大,滿足要求)之後停了下來。此時再次進行交換,交換之後的序列如下:
6 1 2 5 4 3 9 7 10 8
第二次交換結束,「探測」繼續。哨兵j繼續向左挪動,他發現了3(比基準數6要小,滿足要求)之後又停了下來。哨兵i繼續向右移動,糟啦!此時哨兵i和哨兵j相遇了,哨兵i和哨兵j都走到3面前。說明此時「探測」結束。我們將基準數6和3進行交換。交換之後的序列如下:
3 1 2 5 4 6 9 7 10 8
2014-8-29 13:45 上傳
下載附件 (8.28 KB)
2014-8-29 13:45 上傳
下載附件 (10.45 KB)
2014-8-29 13:45 上傳
下載附件 (8.48 KB)
到此第一輪「探測」真正結束。此時以基準數6為分界點,6左邊的數都小於等於6,6右邊的數都大於等於6。回顧一下剛才的過程,其實哨兵j的使命就是要找小於基準數的數,而哨兵i的使命就是要找大於基準數的數,直到i和j碰頭為止。
OK,解釋完畢。現在基準數6已經歸位,它正好處在序列的第6位。
3
1
2
5
4
6
9
7
10
8
此時我們已經將原來的序列,以6為分界點拆分成了兩個序列,左邊的序列是「3 1 2 5 4」,右邊的序列是「9 7 10 8」。接下來還需要分別處理這兩個序列。因為6左邊和右邊的序列目前都還是很混亂的。不過不要緊,我們已經掌握了方法,接下來只要模擬剛才的方法分別處理6左邊和右邊的序列即可。現在先來處理6左邊的序列現吧。
左邊的序列是「3 1 2 5 4」。請將這個序列以3為基準數進行調整,使得3左邊的數都小於等於3,3右邊的數都大於等於3。
3
1
2
5
4
第一次交換完:以3為分界點,拆分了兩個序列。左邊都比3小,右邊都比3大。
2
1
3
5
4
再分別處理3左右的兩個序列「2 1」和「5 4」
1
2
3
4
5
這樣,最初我們劃分的6左側的序列都已經處理好了~~我們再來處理6右側的序列
9
7
10
8
以9為基準數,第一次交換完:
9
7
8
10
第二次交換:
8
7
9
10
再交換一次:
7
8
9
10
這樣,我們整個序列就排序完畢了
1
2
3
4
5
6
7
8
9
10
快排演算法代碼實現:
su = "6|1|2|7|9|3|4|5|10|8"
su=Split(su, "|")
L = UBound(su)
Call ks(0, L)
Function ks(L, B)
If L > B Then
Exit Function
End If //判斷數組上標下標是否超出范圍
i = L
j = B
key =int( su(L) ) //數組第一位提取作為基數
While j>i
While int ( su(j)) >= key and j > i //要先從最右邊開始找 找到第一個小於key的數 這里添加的j>i的判斷是為了防止j的值不斷遞減導致下標越界
j = j - 1
Wend
While int (su(i)) <= key and j > i //從最左邊開始找 找到第一個大於key的數 (這里的字元串數組需要轉換為數值型)
i = i + 1
Wend
If j>i then // 將和基數key對比得到的兩個數對換 將大於key的值往右邊放 小於key的值往左邊放
T = su(i)
su(i) = su(j)
su(j) = T
End If
Wend // 這個 While 循環當i=j 第一輪比較完退出
su(L) = su(i) // 重新設置數組第一個元素為基數
su(i) = key// 基數歸位 (排完一輪之後 左邊的數<基數<右邊的數 那麼基數就到了排序中它該在的位置。)
Call ks(L, i - 1)//繼續處理左邊的數
Call ks(i + 1, B)//繼續處理右邊的數
End Function
For i = 0 To UBound(su)
TracePrint su(i)
Next
❺ 單片機按鍵消抖無延時的演算法
無延時,只是噱頭。
隔一段時間,執行一次void Keyscan(void),
間隔的時間,也相當於延時了。
而且,這樣的方法,是按照固定的時間,去掃描按鍵。
有些像是巡邏哨,有可能會錯過按鍵的時刻。
而輪流檢測按鍵的方法,掃描的,就比較勤。
❻ c語言鍵盤按鍵觸發怎麼表示
可以用FlexibleButton表示。
FlexibleButton 是一個基於標准 C 語言的小巧靈活的按鍵處理庫,支持單擊、連擊、短按、長按、自動消抖,可以自由設置組合按鍵,可用於中斷和低功耗場景。
該按鍵庫解耦了具體的按鍵硬體結構,理論上支持輕觸按鍵與自鎖按鍵,並可以無限擴展按鍵數量。另外,FlexibleButton 使用掃描的方式一次性讀取所有所有的按鍵狀態,然後通過事件回調機制上報按鍵事件。
核心的按鍵掃描代碼僅有三行,沒錯,就是經典的 三行按鍵掃描演算法。使用 C 語言標准庫 API 編寫,也使得該按鍵庫可以無縫兼容任意的處理器平台,並且支持任意 OS 和 non-OS(裸機編程)。
快速體驗:
FlexibleButton 庫中提供了一個測試常式 ./examples/demo_rtt_iotboard.c,該常式基於 RT-Thread OS 進行測試,硬體平台選擇了 RT-Thread IoT Board Pandora v2.51 開發板。
當然你可以選擇使用其他的 OS,或者使用裸機測試,只需要移除 OS 相關的特性即可。
如果你使用自己的硬體平台,只需要將 FlexibleButton 庫源碼和常式加入你既有的工程下即可。
DEMO 程序說明:
該示常式序可以直接在 RT-Thread stm32l475-atk-pandora BSP 中運行,可以在該 BSP 目錄下,使用 menuconfig 獲取本軟體包。
❼ 好心人給按鍵精靈的演算法
找了好久,按鍵精靈有專門的函數的:Eval<pre t="code" l="vb">str = ;1+2*3;
out = Eval(str)
MessageBox out ;7
希望我的回答對你有幫助