找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

在線等,關(guān)于單片機(jī)密碼鎖*號(hào)顯示的一個(gè)問(wèn)題。

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
密碼鎖已經(jīng)編寫(xiě)號(hào),但有一個(gè)功能求助 我想實(shí)現(xiàn)這么一個(gè)功能:就是輸入密碼全是 * ,然后如果一直按下仿真中那個(gè)按鈕A,所有*號(hào)顯示成相應(yīng)的數(shù)字,這個(gè)功能一直沒(méi)實(shí)現(xiàn),求助應(yīng)該如何c寫(xiě)程序?
以下是我的仿真附件和代碼,望能幫忙說(shuō)一下如何修改?
項(xiàng)目設(shè)計(jì)-密碼鎖.zip (1.36 MB, 下載次數(shù): 8)





#include <REG52.h>
#include<intrins.h>
sbit K1=P1^2;
sbit ALAM = P2^5;                                                                                                //報(bào)警        
sbit open_led=P2^3;                                                                                                //開(kāi)鎖指示燈        
/*LCD接口定義*/
sbit LcdRS   = P2^0;                                                                                      //lcd數(shù)據(jù)/命令選擇端  數(shù)據(jù)1命令0
sbit LcdRW   = P2^1;                                                                                      //lcd讀/寫(xiě)選擇端    讀1寫(xiě)0
sbit LcdEn   = P2^2;                                                                                      //lcd使能控制端  1有效
sfr  LcdIO   = 0x80;                                                                                      //lcd數(shù)據(jù)接口 P0=0x80

unsigned char code a[]={0xFE,0xFD,0xFB,0xF7};                                         //控盤(pán)掃描控制表

unsigned char countt0,second;                                                                        //t0中斷計(jì)數(shù)器,秒計(jì)數(shù)器
unsigned char code start_line[]        = {"password:       "};
unsigned char code name[]                  = {"===Coded Lock==="};                     //顯示名稱                 
unsigned char code Error[]           = {"      error     "};                  //輸入錯(cuò)誤
unsigned char code codepass[]        = {"      pass      "};
unsigned char code LockOpen[]        = {"      open      "};                        //OPEN

char InputData[6];                                                                                                //輸入密碼暫存區(qū)
unsigned char CurrentPassword[6]={6,5,4,3,2,1};                                 //當(dāng)前密碼值
unsigned char N=0;                                                                                                //密碼輸入位數(shù)記數(shù)
unsigned char ErrorCont;                                                                                //錯(cuò)誤次數(shù)計(jì)數(shù)
unsigned char KEY_SCAN,NUM;

/****向LCD寫(xiě)入命令或數(shù)據(jù)部分****/
#define LCD_COMMAND         0         // 輸出指令
#define LCD_DATA            1         // 輸出數(shù)據(jù)
#define LCD_CLEAR_SCREEN    0x01      // 清屏指令
#define LCD_HOME            0x02      // 光標(biāo)返回原點(diǎn)指令

//=====================16us短延時(shí)==============================
void Delay_short(unsigned int n)
{
         unsigned int i;
         for(i=0;i<n;i++)     
         {;}
}
//=====================長(zhǎng)延時(shí)==============================
void Delay_long(unsigned char N)
{
        unsigned char i;
          unsigned int j;
           for(i=0;i<N;i++)
           {
                for(j=0;j<315;j++)  //一個(gè)循環(huán)16us,共5ms
              {;}
   }
}
//=====================5ms延時(shí)==============================
void Delay5Ms(void)
{
        unsigned int TempCyc = 5552;
        while(TempCyc--);
}
//===================400ms延時(shí)==============================
void Delay400Ms(void)
{
         unsigned char TempCycA = 5;
         unsigned int TempCycB;
         while(TempCycA--)
         {
                  TempCycB=7269;
                  while(TempCycB--);
         }
}

/*寫(xiě)LCD子程序                                          */
/*入口參數(shù):數(shù)據(jù)style=1 指令, style=0 input:寫(xiě)入的內(nèi)容*/

