以下為實現該功能的思路、電路原理及控制程序:
### 思路分析
1. **按鍵檢測**:對三個非自鎖按鍵K1、K2、K3的狀態進行實時檢測。
2. **狀態控制**:
- 按下K1:開啟循環顯示數字0 - 12的功能,每個數字顯示0.5秒。
- 按下K2:暫停數字的顯示。
- 按下K3:將顯示的數字清零。
3. **顯示控制**:依據當前的狀態,控制七段數碼管或者LCD1602顯示對應的數字。
### 電路原理
#### 七段數碼管顯示電路
- **數碼管**:采用共陰極或者共陽極的七段數碼管。
- **驅動電路**:借助三極管或者專用的數碼管驅動芯片(如74HC595)來驅動數碼管。
- **按鍵電路**:把三個按鍵K1、K2、K3分別連接到單片機的三個GPIO引腳,并且通過上拉或者下拉電阻來保證按鍵狀態的穩定。
#### LCD1602顯示電路
- **LCD1602模塊**:將其連接到單片機的GPIO引腳,包含數據引腳和控制引腳(如RS、RW、E)。
- **按鍵電路**:和七段數碼管的按鍵電路一樣。
### 控制程序(以Arduino為例,使用LCD1602顯示)
### 代碼解釋
1. **庫的引入**:引入`LiquidCrystal`庫以控制LCD1602顯示。
2. **變量定義**:對LCD引腳、按鍵引腳、狀態變量以及時間間隔進行定義。
3. **`setup`函數**:對LCD和按鍵引腳進行初始化。
4. **`loop`函數**:實時檢測按鍵狀態,在運行且未暫停的狀態下,每0.5秒更新一次顯示。
5. **`checkButtons`函數**:檢測三個按鍵的狀態,并且根據按鍵狀態更新相應的狀態變量。
6. **`updateDisplay`函數**:清空LCD顯示,顯示當前數字,然后將數字加1并對13取模,實現循環顯示。
- #include <LiquidCrystal.h>
- // 定義LCD引腳
- LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
- // 定義按鍵引腳
- const int K1 = 6;
- const int K2 = 7;
- const int K3 = 8;
- // 定義狀態變量
- bool isRunning = false;
- bool isPaused = false;
- int currentNumber = 0;
- // 定義時間間隔
- const unsigned long interval = 500;
- unsigned long previousMillis = 0;
- void setup() {
- // 初始化LCD
- lcd.begin(16, 2);
- lcd.print("Press K1 to start");
- // 初始化按鍵引腳為輸入模式
- pinMode(K1, INPUT_PULLUP);
- pinMode(K2, INPUT_PULLUP);
- pinMode(K3, INPUT_PULLUP);
- }
- void loop() {
- // 檢測按鍵狀態
- checkButtons();
- if (isRunning && !isPaused) {
- unsigned long currentMillis = millis();
- if (currentMillis - previousMillis >= interval) {
- previousMillis = currentMillis;
- // 更新顯示數字
- updateDisplay();
- }
- }
- }
- void checkButtons() {
- if (digitalRead(K1) == LOW) {
- delay(20); // 消抖
- if (digitalRead(K1) == LOW) {
- isRunning = true;
- isPaused = false;
- while (digitalRead(K1) == LOW); // 等待按鍵釋放
- }
- }
- if (digitalRead(K2) == LOW) {
- delay(20); // 消抖
- if (digitalRead(K2) == LOW) {
- isPaused = !isPaused;
- while (digitalRead(K2) == LOW); // 等待按鍵釋放
- }
- }
- if (digitalRead(K3) == LOW) {
- delay(20); // 消抖
- if (digitalRead(K3) == LOW) {
- isRunning = false;
- isPaused = false;
- currentNumber = 0;
- updateDisplay();
- while (digitalRead(K3) == LOW); // 等待按鍵釋放
- }
- }
- }
- void updateDisplay() {
- lcd.clear();
- lcd.print(currentNumber);
- currentNumber = (currentNumber + 1) % 13;
- }
-
復制代碼
你可以依據實際需求對代碼進行修改和優化。 |