找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1610|回复: 1
打印 上一主题 下一主题
收起左侧

修改密码不好用 不知道哪里出问题了 实在找不到了 求大神指点

[复制链接]
跳转到指定楼层
楼主
ID:306099 发表于 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串行数据
  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中断计数器,秒计数器
  20. void Delay5Ms(void);  //声明延时函数
  21. unsigned char code a[]={0xFE,0xFD,0xFB,0xF7};     //控盘扫描控制表
  22. //液晶显示数据数组
  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];         //输入密码暂存区
  36. unsigned char CurrentPassword[6]={1,3,1,4,2,0};    //管理员密码(只可在程序中修改)
  37. unsigned char TempPassword[6];
  38. unsigned char N=0;    //密码输入位数记数
  39. unsigned char ErrorCont;   //错误次数计数
  40. unsigned char CorrectCont;   //正确输入计数
  41. unsigned char ReInputCont;    //重新输入计数
  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. /*发送数据子程序,Data为要求发送的数据*/
  118. void Send(uchar Data)
  119. {
  120.     uchar BitCounter=8;
  121.     uchar temp;
  122.     do
  123.     {
  124.      temp=Data;        //将待发送数据暂存temp
  125.      Scl=0;
  126.      Nop();
  127.      if((temp&0x80)==0x80)     //将读到的数据&0x80
  128.      Sda=1;
  129.      else
  130.      Sda=0;
  131.      Scl=1;
  132.      temp=Data<<1;       //数据左移
  133.      Data=temp;        //数据左移后重新赋值Data
  134.      BitCounter--;       //该变量减到0时,数据也就传送完成了
  135.     }
  136.     while(BitCounter);       //判断是否传送完成
  137.     Scl=0;
  138. }
  139. /*读一字节的数据,并返回该字节值*/
  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)       //数据位是否为1
  153.    temp=temp|0x01;    //为1 temp的最低位为1(|0x01,就是将最低位变为1)
  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时,数据就接收完了
  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. //----------------延时函数,后面经常调用----------------------
  211. void delay(uint xms)//延时函数,有参函数
  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)//****液晶写入指令函数****
  219. {
  220. lcd1602_rs=0;//数据/指令选择置为指令
  221. lcd1602_rw=0; //读写选择置为写
  222. P0=com;//送入数据
  223. delay(1);
  224. lcd1602_en=1;//拉高使能端,为制造有效的下降沿做准备
  225. delay(1);
  226. lcd1602_en=0;//en由高变低,产生下降沿,液晶执行命令
  227. }
  228. //-------------------------写数据-----------------------------
  229. void write_1602dat(uchar dat)//***液晶写入数据函数****
  230. {
  231. lcd1602_rs=1;//数据/指令选择置为数据
  232. lcd1602_rw=0; //读写选择置为写
  233. P0=dat;//送入数据
  234. delay(1);
  235. lcd1602_en=1; //en置高电平,为制造下降沿做准备
  236. delay(1);
  237. lcd1602_en=0; //en由高变低,产生下降沿,液晶执行命令
  238. }
  239. //-------------------------初始化-------------------------
  240. void lcd_init(void)
  241. {
  242. write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据
  243. write_1602com(0x0c);//开显示不显示光标
  244. write_1602com(0x06);//整屏不移动,光标自动右移
  245. write_1602com(0x01);//清显示
  246. }
  247. //========================================================================================
  248. //=========================================================================================
  249. //==============将按键值编码为数值=========================
  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       //开锁状态下才能进行密码重置程序
  392. {
  393.      if(ReInputEn==1)   //开锁状态下,ReInputEn置1,重置密码允许
  394.   {
  395.    if(N==6)    //输入6位密码
  396.    {
  397.     ReInputCont++;   //密码次数计数
  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;     //关锁
  414.        ReInputEn=0;   //关闭重置功能,
  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];  //将第一次输入的数据暂存起来      
  447.      }
  448.     }
  449.    N=0;      //输入数据位数计数器清零
  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;     //关闭锁
  480. ALAM=1;     //报警关
  481. pass=0;     //密码正确标志清零
  482. ReInputEn=0;   //重置输入充许标志清零
  483. ErrorCont=0;   //密码错误输入次数清零
  484. CorrectCont=0;   //密码正确输入次数清零
  485. ReInputCont=0;   //重置密码输入次数清零
  486. s3_keydown=0;
  487. key_disable=0;   //锁定键盘标志清零
  488. N=0;     //输入位数计数器清零
  489. }
  490. //==========================确认键,并通过相应标志位执行相应功能===============================
  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++;      //错误次数++
  508.      if(ErrorCont==3)   //错误输入计数达三次时,报警并锁定键盘
  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      //错误次数小于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)    //正确输入计数,当只有一次正确输入时,开锁
  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;         //正确计数器清零
  559.     }
  560.      }

  561.    else   //=========================当第一次使用或忘记密码时可以用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;          //输入位数计数器清零
  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           //当已经开启重置密码功能时,而按下开锁键,
  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;             //将输入数据计数器清零,为下一次输入作准备
  613. }

  614. //==============================主函数===============================
  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;        //打开中断总开关
  624.   ET0=1;        //打开中断允许开关
  625.   TR0=0;        //打开定时器开关
  626.   Delay400Ms();  //启动等待,等LCM讲入工作状态
  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); //设置光标位置
  639. write_1602com(0x0f); //设置光标为闪烁
  640.   Delay5Ms(); //延时片刻(可不要)
  641.   N=0;              //初始化数据输入位数
  642.   while(1)   //进入循环
  643.   {
  644.   if(key_disable==1)      //锁定键盘标志为1时
  645.    Alam_KeyUnable();     //报警键盘锁
  646.   else
  647.    ALAM=1;        //关报警
  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);    //根据按键的位置将其编码,编码值赋值给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);    //显示位数随输入增加而增加
  679.           write_1602dat('*');     //但不显示实际数字,用*代替
  680.          }  
  681.          InputData[N]=N+4;
  682.          break;  //ABC是无定义按键
  683.       case ('D'): ResetPassword();  break;      //重新设置密码
  684.       case ('*'): Cancel();    break;      //取消当前输入
  685.       case ('#'): Ensure();     break;    //确认键,
  686.       default:           //如果不是功能键按下时,就是数字键按下
  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);    //显示位数随输入增加而增加
  700.          write_1602dat('*');     //但不显示实际数字,用*代替
  701.         }
  702.         InputData[N]=NUM;      //将数字键的码赋值给InputData[]数组暂存
  703.         N++;         //密码位数加
  704.        }
  705.        else          //输入数据位数大于6后,忽略输入
  706.        {
  707.         N=6;         //密码输入大于6位时,不接受输入
  708.          break;
  709.        }
  710.       }
  711.      }
  712.     }
  713.    }
  714.    }
  715. }
  716. }
  717. //*********************************中断服务函数**************************************
  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)     //开锁状态时
  729.   {
  730.    if(second==1)   //秒加到1s时
  731.    {
  732.     TR0=0;    //关定时器
  733.     TL0=0xB0;
  734.      TH0=0x3C;   //再次赋初值
  735.     second=0;   //秒清零
  736.    }
  737.   }
  738.   else      //不在开锁状态时
  739.   {
  740.    if(second==3)   //秒加到3时
  741.    {
  742.     TR0=0;    //关闭定时器
  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空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:330979 发表于 2018-5-16 09:46 | 只看该作者
这是什么啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表