久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 935|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

單片機DTMF密碼鎖程序問題請教大佬

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:76027 發(fā)表于 2024-8-31 07:55 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
前段時間根據(jù)論壇大佬們的帖子,改了一個無線的DTMF密碼鎖。在輸入密碼時要關(guān)閉語音轉(zhuǎn)發(fā),沒有按鍵輸入時打開語音轉(zhuǎn)發(fā)。現(xiàn)在情況是輸入密碼大于4位正常,但小于4位,語音轉(zhuǎn)發(fā)一直關(guān)閉。下面是代碼,麻煩大佬們幫忙看看,如何改。

單片機源程序如下:
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(yi);                                                                                        //日歷顯示固定符號從第一行第0個位置之后開始顯示
        for(i=0;i<16;i++)
        {
                LCD_WriteData(name[ i]);                                                           //向液晶屏寫開機畫面
        }
        LCD_WriteCommand(er);
        for(i=0;i<16;i++)
        {
                LCD_WriteData(start_line[ i]);                            //寫輸入密碼等待界面
        }
        LCD_WriteCommand(er+9);                                                            //設(shè)置光標(biāo)位置
        LCD_WriteCommand(0x0f);                                                     //設(shè)置光標(biāo)為閃爍
        Delay_ms(5);                                                                                                   //延時片刻(可不要)
        N=0;                                                                                                                                    //初始化數(shù)據(jù)輸入位數(shù)
        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'):ResetPassword();          break;   //重新設(shè)置密碼
                         case ('*'):Cancel();                 break;   //取消當(dāng)前輸入
                         case ('#'):Ensure();                 break;   //確認(rèn)鍵
                         default:                                              //如果不是功能鍵按下時,就是數(shù)字鍵按下
                                {
                                 if(N<4)                                                   //當(dāng)輸入密碼少于4位時,接受輸入并保存,大于4位時則無效
                                 {
                                   AudioOff=0;                //在有按鍵輸入時,關(guān)閉發(fā)射機音頻輸入                                                                                                                        
                                   LCD_WriteCommand(er);
                                                                for(i=0;i<16;i++)
                                                                {
                                                                        LCD_WriteData(Input[i ]);                                                           //顯示輸入畫面
                                                                }
                                                                for(j=0;j<=N;j++)
                                                                {
                                                                        LCD_WriteCommand(er+4+j);                                                           //顯示位數(shù)隨輸入增加而增加
                                                                        LCD_WriteData('*');                                                     //但不顯示實際數(shù)字,用*代替
                                                                }
                                                                InputData[N]=NUM;                                   //將數(shù)字鍵的碼賦值給InputData【】數(shù)組暫存
                                                                N++;                                                                                                                                                   //密碼位數(shù)加
                                                               
                                                        }
                                                        else                                                   //輸入數(shù)據(jù)位數(shù)大于4后,忽略輸入
                                                        {
                                                               
                                                                AudioOff=1;                                //發(fā)射機音頻輸入打開
                                                                N=4;                                     //密碼輸入大于4位時,不接受輸入
                                                                break;
                                                        }
                                                }
                                        }
                                }
                        }

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:404160 發(fā)表于 2024-9-2 13:35 | 只看該作者
代碼中的問題在于,當(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ā)是打開的。
回復(fù)

使用道具 舉報

板凳
ID:76027 發(fā)表于 2024-9-3 08:05 | 只看該作者
飛云居士 發(fā)表于 2024-9-2 13:35
代碼中的問題在于,當(dāng)輸入的密碼少于4位時,AudioOff 被設(shè)置為 0(關(guān)閉語音轉(zhuǎn)發(fā)),但是沒有在輸入結(jié)束后將 ...

感謝大佬的回復(fù)。我現(xiàn)在的代碼也是按“#”號確認(rèn)或大于4個數(shù),語音轉(zhuǎn)發(fā)開啟。這個轉(zhuǎn)發(fā)器是給很多人共用的,自己操作按現(xiàn)在的代碼來說是沒有問題的。但怕?lián)v亂的人只按一個鍵后不再按了,語音關(guān)閉就無法恢復(fù),如果一直按,那也是沒有問題的。
回復(fù)

使用道具 舉報

地板
ID:404160 發(fā)表于 2024-9-3 09:51 | 只看該作者
bd5fna 發(fā)表于 2024-9-3 08:05
感謝大佬的回復(fù)。我現(xiàn)在的代碼也是按“#”號確認(rèn)或大于4個數(shù),語音轉(zhuǎn)發(fā)開啟。這個轉(zhuǎn)發(fā)器是給很多人共用的 ...

你這是要求程序如何“強壯”。只有多加監(jiān)測代碼
回復(fù)

使用道具 舉報

5#
ID:277531 發(fā)表于 2024-9-3 10:33 | 只看該作者
你這是要求程序如何“強壯”。只有多加監(jiān)測代碼===回答的挺好!
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久久久久久久久久久亚洲 | 黑人性hd| 久久久性色精品国产免费观看 | 欧美日韩国产精品一区 | 国产农村一级片 | 欧美日韩不卡合集视频 | 精品一区二区三区在线观看国产 | 久久99精品久久久 | 国产福利在线 | 男人天堂社区 | 久久久蜜桃一区二区人 | 91伊人| 久久久久久久国产 | www.v888av.com| 欧美一级欧美一级在线播放 | 亚洲一区 中文字幕 | 亚洲精品视频二区 | www.国产精 | 一级黄色片免费在线观看 | 毛片毛片毛片毛片毛片 | 久久久青草婷婷精品综合日韩 | 久草成人网 | 国产精品成人69xxx免费视频 | 亚洲高清在线 | 日本高清视频网站 | 久久综合香蕉 | 久久久欧洲 | 观看av| 欧美一区免费 | 亚洲欧美日韩精品久久亚洲区 | av天天干 | 一级在线视频 | 91精品国产手机 | 日干夜干| 日韩欧美国产精品一区二区三区 | 毛片一级黄色 | 久色网 | 亚洲一区二区三区免费观看 | 欧美一区免费 | 国产资源在线观看 | 国产乱码精品一区二区三区五月婷 |