void LCD_Write(bit style, unsigned char input)  
{
    LcdRS=style;         //數(shù)據(jù)style=1  指令style=0
    LcdRW=0;             //寫(xiě)
    LcdIO=input;         //P0口輸出
    Delay_short(10);     //延時(shí)
    LcdEn=1;             //lcd使能
    Delay_short(10);     //延時(shí)
    LcdEn=0;             //停止
}

/****初始化LCD程序****/
void LCD_Initial()
{
    Delay_long(6);                                     //延遲5*6=30ms
    LCD_Write(LCD_COMMAND,0x38);                       //8位數(shù)據(jù)端口,2行顯示,5*7點(diǎn)陣
    LCD_Write(LCD_COMMAND,0x38);
    LCD_Write(LCD_COMMAND,0x38);                       //發(fā)送三遍
    Delay_short(2);                                    //延遲大于39us
    LCD_Write(LCD_COMMAND,0x0c);                            //顯示模式設(shè)置:開(kāi)啟顯示, 無(wú)光標(biāo) 0x0c
    Delay_short(2);                             //延遲大于39us
    LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);           //清屏                          0x01
    Delay_short(100);                           //延遲大于1.53ms
    LCD_Write(LCD_COMMAND,0x06);                               //輸入模式設(shè)置:AC遞增, 畫(huà)面不動(dòng) 0x06
}


/*液晶字符輸入的位置定位程序*/
/*入口參數(shù):x范圍:0-15     y范圍:1,2*/
void GotoXY(unsigned char x, unsigned char y)  
{
    unsigned char address;
    if(y==1)
        {
        address=0x80+x;         //y=1顯示在第一行
    }
        else
        {
        address=0xc0+x;      //y=2顯示在第二行
    }
        LCD_Write(LCD_COMMAND, address);
}

/*將字符串輸出到液晶顯示函數(shù)*/
/*入口參數(shù):字符串指針      */
void Print(unsigned char *str)
{
    while(*str!='\0')
    {
        LCD_Write(LCD_DATA,*str);
        str++;
    }
}
//*********************************************************************
//==============將按鍵值編碼為數(shù)值=========================
unsigned char coding(unsigned char m)         
{
        unsigned char k;
        switch(m)
        {
//                case (0x18): k=3;break;
//                case (0x28): k=7;break;
//                case (0x48): k='#';break;
//                case (0x88): k='D';break;
                case (0x14): k=3;break;
                case (0x24): k=6;break;
                case (0x44): k=9;break;
                case (0x84): k='#';break;
                case (0x12): k=2;break;
                case (0x22): k=5;break;
                case (0x42): k=8;break;
                case (0x82): k=0;break;
                case (0x11): k=1;break;
                case (0x21): k=4;break;
                case (0x41): k=7;break;
                case (0x81): k='*';break;
        }
        return(k);
}
//=====================按鍵檢測(cè)并返回按鍵值===============================
unsigned char keynum(void)
{
         unsigned char row,col,i;
         P3=0xf0;
         if((P3&0xf0)!=0xf0)
         {
                   Delay5Ms();
              Delay5Ms();
                   if((P3&0xf0)!=0xf0)
                {
                    row=P3^0xf0;          //確定行線
                        i=0;
                        P3=a;                  //精確定位
                        while(i<4)
                        {
                                 if((P3&0xf0)!=0xf0)
                                  {
                                           col=~(P3&0xff);          //確定列線
                                           break;            //已定位后提前退出   
                                  }
                                else
                                  {
                                           i++;
                                           P3=a;
                                  }
                        }
                }
                else
                {                 
                        return 0xff;        
                }
                while((P3&0xf0)!=0xf0);
                return (row|col);                         //行線與列線組合后返回
         }
         else
        {
                return 0xff;                                 //無(wú)鍵按下時(shí)返回0xff
        }
}
//***************************************************************************************/
//=======================一聲提示音,表示有效輸入========================
void OneAlam(void)
{
        unsigned char y;
        for(y=0;y<30;y++)
        {
        ALAM=0;
        Delay_short(50);
          ALAM=1;
        Delay_short(50);
        }

}

