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