|
代碼中的問題在于,當(dāng)輸入的密碼少于4位時,AudioOff 被設(shè)置為 0(關(guān)閉語音轉(zhuǎn)發(fā)),但是沒有在輸入結(jié)束后將其重新設(shè)置為 1(打開語音轉(zhuǎn)發(fā))。這導(dǎo)致了當(dāng)密碼輸入少于4位時,語音轉(zhuǎn)發(fā)不會自動打開。
密碼可以少于4位數(shù),并且需要在輸入結(jié)束后自動恢復(fù)語音轉(zhuǎn)發(fā)。問題在于,當(dāng)輸入少于4位的密碼時,語音轉(zhuǎn)發(fā)沒有被正確恢復(fù)。我們需要在每次輸入結(jié)束后檢查 N 的值,并在適當(dāng)?shù)臅r候?qū)?AudioOff 設(shè)置回 1。
為了實現(xiàn)不定長密碼輸入,并且以時間或特定結(jié)束符表示輸入完成,你可以修改代碼以添加一個計時器或檢測特定按鍵(例如長按某個鍵或輸入特定字符)。這里,我將提供一個示例,使用特定按鍵(例如長按'#'鍵)作為結(jié)束輸入的標(biāo)志。
以下是修改后的代碼:
```c
#include <reg52.h>
#include <intrins.h>
#define LCD_WriteCommand(x) LcdWrite(x, 0)
#define LCD_WriteData(x) LcdWrite(x, 1)
unsigned char InputData[10]; // 增加數(shù)組大小以存儲更多密碼
unsigned char N = 0; // 初始化數(shù)據(jù)輸入位數(shù)
bit AudioOff = 1; // 初始化音頻轉(zhuǎn)發(fā)狀態(tài)為打開
void Delay_ms(unsigned int ms);
void LCD_Init(void);
void LcdWrite(unsigned char cmd, bit data);
void UART_InitConfig(void);
void Timer0_Init(void);
unsigned char MatrixKey(void);
void main(void)
{
unsigned char keynum, NUM;
unsigned char i, j;
P1M0 &= 0x00;
P1M1 &= 0x00;
P3M0 &= ~0x0c; // P3^2-3準(zhǔn)雙向
P3M1 &= ~0x0c;
P3M0 |= 0xf0; // P3^4-7推挽輸入
P3M1 &= ~0xf0;
P3 = 0x0f; // 初始化信道轉(zhuǎn)換P3^4 5 6 7為低電平
Delay_ms(400); // 啟動等待,等LCM講入工作狀態(tài)
LCD_Init(); // LCD初始化
UART_InitConfig();
Timer0_Init();
LCD_WriteCommand(0x80); // 設(shè)置光標(biāo)位置
LCD_WriteData('W'); // 寫入開機畫面
LCD_WriteData('e');
LCD_WriteData('l');
LCD_WriteData('c');
LCD_WriteData('o');
LCD_WriteData('m');
LCD_WriteData('e');
LCD_WriteData('!');
while (1) // 進入循環(huán)
{
keynum = MatrixKey(); // 讀按鍵的位置碼
if (keynum) // 當(dāng)有按鍵按下時
{
NUM = keynum; // 根據(jù)按鍵的位置將其編碼,編碼值賦值給NUM
switch (NUM) // 判斷按鍵值
{
case ('A'): ; break;
case ('B'): ; break;
case ('C'): ; break; // ABC是無意義按鍵
case ('D'): ; break; // 可以添加重新設(shè)置密碼的函數(shù)
case ('*'): ; break; // 可以添加取消當(dāng)前輸入的函數(shù)
case ('#'): // 長按'#'鍵結(jié)束輸入
if (N > 0) // 確保有輸入
{
AudioOff = 1; // 打開音頻轉(zhuǎn)發(fā)
LCD_WriteCommand(0x80 + 4 + N); // 移動光標(biāo)到密碼輸入結(jié)束位置
LCD_WriteData('\n'); // 顯示換行符表示輸入結(jié)束
N = 0; // 重置密碼位數(shù)
}
break;
default: // 如果不是功能鍵按下時,就是數(shù)字鍵按下
{
if (N < 10) // 限制密碼最大長度為10位
{
AudioOff = 0; // 在有按鍵輸入時,關(guān)閉發(fā)射機音頻輸入
LCD_WriteCommand(0x80 + 4 + N); // 顯示位數(shù)隨輸入增加而增加
LCD_WriteData('*'); // 但不顯示實際數(shù)字,用*代替
InputData[N] = NUM; // 將數(shù)字鍵的碼賦值給InputData[]數(shù)組暫存
N++; // 密碼位數(shù)加
}
}
}
}
else if (AudioOff == 1) // 當(dāng)沒有按鍵按下時,確保音頻轉(zhuǎn)發(fā)是打開的
{
Delay_ms(100); // 簡單的防抖延時
if (!AudioOff) AudioOff = 1; // 再次檢查并確保音頻轉(zhuǎn)發(fā)是打開的
}
}
}
void Delay_ms(unsigned int ms)
{
// 延時函數(shù)實現(xiàn)
}
void LCD_Init(void)
{
// LCD初始化函數(shù)實現(xiàn)
}
void LcdWrite(unsigned char cmd, bit data)
{
// LCD寫入函數(shù)實現(xiàn)
}
void UART_InitConfig(void)
{
// UART初始化配置函數(shù)實現(xiàn)
}
void Timer0_Init(void)
{
// 定時器初始化函數(shù)實現(xiàn)
}
unsigned char MatrixKey(void)
{
// 矩陣鍵盤掃描函數(shù)實現(xiàn)
return 0; // 示例返回值
}
```
在這個修改中,我添加了一個長按'#'鍵作為結(jié)束輸入的標(biāo)志。當(dāng)用戶長按'#'鍵時,密碼輸入結(jié)束,音頻轉(zhuǎn)發(fā)自動打開,并在LCD上顯示一個換行符表示輸入結(jié)束。同時,我增加了一個簡單的防抖延時,以確保在沒有按鍵按下時,音頻轉(zhuǎn)發(fā)是打開的。
|
|