//========================二聲提示音,表示操作成功========================
void TwoAlam(void)
{
        OneAlam();
        Delay5Ms();
    ALAM=1;
          Delay5Ms();
        OneAlam();
        Delay5Ms();
    ALAM=1;
}
//========================三聲提示音,表示錯(cuò)誤========================
void ThreeAlam(void)
{
        OneAlam();
        Delay5Ms();
    ALAM=1;
        Delay5Ms();
        OneAlam();
        Delay5Ms();
    ALAM=1;
          Delay5Ms();
        OneAlam();
        Delay5Ms();
    ALAM=1;
}
//=======================輸入密碼錯(cuò)誤超過(guò)三過(guò),報(bào)警并鎖死鍵盤(pán)======================
void Alam_KeyUnable(void)
{
        P3=0x00;
        {
                OneAlam();
                Delay5Ms();
            ALAM=1;
                Delay5Ms();
        }
}
//=======================取消所有操作============================================
void Cancel(void)
{        
        unsigned char i;
        GotoXY(0,2);
        Print(start_line);        
        TwoAlam();                                //提示音
        for(i=0;i<6;i++)
        {
                InputData=0;
        }
        ALAM=1;                                        //報(bào)警關(guān)
        ErrorCont=0;                        //密碼錯(cuò)誤輸入次數(shù)清零
        open_led=1;                                  //指示燈關(guān)閉
        N=0;                                        //輸入位數(shù)計(jì)數(shù)器清零
}
//==========================確認(rèn)鍵,并通過(guò)相應(yīng)標(biāo)志位執(zhí)行相應(yīng)功能===============================
void Ensure(void)
{        
        unsigned char i,j;
        for(i=0;i<6;)
        {                                       
                if(CurrentPassword==InputData)
                {
                        i++;
                }
                else
                {                        
                        ErrorCont++;
                        if(ErrorCont==3)                        //錯(cuò)誤輸入計(jì)數(shù)達(dá)三次時(shí),報(bào)警并鎖定鍵盤(pán)
                        {
                                GotoXY(0,2);
                                Print("  KeypadLocked! ");
                                TR0=1;
                                do
                                    Alam_KeyUnable();
                                while(TR0);
                return ;
                        }
            break;
                }
        }

        if(i==6)   //密碼正確輸入
        {
                        GotoXY(0,2);
                        Print(codepass);
                        Delay400Ms();
                        Delay400Ms();
                        GotoXY(0,2);
                        Print(LockOpen);        
                        TwoAlam();                                           //操作成功提示音
                        //KEY_CLOCK=0;                                                                                        //開(kāi)鎖
                        //pass=1;                                                                                        //置正確標(biāo)志位
                        open_led=0;                                                                                //開(kāi)鎖指示燈亮
                        for(j=0;j<6;j++)                                                                //將輸入清除
                        {
                                InputData=0;
                        }
                        while(1);
        }
        else
        {
        GotoXY(0,2);
                Print(Error);        
                 ThreeAlam();                                                                                //錯(cuò)誤提示音
        Delay400Ms();
        GotoXY(0,2);
                Print(start_line);
        for(j=0;j<6;j++)                                                                //將輸入清除
                {
                        InputData=0;
                 }
    }
        N=0;                                                                                                        //將輸入數(shù)據(jù)計(jì)數(shù)器清零,為下一次輸入作準(zhǔn)備
}

void test_led()
{
        while(1)
        {
                open_led=0;
                Delay400Ms();
                open_led=1;
                Delay400Ms();
        }
}

void test_alarm()
{
    while(1)
        {
                ALAM=1;
                Delay_short(60);
                ALAM=0;
                Delay_short(60);
        }
}
void timer_init()
{
        TMOD=0x11;
         TL0=0xB0;
         TH0=0x3C;
         EA=1;
         ET0=1;        
         TR0=0;
}

void test_key()
{
        unsigned char code ascii[]={"0123456789ABCDEF"};
        KEY_SCAN=keynum();
        if(KEY_SCAN!=0xff)
        {
                GotoXY(0,1);
                Print("key_code:0x");
                LCD_Write(LCD_DATA, ascii[KEY_SCAN/16]);
                LCD_Write(LCD_DATA, ascii[KEY_SCAN%16]);
        }
}

