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