找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1875|回復: 1
打印 上一主題 下一主題
收起左側(cè)

修改密碼不好用 不知道哪里出問題了 實在找不到了 求大神指點

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:306099 發(fā)表于 2018-5-15 20:33 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

/**********程序在此**********雙手奉上********************/
//包含頭文件
  1. #include <REG51.h>
  2. #include<intrins.h>
  3. //宏定義
  4. #define LCM_Data  P0    //將P0口定義為LCM_Data
  5. #define uchar unsigned char
  6. #define uint  unsigned int
  7. //1602的控制腳
  8. sbit lcd1602_rs=P2^7;
  9. sbit lcd1602_rw=P2^6;
  10. sbit lcd1602_en=P2^5;
  11. sbit Scl=P3^4;   //24C02串行時鐘
  12. sbit Sda=P3^5;   //24C02串行數(shù)據(jù)
  13. sbit ALAM = P2^1;  //報警
  14. sbit KEY = P3^6;  //開鎖
  15. bit  pass=0;   //密碼正確標志
  16. bit  ReInputEn=0;  //重置輸入允許標志
  17. bit  s3_keydown=0;  //3秒按鍵標志位
  18. bit  key_disable=0;  //鎖定鍵盤標志
  19. unsigned char countt0,second; //t0中斷計數(shù)器,秒計數(shù)器
  20. void Delay5Ms(void);  //聲明延時函數(shù)
  21. unsigned char code a[]={0xFE,0xFD,0xFB,0xF7};     //控盤掃描控制表
  22. //液晶顯示數(shù)據(jù)數(shù)組
  23. unsigned char code start_line[] = {"password:       "};
  24. unsigned char code name[]    = {"===Coded Lock==="}; //顯示名稱
  25. unsigned char code Correct[]  = {"     correct    "};  //輸入正確
  26. unsigned char code Error[]    = {"      error     "};   //輸入錯誤
  27. unsigned char code codepass[] = {"      pass      "};
  28. unsigned char code LockOpen[] = {"      open      "};  //OPEN
  29. unsigned char code SetNew[]  = {"SetNewWordEnable"};
  30. unsigned char code Input[]    = {"input:          "};  //INPUT
  31. unsigned char code ResetOK[]  = {"ResetPasswordOK "};
  32. unsigned char code initword[] = {"Init password..."};
  33. unsigned char code Er_try[]  = {"error,try again!"};
  34. unsigned char code again[]  = {"input again     "};
  35. unsigned char InputData[6];         //輸入密碼暫存區(qū)
  36. unsigned char CurrentPassword[6]={1,3,1,4,2,0};    //管理員密碼(只可在程序中修改)
  37. unsigned char TempPassword[6];
  38. unsigned char N=0;    //密碼輸入位數(shù)記數(shù)
  39. unsigned char ErrorCont;   //錯誤次數(shù)計數(shù)
  40. unsigned char CorrectCont;   //正確輸入計數(shù)
  41. unsigned char ReInputCont;    //重新輸入計數(shù)
  42. unsigned char code initpassword[6]={0,0,0,0,0,0};   //輸入管理員密碼后將密碼初始為000000

  43. //=====================5ms延時==============================
  44. void Delay5Ms(void)
  45. {
  46. unsigned int TempCyc = 5552;
  47. while(TempCyc--);
  48. }
  49. //===================400ms延時==============================
  50. void Delay400Ms(void)
  51. {
  52. unsigned char TempCycA = 5;
  53. unsigned int TempCycB;
  54. while(TempCycA--)
  55. {
  56.   TempCycB=7269;
  57.   while(TempCycB--);
  58. }
  59. }
  60. //=============================================================================================
  61. //================================24C02========================================================
  62. //=============================================================================================
  63. void mDelay(uint t) //延時
  64. {
  65. uchar i;
  66.     while(t--)
  67.     {
  68.      for(i=0;i<125;i++)
  69.      {;}
  70.     }
  71. }
  72.    
  73. void Nop(void)    //空操作
  74. {
  75.   _nop_();    //僅作延時用一條語句大約1us
  76.   _nop_();
  77.   _nop_();
  78.   _nop_();
  79. }
  80. /*****24c02程序參照24c02時序圖*****/
  81. /*起始條件*/
  82. void Start(void)
  83. {
  84.   Sda=1;
  85.   Scl=1;
  86.   Nop();
  87.   Sda=0;
  88.   Nop();
  89. }

  90. /*停止條件*/
  91. void Stop(void)
  92. {
  93.   Sda=0;
  94.   Scl=1;
  95.   Nop();
  96.   Sda=1;
  97.   Nop();
  98. }
  99. /*應答位*/
  100. void Ack(void)
  101. {
  102. Sda=0;
  103. Nop();
  104. Scl=1;
  105. Nop();
  106. Scl=0;
  107. }
  108. /*反向應答位*/
  109. void NoAck(void)
  110. {
  111.   Sda=1;
  112.   Nop();
  113.   Scl=1;
  114.   Nop();
  115.   Scl=0;
  116. }
  117. /*發(fā)送數(shù)據(jù)子程序,Data為要求發(fā)送的數(shù)據(jù)*/
  118. void Send(uchar Data)
  119. {
  120.     uchar BitCounter=8;
  121.     uchar temp;
  122.     do
  123.     {
  124.      temp=Data;        //將待發(fā)送數(shù)據(jù)暫存temp
  125.      Scl=0;
  126.      Nop();
  127.      if((temp&0x80)==0x80)     //將讀到的數(shù)據(jù)&0x80
  128.      Sda=1;
  129.      else
  130.      Sda=0;
  131.      Scl=1;
  132.      temp=Data<<1;       //數(shù)據(jù)左移
  133.      Data=temp;        //數(shù)據(jù)左移后重新賦值Data
  134.      BitCounter--;       //該變量減到0時,數(shù)據(jù)也就傳送完成了
  135.     }
  136.     while(BitCounter);       //判斷是否傳送完成
  137.     Scl=0;
  138. }
  139. /*讀一字節(jié)的數(shù)據(jù),并返回該字節(jié)值*/
  140. uchar Read(void)
  141. {
  142.     uchar temp=0;
  143. uchar temp1=0;
  144. uchar BitCounter=8;
  145. Sda=1;
  146. do
  147. {
  148.   Scl=0;
  149.   Nop();
  150.   Scl=1;
  151.   Nop();
  152.   if(Sda)       //數(shù)據(jù)位是否為1
  153.    temp=temp|0x01;    //為1 temp的最低位為1(|0x01,就是將最低位變?yōu)?)
  154.   else       //如果為0
  155.    temp=temp&0xfe;    //temp最低位為0(&0xfe(11111110)最低位就是0)
  156.   if(BitCounter-1)    //BitCounter減1后是否為真
  157.   {
  158.    temp1=temp<<1;    //temp左移
  159.    temp=temp1;
  160.   }
  161.   BitCounter--;     //BitCounter減到0時,數(shù)據(jù)就接收完了
  162. }
  163. while(BitCounter);     //判斷是否接收完成
  164. return(temp);
  165. }
  166. void WrToROM(uchar Data[],uchar Address,uchar Num)
  167. {
  168.   uchar i;
  169.   uchar *PData;
  170.   PData=Data;
  171.   for(i=0;i<Num;i++)
  172.   {
  173.   Start();
  174.   Send(0xa0);
  175.   Ack();
  176.   Send(Address+i);
  177.   Ack();
  178.   Send(*(PData+i));
  179.   Ack();
  180.   Stop();
  181.   mDelay(20);
  182.   }
  183. }
  184. void RdFromROM(uchar Data[],uchar Address,uchar Num)
  185. {
  186.   uchar i;
  187.   uchar *PData;
  188.   PData=Data;
  189.   for(i=0;i<Num;i++)
  190.   {
  191.   Start();
  192.   Send(0xa0);
  193.   Ack();
  194.   Send(Address+i);
  195.   Ack();
  196.   Start();
  197.   Send(0xa1);
  198.   Ack();
  199.   *(PData+i)=Read();
  200.   Scl=0;
  201.   NoAck();
  202.   Stop();
  203.   }
  204. }

  205. //==================================================================================================
  206. //=======================================LCD1602====================================================
  207. //==================================================================================================
  208. #define yi 0x80 //LCD第一行的初始位置,因為LCD1602字符地址首位D7恒定為1(100000000=80)
  209. #define er 0x80+0x40 //LCD第二行初始位置(因為第二行第一個字符位置地址是0x40)

  210. //----------------延時函數(shù),后面經(jīng)常調(diào)用----------------------
  211. void delay(uint xms)//延時函數(shù),有參函數(shù)
  212. {
  213. uint x,y;
  214. for(x=xms;x>0;x--)
  215.   for(y=110;y>0;y--);
  216. }
  217. //--------------------------寫指令---------------------------
  218. void write_1602com(uchar com)//****液晶寫入指令函數(shù)****
  219. {
  220. lcd1602_rs=0;//數(shù)據(jù)/指令選擇置為指令
  221. lcd1602_rw=0; //讀寫選擇置為寫
  222. P0=com;//送入數(shù)據(jù)
  223. delay(1);
  224. lcd1602_en=1;//拉高使能端,為制造有效的下降沿做準備
  225. delay(1);
  226. lcd1602_en=0;//en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令
  227. }
  228. //-------------------------寫數(shù)據(jù)-----------------------------
  229. void write_1602dat(uchar dat)//***液晶寫入數(shù)據(jù)函數(shù)****
  230. {
  231. lcd1602_rs=1;//數(shù)據(jù)/指令選擇置為數(shù)據(jù)
  232. lcd1602_rw=0; //讀寫選擇置為寫
  233. P0=dat;//送入數(shù)據(jù)
  234. delay(1);
  235. lcd1602_en=1; //en置高電平,為制造下降沿做準備
  236. delay(1);
  237. lcd1602_en=0; //en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令
  238. }
  239. //-------------------------初始化-------------------------
  240. void lcd_init(void)
  241. {
  242. write_1602com(0x38);//設(shè)置液晶工作模式,意思:16*2行顯示,5*7點陣,8位數(shù)據(jù)
  243. write_1602com(0x0c);//開顯示不顯示光標
  244. write_1602com(0x06);//整屏不移動,光標自動右移
  245. write_1602com(0x01);//清顯示
  246. }
  247. //========================================================================================
  248. //=========================================================================================
  249. //==============將按鍵值編碼為數(shù)值=========================
  250. unsigned char coding(unsigned char m)  
  251. {
  252. unsigned char k;
  253. switch(m)
  254. {
  255.   case (0x11): k=1;break;
  256.   case (0x21): k=2;break;
  257.   case (0x41): k=3;break;
  258.   case (0x81): k='A';break;
  259.   case (0x12): k=4;break;
  260.   case (0x22): k=5;break;
  261.   case (0x42): k=6;break;
  262.   case (0x82): k='B';break;
  263.   case (0x14): k=7;break;
  264.   case (0x24): k=8;break;
  265.   case (0x44): k=9;break;
  266.   case (0x84): k='C';break;
  267.   case (0x18): k='*';break;
  268.   case (0x28): k=0;break;
  269.   case (0x48): k='#';break;
  270.   case (0x88): k='D';break;
  271. }
  272. return(k);
  273. }
  274. //=====================按鍵檢測并返回按鍵值===============================
  275. unsigned char keynum(void)
  276. {
  277.   unsigned char row,col,i;
  278.   P1=0xf0;
  279.   if((P1&0xf0)!=0xf0)
  280.   {
  281.      Delay5Ms();
  282.         Delay5Ms();
  283.      if((P1&0xf0)!=0xf0)
  284.   {
  285.       row=P1^0xf0;          //確定行線
  286.    i=0;
  287.    P1=a[i];           //精確定位
  288.    while(i<4)
  289.    {
  290.      if((P1&0xf0)!=0xf0)
  291.       {
  292.         col=~(P1&0xff);   //確定列線
  293.         break;            //已定位后提前退出   
  294.       }
  295.     else
  296.       {
  297.         i++;
  298.         P1=a[i];
  299.       }
  300.    }
  301.   }
  302.   else
  303.   {
  304.    return 0;
  305.   }
  306.   while((P1&0xf0)!=0xf0);
  307.   return (row|col);    //行線與列線組合后返回
  308.   }
  309.   else return 0;            //無鍵按下時返回0
  310. }
  311. //=======================一聲提示音,表示有效輸入========================
  312. void OneAlam(void)
  313. {
  314. ALAM=0;
  315. Delay5Ms();
  316.     ALAM=1;
  317. }
  318. //========================二聲提示音,表示操作成功========================
  319. void TwoAlam(void)
  320. {
  321. ALAM=0;
  322. Delay5Ms();
  323.     ALAM=1;
  324.     Delay5Ms();
  325. ALAM=0;
  326. Delay5Ms();
  327.     ALAM=1;
  328. }
  329. //========================三聲提示音,表示錯誤========================
  330. void ThreeAlam(void)
  331. {
  332. ALAM=0;
  333. Delay5Ms();
  334.     ALAM=1;
  335.     Delay5Ms();
  336. ALAM=0;
  337. Delay5Ms();
  338.     ALAM=1;
  339.     Delay5Ms();
  340. ALAM=0;
  341. Delay5Ms();
  342.     ALAM=1;
  343. }
  344. //=======================顯示提示輸入=========================
  345. void DisplayChar(void)
  346. {
  347. unsigned char i;
  348. if(pass==1)
  349. {
  350.   //DisplayListChar(0,1,LockOpen);
  351.   write_1602com(er);       //在二行開始顯示
  352.   for(i=0;i<16;i++)
  353.   {
  354.    write_1602dat(LockOpen[i]);    //顯示open 開鎖成功
  355.   }
  356. }
  357. else
  358. {
  359.   if(N==0)
  360.   {
  361.    //DisplayListChar(0,1,Error);
  362.    write_1602com(er);
  363.    for(i=0;i<16;i++)
  364.    {
  365.     write_1602dat(Error[i]); //顯示錯誤
  366.    }
  367.   }
  368.   else
  369.   {
  370.    //DisplayListChar(0,1,start_line);
  371.    write_1602com(er);
  372.    for(i=0;i<16;i++)
  373.    {
  374.     write_1602dat(start_line[i]);//顯示開始輸入
  375.    }
  376.   }
  377. }
  378. }
  379. //========================[size=7]重置密碼[/size]==================================================
  380. //==================================================================================
  381. void ResetPassword(void)
  382. {
  383. unsigned char i;
  384. unsigned char j;
  385. if(pass==1)
  386. {
  387.   pass=0;      
  388.   DisplayChar();    //顯示錯誤
  389.   ThreeAlam();    //沒開鎖時按下重置密碼報警3聲
  390. }
  391. else       //開鎖狀態(tài)下才能進行密碼重置程序
  392. {
  393.      if(ReInputEn==1)   //開鎖狀態(tài)下,ReInputEn置1,重置密碼允許
  394.   {
  395.    if(N==6)    //輸入6位密碼
  396.    {
  397.     ReInputCont++;   //密碼次數(shù)計數(shù)
  398.     if(ReInputCont==2)  //輸入兩次密碼
  399.     {
  400.      for(i=0;i<6;)
  401.      {
  402.       if(TempPassword[i]==InputData[i]) //將兩次輸入的新密碼作對比
  403.        i++;
  404.       else        //如果兩次的密碼不同
  405.       {
  406.        //DisplayListChar(0,1,Error);
  407.        write_1602com(er);
  408.        for(j=0;j<16;j++)
  409.        {
  410.         write_1602dat(Error[j]); //顯示錯誤Error
  411.        }
  412.        ThreeAlam();   //錯誤提示
  413.        pass=0;     //關(guān)鎖
  414.        ReInputEn=0;   //關(guān)閉重置功能,
  415.        ReInputCont=0;
  416.        DisplayChar();
  417.        break;
  418.       }
  419.      }
  420.      if(i==6)
  421.      {
  422.       //DisplayListChar(0,1,ResetOK);
  423.       write_1602com(er);
  424.       for(j=0;j<16;j++)
  425.       {
  426.        write_1602dat(ResetOK[j]);   //密碼修改成功,顯示
  427.       }
  428.       TwoAlam();    //操作成功提示
  429.        WrToROM(TempPassword,0,6);  //將新密碼寫入24C02存儲
  430.       ReInputEn=0;
  431.      }
  432.      ReInputCont=0;
  433.      CorrectCont=0;
  434.     }
  435.     else       //輸入一次密碼時
  436.     {
  437.      OneAlam();
  438.      //DisplayListChar(0, 1, again);   //顯示再次輸入一次
  439.      write_1602com(er);
  440.      for(j=0;j<16;j++)
  441.      {
  442.       write_1602dat(again[j]);   //顯示再輸入一次
  443.      }     
  444.      for(i=0;i<6;i++)
  445.      {
  446.       TempPassword[i]=InputData[i];  //將第一次輸入的數(shù)據(jù)暫存起來      
  447.      }
  448.     }
  449.    N=0;      //輸入數(shù)據(jù)位數(shù)計數(shù)器清零
  450.      }
  451.      }
  452. }
  453. }
  454. //=======================輸入密碼錯誤超過三過,報警并鎖死鍵盤======================
  455. void Alam_KeyUnable(void)
  456. {
  457. P1=0x00;
  458. {
  459.   ALAM=~ALAM;     //蜂鳴器一直閃爍鳴響
  460.   Delay5Ms();
  461. }
  462. }
  463. //=======================取消所有操作============================================
  464. void Cancel(void)
  465. {
  466. unsigned char i;
  467. unsigned char j;
  468. //DisplayListChar(0, 1, start_line);
  469. write_1602com(er);
  470. for(j=0;j<16;j++)
  471. {
  472.   write_1602dat(start_line[j]);   //顯示開機輸入密碼界面
  473. }
  474. TwoAlam();    //提示音
  475. for(i=0;i<6;i++)
  476. {
  477.   InputData[i]=0;  //將輸入密碼清零
  478. }
  479. KEY=1;     //關(guān)閉鎖
  480. ALAM=1;     //報警關(guān)
  481. pass=0;     //密碼正確標志清零
  482. ReInputEn=0;   //重置輸入充許標志清零
  483. ErrorCont=0;   //密碼錯誤輸入次數(shù)清零
  484. CorrectCont=0;   //密碼正確輸入次數(shù)清零
  485. ReInputCont=0;   //重置密碼輸入次數(shù)清零
  486. s3_keydown=0;
  487. key_disable=0;   //鎖定鍵盤標志清零
  488. N=0;     //輸入位數(shù)計數(shù)器清零
  489. }
  490. //==========================確認鍵,并通過相應標志位執(zhí)行相應功能===============================
  491. void Ensure(void)
  492. {
  493. unsigned char i,j;
  494. RdFromROM(CurrentPassword,0,6);      //從24C02里讀出存儲密碼
  495.     if(N==6)
  496. {
  497.      if(ReInputEn==0)       //重置密碼功能未開啟
  498.   {
  499.    for(i=0;i<6;)
  500.       {     
  501.     if(CurrentPassword[i]==InputData[i]) //判斷輸入密碼和24c02中的密碼是否相同
  502.     {
  503.      i++;        //相同一位 i就+1
  504.     }
  505.     else          //如果有密碼不同
  506.     {         
  507.      ErrorCont++;      //錯誤次數(shù)++
  508.      if(ErrorCont==3)   //錯誤輸入計數(shù)達三次時,報警并鎖定鍵盤
  509.      {
  510.       write_1602com(er);
  511.       for(i=0;i<16;i++)
  512.       {
  513.        write_1602dat(Error[i]);
  514.       }
  515.       do
  516.       Alam_KeyUnable();
  517.       while(1);
  518.      }
  519.      else      //錯誤次數(shù)小于3次時,鎖死鍵盤3秒,然后重新可以輸入
  520.      {
  521.       TR0=1;    //開啟定時
  522.       key_disable=1;   //鎖定鍵盤
  523.       pass=0;     //pass位清零
  524.       break;     //跳出
  525.      }
  526.     }
  527.    }
  528.    if(i==6)      //密碼輸入對時
  529.    {
  530.     CorrectCont++;     //輸入正確變量++
  531.     if(CorrectCont==1)    //正確輸入計數(shù),當只有一次正確輸入時,開鎖
  532.     {
  533.      //DisplayListChar(0,1,LockOpen);
  534.      write_1602com(er);
  535.      for(j=0;j<16;j++)
  536.      {
  537.       write_1602dat(LockOpen[j]);    //顯示open開鎖畫面
  538.      }
  539.      TwoAlam();   //操作成功提示音
  540.      KEY=0;           //開鎖
  541.      pass=1;           //置正確標志位
  542.      TR0=1;           //開啟定時
  543.      for(j=0;j<6;j++)        //將輸入清除
  544.      {
  545.       InputData[i]=0;        //開鎖后將輸入位清零
  546.      }
  547.     }
  548.     else            //當兩次正確輸入時,開啟重置密碼功能
  549.     {
  550.      //DisplayListChar(0,1,SetNew);
  551.      write_1602com(er);
  552.      for(j=0;j<16;j++)
  553.      {
  554.       write_1602dat(SetNew[j]);     //顯示重置密碼界面
  555.      }
  556.      TwoAlam();             //操作成功提示
  557.      ReInputEn=1;         //允許重置密碼輸入
  558.      CorrectCont=0;         //正確計數(shù)器清零
  559.     }
  560.      }

  561.    else   //=========================當?shù)谝淮问褂没蛲浢艽a時可以用131420對其密碼初始化============
  562.    {
  563.     if((InputData[0]==1)&&(InputData[1]==3)&&(InputData[2]==1)&&(InputData[3]==4)&&(InputData[4]==2)&&(InputData[5]==0))
  564.        {
  565.      WrToROM(initpassword,0,6);     //強制將初始密碼寫入24C02存儲
  566.      //DisplayListChar(0,1,initword);   //顯示初始化密碼
  567.      write_1602com(er);
  568.      for(j=0;j<16;j++)
  569.      {
  570.       write_1602dat(initword[j]);    //顯示初始化密碼
  571.      }
  572.      TwoAlam();         //成功提示音
  573.      Delay400Ms();        //延時400ms
  574.      TwoAlam();         //成功提示音
  575.      N=0;          //輸入位數(shù)計數(shù)器清零
  576.     }
  577.     else           //密碼輸入錯誤
  578.     {
  579.      //DisplayListChar(0,1,Error);
  580.      write_1602com(er);
  581.      for(j=0;j<16;j++)
  582.      {
  583.       write_1602dat(Error[j]);     //顯示錯誤信息
  584.      }
  585.       ThreeAlam();          //錯誤提示音
  586.      pass=0;
  587.     }
  588.    }
  589.   }
  590.   else           //當已經(jīng)開啟重置密碼功能時,而按下開鎖鍵,
  591.   {
  592.    //DisplayListChar(0,1,Er_try);
  593.    write_1602com(er);
  594.    for(j=0;j<16;j++)
  595.    {
  596.     write_1602dat(Er_try[j]);     //錯誤,請重新輸入
  597.    }
  598.    ThreeAlam();         //錯誤提示音
  599.   }
  600. }
  601. else       //密碼沒有輸入到6位時,按下確認鍵時
  602. {
  603.   //DisplayListChar(0,1,Error);
  604.   write_1602com(er);
  605.   for(j=0;j<16;j++)
  606.   {
  607.    write_1602dat(Error[j]);   //顯示錯誤
  608.   }
  609.    ThreeAlam();          //錯誤提示音
  610.   pass=0;
  611. }

  612. N=0;             //將輸入數(shù)據(jù)計數(shù)器清零,為下一次輸入作準備
  613. }

  614. //==============================主函數(shù)===============================
  615. void main(void)
  616. {
  617.   unsigned char KEY,NUM;
  618. unsigned char i,j;
  619.   P1=0xFF;        //P1口復位
  620. TMOD=0x11;       //定義工作方式
  621.   TL0=0xB0;
  622.   TH0=0x3C;       //定時器賦初值
  623.   EA=1;        //打開中斷總開關(guān)
  624.   ET0=1;        //打開中斷允許開關(guān)
  625.   TR0=0;        //打開定時器開關(guān)
  626.   Delay400Ms();  //啟動等待,等LCM講入工作狀態(tài)
  627.   lcd_init();  //LCD初始化
  628. write_1602com(yi);//日歷顯示固定符號從第一行第0個位置之后開始顯示
  629. for(i=0;i<16;i++)
  630. {
  631.   write_1602dat(name[i]);//向液晶屏寫開機畫面
  632. }
  633. write_1602com(er);
  634. for(i=0;i<16;i++)
  635. {
  636.   write_1602dat(start_line[i]);//寫輸入密碼等待界面
  637. }
  638. write_1602com(er+9); //設(shè)置光標位置
  639. write_1602com(0x0f); //設(shè)置光標為閃爍
  640.   Delay5Ms(); //延時片刻(可不要)
  641.   N=0;              //初始化數(shù)據(jù)輸入位數(shù)
  642.   while(1)   //進入循環(huán)
  643.   {
  644.   if(key_disable==1)      //鎖定鍵盤標志為1時
  645.    Alam_KeyUnable();     //報警鍵盤鎖
  646.   else
  647.    ALAM=1;        //關(guān)報警
  648.   KEY=keynum();       //讀按鍵的位置碼
  649.   if(KEY!=0)        //當有按鍵按下時
  650.   {
  651.    if(key_disable==1)     //鎖定鍵盤標志為1時
  652.    {
  653.     second=0;      //秒清零
  654.    }
  655.    else        //沒有鎖定鍵盤時
  656.    {
  657.     NUM=coding(KEY);    //根據(jù)按鍵的位置將其編碼,編碼值賦值給NUM
  658.     {
  659.      switch(NUM)     //判斷按鍵值
  660.      {
  661.       case ('A'):  ;      break;
  662.       case ('B'):  ;         break;
  663.       case ('C'):
  664.          write_1602com(yi);//日歷顯示固定符號從第一行第0個位置之后開始顯示
  665.          for(i=0;i<16;i++)
  666.          {
  667.           write_1602dat(name[i]);//向液晶屏寫開機畫面
  668.          }
  669.          if(N>=1) N--; OneAlam();        //按鍵提示音      
  670.          //DisplayOneChar(6+N,1,'*');
  671.          for(j=N;j<16;j++)
  672.          {
  673.           write_1602com(er+6+j);
  674.           write_1602dat(' ');
  675.          }
  676.          for(j=0;j<N;j++)
  677.          {
  678.           write_1602com(er+6+j);    //顯示位數(shù)隨輸入增加而增加
  679.           write_1602dat('*');     //但不顯示實際數(shù)字,用*代替
  680.          }  
  681.          InputData[N]=N+4;
  682.          break;  //ABC是無定義按鍵
  683.       case ('D'): ResetPassword();  break;      //重新設(shè)置密碼
  684.       case ('*'): Cancel();    break;      //取消當前輸入
  685.       case ('#'): Ensure();     break;    //確認鍵,
  686.       default:           //如果不是功能鍵按下時,就是數(shù)字鍵按下
  687.       {
  688.        //DisplayListChar(0,1,Input);
  689.        if(N<6)                        //當輸入的密碼少于6位時,接受輸入并保存,大于6位時則無效。
  690.        {
  691.         write_1602com(er);
  692.         for(i=0;i<16;i++)
  693.         {
  694.          write_1602dat(Input[i]);    //顯示輸入畫面
  695.         }
  696.         OneAlam();        //按鍵提示音
  697.          for(j=0;j<=N;j++)
  698.         {
  699.          write_1602com(er+6+j);    //顯示位數(shù)隨輸入增加而增加
  700.          write_1602dat('*');     //但不顯示實際數(shù)字,用*代替
  701.         }
  702.         InputData[N]=NUM;      //將數(shù)字鍵的碼賦值給InputData[]數(shù)組暫存
  703.         N++;         //密碼位數(shù)加
  704.        }
  705.        else          //輸入數(shù)據(jù)位數(shù)大于6后,忽略輸入
  706.        {
  707.         N=6;         //密碼輸入大于6位時,不接受輸入
  708.          break;
  709.        }
  710.       }
  711.      }
  712.     }
  713.    }
  714.    }
  715. }
  716. }
  717. //*********************************中斷服務函數(shù)**************************************
  718. void  time0_int(void) interrupt 1      //定時器T0
  719. {
  720.   TL0=0xB0;
  721.   TH0=0x3C;    //定時器重新賦初值
  722.   //TR0=1;
  723.   countt0++;      //計時變量加,加1次時50ms
  724.    if(countt0==20)     //加到20次就是1s
  725.     {
  726.   countt0=0;     //變量清零
  727.   second++;     //秒加
  728.   if(pass==1)     //開鎖狀態(tài)時
  729.   {
  730.    if(second==1)   //秒加到1s時
  731.    {
  732.     TR0=0;    //關(guān)定時器
  733.     TL0=0xB0;
  734.      TH0=0x3C;   //再次賦初值
  735.     second=0;   //秒清零
  736.    }
  737.   }
  738.   else      //不在開鎖狀態(tài)時
  739.   {
  740.    if(second==3)   //秒加到3時
  741.    {
  742.     TR0=0;    //關(guān)閉定時器
  743.     second=0;   //秒清零
  744.     key_disable=0;  //鎖定鍵盤清零
  745.     s3_keydown=0;
  746.     TL0=0xB0;
  747.     TH0=0x3C;   //重新賦初值
  748.    }
  749.    else
  750.        TR0=1;    //打開定時器
  751.   }
  752.    
  753.     }
  754. }
復制代碼


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

使用道具 舉報

沙發(fā)
ID:330979 發(fā)表于 2018-5-16 09:46 | 只看該作者
這是什么啊
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表