//==============================主函數(shù)===============================
void main(void)
{

        unsigned char j;
//        test_led();
//        test_alarm();
         Delay400Ms();         //啟動(dòng)等待,等LCM講入工作狀態(tài)
         LCD_Initial();         //LCD初始化

//        while(1)
//        {
//                test_key();
//        }

        GotoXY(0,1);//日歷顯示固定符號(hào)從第一行第0個(gè)位置之后開(kāi)始顯示
        Print(name);//向液晶屏寫(xiě)日歷顯示的固定符號(hào)部分
        GotoXY(0,2);//時(shí)間顯示固定符號(hào)寫(xiě)入位置,從第2個(gè)位置后開(kāi)始顯示
        Print(start_line);//寫(xiě)顯示時(shí)間固定符號(hào),兩個(gè)冒號(hào)
        GotoXY(9,2);        //設(shè)置光標(biāo)位置
        LCD_Write(LCD_COMMAND,0x0f);        //設(shè)置光標(biāo)為閃爍

//        while(1);

         P3=0xFF;
        timer_init();



         Delay5Ms(); //延時(shí)片刻(可不要)
        N=0;                                                                                                                //初始化數(shù)據(jù)輸入位數(shù)
         while(1)
         {
        if (!TR0)
                {
                    KEY_SCAN=keynum();
                }
        else
                {
            KEY_SCAN = 0xff;
        }

                if(KEY_SCAN!=0xff)
                {                                   
                                        NUM=coding(KEY_SCAN);
                                        switch(NUM)
                                        {
                                                case 'A':         ;                                         break;
                                                case 'B':        ;                                     break;
                                                case 'C':         ;                                         break;
                                                case 'D':         ;                                        break;   
                                                case '*': Cancel();                                break;      //取消當(dāng)前輸入
                                                case '#': Ensure();                         break;           //確認(rèn)鍵,
                                                default:
                                                {        
                                                        if(N<6)                                                           //當(dāng)輸入的密碼少于6位時(shí),接受輸入并保存,大于6位時(shí)則無(wú)效。
                                                        {                          unsigned        char temp;
                                                                OneAlam();                                                                //按鍵提示音                                                


                                                                                 for(j=N;j<=N;j++)
                                                                {
                                                                        GotoXY(9+j,2);
                                                                        LCD_Write(LCD_DATA,'*');
                                                                }
                                                                                                   if(K1==0)
                                                                                                   {
                                                                                                   GotoXY(9+N,2);
                                                                        temp=NUM+0x30           ;
                                                                        LCD_Write(LCD_DATA,temp);

                                                                }
                                                                InputData[N]=NUM;                                                                  
                                                                N++;
                                                        }
                                                        else                                                                                //輸入數(shù)據(jù)位數(shù)大于6后,忽略輸入
                                                        {
                                                                N=6;

                                                        }
                            break;
                                                }
                                        }
                        }
        }
}

//*********************************中斷服務(wù)函數(shù)**************************************
void  time0_int(void) interrupt 1
{
         TL0=0xB0;
         TH0=0x3C;
         countt0++;
          if(countt0==20)
           {
                countt0=0;
                second++;
                if(second==10)
                {
                                P3=0xf0;
                                TL0=0xB0;
                                 TH0=0x3C;
                                second=0;
                                ErrorCont=0;                        //密碼錯(cuò)誤輸入次數(shù)清零
        GotoXY(0,2);
                                Print(start_line);
        TR0=0;                                //關(guān)定時(shí)器
                }

           }
}


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

使用道具 舉報(bào)

沙發(fā)
ID:321557 發(fā)表于 2018-5-3 20:21 | 只看該作者
硬件電路測(cè)試一下
回復(fù)

使用道具 舉報(bào)

板凳
ID:289777 發(fā)表于 2018-5-4 13:38 | 只看該作者
求解,有沒(méi)有人能幫忙看看如何改正
回復(fù)

使用道具 舉報(bào)

地板
ID:289777 發(fā)表于 2018-5-5 11:12 | 只看該作者
在線等
回復(fù)

使用道具 舉報(bào)

5#
ID:289777 發(fā)表于 2018-5-5 14:09 | 只看該作者
求助,在線等額
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表