最近在研究和製做數字示波器,其中涉及一個小算法:須要將 ADC 採樣的數值在 TFT LCD 屏幕上面顯示而且用「線」鏈接起來。php
ADC 按照時序對輸入電壓採樣後,記錄的是一個個的數值,若是顯示的時候不用「線」鏈接它們,那麼他們看上去就是這樣的:前端
用直線鏈接之後,看上去就是這樣了(垃圾 LM324 運放的模擬前端,方波波形變形嚴重到使人髮指):算法
X 軸(時間軸)的放大比率肯定之後,ADC 採樣值的相鄰 2 點在屏幕上的間距也就肯定了,連線算法要作的事情,就是將位於這兩點間的直線上的 LCD 小點一個個點亮。數組
說實話,不是作數字示波器,我還真不太會用獲得這個算法。我也沒有查資料,直接就想到了「2分法」+ 遞歸來處理:app
算法是有了,可是,要到數字示波器上面直接調試,還挺麻煩的,由於要對記錄 ADC 採樣值的數組、LCD 屏幕顯存數組、LCD 驅動程序等等軟硬件相關的部分同時修改,而且還要硬件上調試才能看到結果。昨天硬件又不在手邊,也無法調試。因此,就想到了 Excel。Excel 那些格子(Cell)模擬 LCD 界面那是極方便的,之前幹過不少次了。函數
1: Sub cmdConnectPoints()
2: For c = 2 To 22
3: For r = 2 To 18
4: If Cells(r, c).Interior.Color = 5287936 Then
5: x1 = c
6: y1 = r
7: End If
8: If Cells(r, c).Interior.Color = RGB(255, 0, 0) Then
9: x2 = c
10: y2 = r
11: End If
12: Next
13: Next
14: Process x1, y1, x2, y2
15: End Sub
16:
17: Sub Process(x1, y1, x2, y2)
18: dx = Fix((x2 - x1) / 2)
19: dy = Fix((y2 - y1) / 2)
20: If dx = 0 And dy = 0 Then
21:
22: Else
23: nx = x1 + dx
24: If dx <= (x2 - nx) Then
25: ny = y1 + dy
26: Else
27: ny = y2 - dy
28: End If
29: Cells(ny, nx).Interior.Color = RGB(0, 0, 0)
30: Call Process(x1, y1, nx, ny)
31: Call Process(nx, ny, x2, y2)
32: End If
33: End Sub
34:
35: Sub cmdClear()
36: For c = 2 To 22
37: For r = 2 To 18
38: Cells(r, c).Interior.Color = RGB(255, 255, 255)
39: Next
40: Next
41: End Sub
上面的代碼中,有一段按照中點的 X 座標距離起點和終點的遠近來改變中點 Y 座標計算方法的代碼。若是中點 X 距離起點更近,那麼 nY = Y1 + dY;不然,nY = Y2 - dY。這樣的微調是爲了讓兩點間的連線看上去更加均直、美觀。若是去掉,那麼,繪製的連線會「扭」向起點那一邊,不美觀。工具
效果就是這樣的:spa
還有使用起來很是爽的操做視頻:3d
此次作的數字示波器比上一個版本複雜點兒,採樣率更高、控制也會更精細。因此,製做過程當中借用了上一個版本的成果(用工具來製做工具,與軟件開發也是相通的道理):調試