找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机数字密码锁(源代码)

[复制链接]
跳转到指定楼层
楼主
单片机数字密码锁:


程序源代码:
  1. //************************************************************************************************************************************
  2. //库调用.宏类型定义.位定义//
  3. //************************************************************************************************************************************
  4. #include <reg52.h>                                   
  5. #include <intrins.h>
  6. #define uchar unsigned char
  7. #define uint unsigned int
  8. #define ushort unsigned short

  9. #define GPIO_KEY P1                 //矩阵键盘烧扫描端口
  10. sbit RS = P2^2;                                       //液晶显示器控制端口
  11. sbit RW = P2^3;
  12. sbit E = P3^7;
  13. sbit shuchu=P2^0;                                      //继电器控制端口
  14. sbit beep=P2^1;                                              //报警器端口
  15. sbit DoorBell=P3^6;                                    //门铃端口
  16. sbit SCL = P2^6;                    //AT24C04的时钟
  17. sbit SDA = P2^7;                    //AT24C04的数据

  18. uchar idata upxs[16]={"Password:"}; //上排存放数组
  19. uchar idata dwxs[16]={""};          //下排存放数组
  20. uint idata tempword[6]={0};                     //临时密码数组
  21. uint idata password[6]={1,1,1,1,1,1};//初始密码
  22. uint idata now=0;                                                  //数组伪指针
  23. uint idata key=0;                   //密钥
  24. uint idata keyboard=0;              //键盘锁定标志
  25. uint idata key1=0;                                          //用于密码修改
  26. uint idata KeyValue=16;             //用来存放读取到的键值
  27. uint idata warn=0;                                          //错误累计
  28. uint idata time=0;                                          //用于定时
  29. uint idata time1=0;                 //用于定时
  30. uint idata time2=0;                 //用于定时
  31. uint idata moshi=0;                                          //定时器内部模式
  32. uchar idata BUF[8];                 //掉电数据缓存区
  33. uchar idata TESTDATA[8]={0};        //掉电新密码存储
  34. uint idata menu=0;                                    //menu用于密码修改
  35. uint idata tempword1[8]={0};        //用于密码修改
  36. //*********************************************************************************************************************************
  37. //函数声明//
  38. //*********************************************************************************************************************************
  39. void delete(void);
  40. //*********************************************************************************************************************************
  41. /*模块名称:液晶驱动显示模块*/
  42. /*模块功能:驱动LCD1602的显示,并时时显示按键值*/
  43. //*********************************************************************************************************************************
  44. void delay(uint dell)//毫秒延时//
  45. {
  46.      uchar x;
  47.      for(dell;dell>0;dell--)
  48.      for(x=110;x>0;x--);
  49. }
  50. void wr_com(uchar temp)//写指令//
  51. {
  52.      RS=0;
  53.      RW=0;
  54.      P0=temp;
  55.      E=1;
  56.      E=0;
  57. }
  58. void wr_data(uchar num)//写数据//
  59. {
  60.      RS=1;
  61.      RW=0;
  62.      P0=num;
  63.      E=1;
  64.      E=0;
  65. }
  66. void disp_lcd(uchar addr,char *templ)//显示函数//
  67. {
  68.      uchar i;
  69.      wr_com(addr);
  70.            delay(50);
  71.      for(i=0;i<16;i++)
  72.     {
  73.      wr_data(templ[i]);
  74.            delay(50);
  75.     }         
  76. }
  77. void lcd_init()//初始化液晶//
  78. {
  79.      wr_com(0x30);
  80.       delay(50);
  81.      wr_com(0x38);
  82.       delay(50);
  83.      wr_com(0x01);
  84.       delay(50);
  85.      wr_com(0x06);
  86.       delay(50);
  87.      wr_com(0x0c);
  88.       delay(50);
  89. }
  90. void lcdxianshi(void)//液晶总显示//
  91. {
  92.      disp_lcd(0x80,upxs);
  93.      disp_lcd(0xc0,dwxs);
  94. }
  95. //*********************************************************************************************************************************
  96. /*模块名称:矩阵键盘扫描模块*/
  97. /*模块功能:时时扫描按键值*/
  98. //*********************************************************************************************************************************
  99. void Delay10ms(void)//延时函数//
  100. {
  101.     unsigned char a,b,c;
  102.     for(c=1;c>0;c--)
  103.         for(b=38;b>0;b--)
  104.             for(a=130;a>0;a--);
  105. }
  106. void KeyDown(void)//键盘检测函数//
  107. {
  108.         char a=0;
  109.         GPIO_KEY=0x0f;
  110.         if(GPIO_KEY!=0x0f)     //读取按键是否按下
  111.         {
  112.                 Delay10ms();         //延时10ms进行消抖
  113.                 if(GPIO_KEY!=0x0f)   //再次检测键盘是否按下
  114.                 {
  115.                        
  116.                         //扫描列
  117.                         GPIO_KEY=0X0F;
  118.                         switch(GPIO_KEY)
  119.                         {
  120.                                 case(0X07):        KeyValue=0;break;
  121.                                 case(0X0b):        KeyValue=1;break;
  122.                                 case(0X0d): KeyValue=2;break;
  123.                                 case(0X0e):        KeyValue=3;break;
  124.                         }
  125.                         //扫描行
  126.                         GPIO_KEY=0XF0;
  127.                         switch(GPIO_KEY)
  128.                         {
  129.                                 case(0X70):        KeyValue=KeyValue;break;
  130.                                 case(0Xb0):        KeyValue=KeyValue+4;break;
  131.                                 case(0Xd0): KeyValue=KeyValue+8;break;
  132.                                 case(0Xe0):        KeyValue=KeyValue+12;break;
  133.                         }
  134.                         while((a<10)&&(GPIO_KEY!=0xf0))//按键松手检测
  135.                         {
  136.                                 Delay10ms();
  137.                                 a++;
  138.                         }
  139.                 }
  140.         }
  141. }
  142. //*******************************************************************************************************************************
  143. /*模块名称:数据处理模块*/
  144. /*模块功能:(1)将按键值传递给各种缓存数祝(2)包含数据清除函数*/
  145. //*******************************************************************************************************************************
  146. void keysend(void)//键值传递//
  147. {
  148.                  switch(KeyValue)
  149.            {
  150.              case 0:{dwxs[now]='0';tempword[now]=0;TESTDATA[now]=0;now++;break;}
  151.                    case 1:{dwxs[now]='1';tempword[now]=1;TESTDATA[now]=1;now++;break;}
  152.                    case 2:{dwxs[now]='2';tempword[now]=2;TESTDATA[now]=2;now++;break;}
  153.                    case 3:{dwxs[now]='3';tempword[now]=3;TESTDATA[now]=3;now++;break;}
  154.                    case 4:{dwxs[now]='4';tempword[now]=4;TESTDATA[now]=4;now++;break;}
  155.                    case 5:{dwxs[now]='5';tempword[now]=5;TESTDATA[now]=5;now++;break;}
  156.                    case 6:{dwxs[now]='6';tempword[now]=6;TESTDATA[now]=6;now++;break;}
  157.                    case 7:{dwxs[now]='7';tempword[now]=7;TESTDATA[now]=7;now++;break;}
  158.                    case 8:{dwxs[now]='8';tempword[now]=8;TESTDATA[now]=8;now++;break;}
  159.                    case 9:{dwxs[now]='9';tempword[now]=9;TESTDATA[now]=9;now++;break;}
  160.                    case 11:{
  161.                                         upxs[12]='S';
  162.                                        upxs[13]='U';
  163.                                        upxs[14]='R';
  164.                                        upxs[15]='E'; break;
  165.                    }
  166.                    case 14:{
  167.                            menu++;                         //密码修改模式启动模式一
  168.                                   if(menu>1)                     //再次按下跳出密码修改模式
  169.                                   {
  170.                                            upxs[0]='P';           //显示“password”
  171.                              upxs[1]='a';
  172.                              upxs[2]='s';
  173.                              upxs[3]='s';
  174.                              upxs[4]='w';
  175.                              upxs[5]='o';
  176.                              upxs[6]='r';
  177.                              upxs[7]='d';
  178.                                  upxs[8]=':';
  179.                                          delete();
  180.                                          menu=0;
  181.                                   }
  182.                                   break;
  183.                    }
  184.                    case 15:{
  185.                           TR0=1;                     //定时器0打开
  186.                                      moshi=1;                           //模式1为门铃模式
  187.                                   KeyValue=16; break;//键值缓存清零
  188.                    }
  189.                   }
  190.                   if(now==6) now=0;      //只存储8位,只显示八位
  191. }
  192. void delete(void)//清除函数//
  193. {
  194.      uchar i;
  195.              for(i=0;i<16;i++)
  196.                  {
  197.                     dwxs[i]=0x20;            //密码字符清零
  198.                  }
  199.                  for(i=0;i<6;i++)
  200.                  {
  201.                     tempword[i]=0;         //密码缓存数组清零
  202.                  }
  203.                   upxs[11]=0x20;
  204.                   upxs[12]=0x20;   //SURE显示清零
  205.                         upxs[13]=0x20;
  206.                         upxs[14]=0x20;
  207.                         upxs[15]=0x20;
  208.                  now=0;                                       //伪指针复位
  209.                  key=0;                                       //密钥清零
  210.                  KeyValue=16;                     //键值缓存初始
  211. }
  212. void condition_delete(void) //条件清除
  213. {
  214.      if(KeyValue==10)
  215.          {
  216.                 delete();            //按下DELE键清除数据
  217.          }
  218.          KeyValue=16;                             //键值缓存清零
  219. }
  220. //*********************************************************************************************************************************
  221. /*模块名称:定时器模块*/
  222. /*模块功能:定时器0用于产生门铃效果,定时器1用于各种倒计时*/
  223. //*********************************************************************************************************************************
  224. void timer0() interrupt 1    //定时器0用于门铃
  225. {
  226.     switch(moshi)
  227.    {
  228.       case 1:{
  229.                 DoorBell=~DoorBell;
  230.             time++;
  231.              if(time<400)             //若需要拖长声音,可以调整 400 和 800
  232.             {
  233.                TH0=(8192-700)/32;     //700us 定时
  234.                TL0=(8192-700)%32;
  235.             }
  236.              else if(time<800)
  237.             {
  238.                TH0=(8192-1000)/32;    //1ms 定时
  239.                TL0=(8192-1000)%32;
  240.             }
  241.              else
  242.             {
  243.                time=0;                                  //计数清零
  244.                TR0=0;                                  //关闭定时器
  245.                            moshi=0;                                     //跳出模式1
  246.             }
  247.                         break;
  248.           }
  249.           case 2:{
  250.                            beep=~beep;
  251.                          time++;
  252.                          if(time<400)             //若需要拖长声音,调整 400
  253.             {
  254.                TH0=(8192-700)/32;     //700us 定时
  255.                TL0=(8192-700)%32;
  256.             }
  257.                         else
  258.                         {
  259.                            time=0;                                  //计数清零
  260.                         }
  261.                         break;
  262.           }
  263.    }
  264. }
  265. void timer1() interrupt 3          //定时器1用于自动关门
  266. {  
  267.     TH0=(65536-50000)/256;  
  268.     TL0=(65536-50000)%256;  
  269.     time1++;   
  270.     if(time1==20)//一秒  
  271.     {      
  272.       time2++;
  273.             time1=0;  
  274.     }
  275. }
  276. //**********************************************************************************************************************************
  277. /*模块名称帜:掉电模块*/
  278. /*模块功能:支持门锁掉电后密码可保存而不丢失*/
  279. //**********************************************************************************************************************************
  280. //延时5微秒(STC90C52RC@12M),此延时对于12M晶振
  281. void Delay5us()
  282. {
  283.     _nop_();
  284.     _nop_();
  285. }
  286. //延时5毫秒(STC90C52RC@12M)
  287. void Delay5ms()
  288. {
  289.     ushort n = 560;
  290.     while (n--);
  291. }
  292. //起始信号
  293. void AT24C04_Start()
  294. {
  295.     SDA = 1;                    //拉高数据线
  296.     SCL = 1;                    //拉高时钟线
  297.     Delay5us();                 //延时
  298.     SDA = 0;                    //产生下降沿
  299.     Delay5us();                 //延时
  300.     SCL = 0;                    //拉低时钟线
  301. }
  302. //停止信号
  303. void AT24C04_Stop()
  304. {
  305.     SDA = 0;                    //拉低数据线
  306.     SCL = 1;                    //拉高时钟线
  307.     Delay5us();                 //延时
  308.     SDA = 1;                    //产生上升沿
  309.     Delay5us();                 //延时
  310. }
  311. //发送应答信号
  312. void AT24C04_SendACK(bit ack)
  313. {
  314.     SDA = ack;                  //写应答信号
  315.     SCL = 1;                    //拉高时钟线
  316.     Delay5us();                 //延时
  317.     SCL = 0;                    //拉低时钟线
  318.     Delay5us();                 //延时
  319. }
  320. //接收应答信号
  321. bit AT24C04_RecvACK()
  322. {
  323.     SCL = 1;                    //拉高时钟线
  324.     Delay5us();                 //延时
  325.     CY = SDA;                   //读应答信号
  326.     SCL = 0;                    //拉低时钟线
  327.     Delay5us();                 //延时

  328.     return CY;
  329. }
  330. //向IIC总线发送一个字节数据
  331. void AT24C04_SendByte(uchar dat)
  332. {
  333.     uchar i;

  334.     for (i=0; i<8; i++)         //8位计数器
  335.     {
  336.         dat <<= 1;              //移出数据的最高位
  337.         SDA = CY;               //送数据口
  338.         SCL = 1;                //拉高时钟线
  339.         Delay5us();             //延时
  340.         SCL = 0;                //拉低时钟线
  341.         Delay5us();             //延时
  342.     }
  343.     AT24C04_RecvACK();
  344. }
  345. //向AT24C04写1页(16字节)数据,将TESTDATA开始的16个测试数据写如设备的00~0F地址中
  346. void AT24C04_WritePage()
  347. {
  348.     uchar i;

  349.     AT24C04_Start();            //起始信号
  350.     AT24C04_SendByte(0xa0);     //发送设备地址+写信号
  351.     AT24C04_SendByte(0x00);     //发送存储单元地址
  352.     for (i=0; i<16; i++)
  353.     {
  354.         AT24C04_SendByte(TESTDATA[i]);
  355.     }
  356.     AT24C04_Stop();             //停止信号
  357. }
  358. //从IIC总线接收一个字节数据
  359. uchar AT24C04_RecvByte()
  360. {
  361.     uchar i;
  362.     uchar dat = 0;

  363.     SDA = 1;                    //使能内部上拉,准备读取数据
  364.     for (i=0; i<8; i++)         //8位计数器
  365.     {
  366.         dat <<= 1;
  367.         SCL = 1;                //拉高时钟线
  368.         Delay5us();             //延时
  369.         dat |= SDA;             //读数据
  370.         SCL = 0;                //拉低时钟线
  371.         Delay5us();             //延时
  372.     }

  373.     return dat;
  374. }
  375. //从AT24C04读取1页(16字节)数据,将设备的00~0F地址中的数据读出存放在DATA区的BUF中
  376. void AT24C04_ReadPage()
  377. {
  378.     uchar i;

  379.     AT24C04_Start();            //起始信号
  380.     AT24C04_SendByte(0xa0);     //发送设备地址+写信号
  381.     AT24C04_SendByte(0x00);     //发送存储单元地址
  382.     AT24C04_Start();            //起始信号
  383.     AT24C04_SendByte(0xa1);     //发送设备地址+读信号
  384.     for (i=0; i<8; i++)
  385.     {
  386.         BUF[i] = AT24C04_RecvByte();
  387.         if (i == 7)
  388.         {
  389.             AT24C04_SendACK(1); //最后一个数据需要会NAK
  390.         }
  391.         else
  392.         {
  393.             AT24C04_SendACK(0); //回应ACK
  394.         }
  395.     }
  396.     AT24C04_Stop();             //停止信号
  397. }
  398. //********************************************************************************************************************************
  399. /*模块名称:菜单模块*/
  400. /*模块功能:用于密码修改,先输入旧密码,密码正确两次输入新密码*/
  401. //********************************************************************************************************************************
  402. void new_password(void)//密码修改函数
  403. {
  404.      uchar i,j;
  405.            uchar tempxs1[]={"old mima   MENUi"};//提示:输入旧密码
  406.      uchar tempxs2[]={"new mima   FIRST"};//提示:输入新密码一次
  407.      uchar tempxs3[]={"new mima   AGAIN"};//提示:输入新密码二次
  408.      uchar tempxs4[]={"password:       "};//password显示
  409.      uchar tempxs5[]={"success  change "};//修改成功显示
  410.      switch(menu)
  411.          {
  412.           case 1:{
  413.                 for(j=0;j<16;j++){
  414.     upxs[j]=tempxs1[j];
  415.    }
  416.                 if(tempword[5]!=0)
  417.                 {
  418.                   AT24C04_ReadPage();//读取密码
  419.                   for(i=0;i<8;i++)
  420.                   {
  421.                          if(BUF[i]!=0)//对比密码,判断是不是第一次使用
  422.                         {
  423.                             key1++;
  424.                         }
  425.                   }
  426.                   if(key1==0)//如果是第一次使用
  427.                   {
  428.                      for(i=0;i<6;i++)
  429.                     {
  430.                              if(password[i]!=tempword[i])//对比初始密码
  431.                            {
  432.                             key++;
  433.                            }
  434.                     }
  435.                         if(key==0)//密码正确进入菜单二输入新密码
  436.                     {
  437.                        delete();
  438.                            for(i=0;i<8;i++)
  439.                            {
  440.                                      tempword[i]=0;//清空缓存数组
  441.                            }
  442.                            key=0;
  443.                            key1=0;
  444.                        menu=2;
  445.                     }
  446.                   }
  447.                   if(key1!=0)//如果不是第一次使用
  448.                   {
  449.                           for(i=0;i<8;i++)
  450.                     {
  451.                             password[i]=BUF[i];
  452.                              if(password[i]!=tempword[i])//对比密码
  453.                             {
  454.                                key++;
  455.                             }
  456.                     }
  457.                         if(key==0)//密码正确进入菜单二输入新密码
  458.                     {
  459.                        delete();
  460.                            for(i=0;i<8;i++)
  461.                            {
  462.                                      tempword[i]=0;//清空缓存数组
  463.                            }
  464.                            key=0;
  465.                            key1=0;
  466.                        menu=2;
  467.                     }
  468.                   }
  469.                 }
  470.                 break;
  471.                 }
  472.           case 2:{
  473.           for(j=0;j<16;j++){
  474.     upxs[j]=tempxs2[j];
  475.    }
  476.                 if(tempword[5]!=0)
  477.                 {
  478.                    for(i=0;i<8;i++)
  479.                    {
  480.                        tempword1[i]=tempword[i];
  481.                    }
  482.                    delete();
  483.                            for(i=0;i<8;i++)
  484.                            {
  485.                                      tempword[i]=0;//清空缓存数组
  486.                            }
  487.                        menu=3;                        //进入菜单三再次输入新密码
  488.                 }
  489.                 break;
  490.                 }
  491.           case 3:{
  492.           for(j=0;j<16;j++){
  493.     upxs[j]=tempxs3[j];
  494.    }
  495.                 if(tempword[5]!=0)
  496.                 {
  497.                    for(i=0;i<8;i++)
  498.                    {
  499.                       if(tempword1[i]!=tempword[i])//对比密码
  500.                          {
  501.                              key++;
  502.                          }
  503.                    }
  504.                    if(key==0)//如果第二次输入的密码与第一次相同
  505.                    {
  506.                        AT24C04_WritePage();  //写入新密码
  507.                            for(i=0;i<8;i++)
  508.                            {
  509.                                      tempword[i]=0;//清空缓存数组
  510.                                   tempword1[i]=0;//清空缓存数组
  511.                            }
  512.                           for(j=0;j<16;j++){
  513.     upxs[j]=tempxs4[j];
  514.                 dwxs[j]=tempxs5[j];
  515.    }
  516.                         key=0;
  517.                         menu=0;      //跳出密码修改菜单
  518.                   TR1=1;
  519.                         if(time2==2)                 //显示2秒
  520.                  {
  521.                          delete();
  522.                    TR1=0;                    //关闭定时器1
  523.                  }       
  524.                    }
  525.                    if(key!=0)//如果第二次输入的密码与第一次不同
  526.                    {
  527.                               for(i=0;i<8;i++)
  528.                            {
  529.                                      tempword[i]=0;//清空缓存数组
  530.                                   tempword1[i]=0;//清空缓存数组
  531.                            }
  532.                            dwxs[15]='n';
  533.                            dwxs[14]='i';
  534.                               dwxs[13]='a';
  535.                            dwxs[12]='g';
  536.                            dwxs[11]='a';
  537.                           key=0;
  538.                           menu=2;             //跳转到菜单2
  539.                    }
  540.                 }
  541.                 }
  542.          }
  543.          KeyValue=16;             //键值初始
  544. }
  545. //********************************************************************************************************************************
  546. /*模块名称:单函数区*/
  547. /*模块功能:一些单独功能的函数*/
  548. //********************************************************************************************************************************
  549. void sure(void)//密码认证函数//
  550. {
  551.      uchar i;
  552.     if(KeyValue==11)
  553.          {          
  554.          AT24C04_ReadPage();
  555.              for(i=0;i<6;i++)
  556.                  {        password[i]=BUF[i];
  557.                          if(password[i]!=tempword[i])//对比密码
  558.                         {
  559.                             key++;
  560.                         }
  561.                  }                   
  562.                  if(key==0)                //密码正确,输出OK
  563.                            {
  564.                                 dwxs[13]='O';
  565.                                 dwxs[14]='K';
  566.                           shuchu=1;                    //开门
  567.                                 TR1=1;            //定时器1打开,启动倒计时
  568.                                 moshi=0;          //输入正确密码可关闭报警模式
  569.                                 beep=0;           //蜂鸣器复位
  570.                                 TR0=0;                              //并且关闭定时器0
  571.                            }
  572.                  if(key!=0)           //密码错误,次数累加
  573.                         {
  574.                                 dwxs[12]='E';
  575.                                 dwxs[13]='R';
  576.                                 dwxs[14]='O';
  577.                                 dwxs[15]='R';
  578.                                 warn++;
  579.                                 if(warn==3)                    //输入错误3次,报警
  580.                                 {
  581.                                          keyboard=1;    //三次错误则键盘锁住
  582.                                    TR0=1;                      //定时器0启动
  583.                              moshi=2;                    //模式2启动蜂鸣器报警
  584.                                    warn=0;                    //累计清零
  585.                                          TR1=1;                //启动键盘锁定倒计时
  586.                                 }
  587.                         }
  588.          }
  589. }
  590. //************************************************************************************************************************************
  591. //附功能函数//
  592. //************************************************************************************************************************************
  593. void Add_Function(void)
  594. {
  595.           switch(time2)
  596.         {
  597.     case 4:{                     //门锁打开后4秒关闭
  598.                    shuchu=0;           //关闭门锁电源
  599.                    delete();                       //自动清除
  600.                    if(keyboard==0)     //如果不是密码错误开启的定时器则关闭定时器1
  601.                         {
  602.                                  time2 =0;         //time2复位
  603.                                  TR1=0;            //定时器1关闭
  604.       }
  605.       break;                       
  606.                 }
  607.     case 60:{                     //键盘锁定一分钟
  608.                          keyboard=0;         //键盘解锁
  609.                          time2 =0;           //time2复位
  610.                    TR1=0;                    //定时器1关闭
  611.                         break;
  612.                 }
  613.         }
  614. }
  615. //************************************************************************************************************************************
  616. //系统初始化函数//
  617. //************************************************************************************************************************************
  618. void System_init(void)
  619. {
  620.     TMOD=0x10;                                       //0001 0000//定时器1方式1,定时器0方式0
  621.           TH0=(8192-700)/32;                  //定时器0 700us 定时
  622.     TL0=(8192-700)%32;
  623.     TH1=(65536-50000)/256;  //定时器1 50ms
  624.     TL1=(65536-50000)%256;  
  625.     EA=1;  
  626.     ET0=1;
  627.           ET1=1;
  628.     shuchu=0;                                 //门锁初始化
  629.           beep=0;                                         //警报初始化
  630.           DoorBell=0;                                     //门铃初始化
  631.     lcd_init();                               //液晶初始化
  632. }
  633. //************************************************************************************************************************************
  634. /*模块名称:主函数*/
  635. /*模块功能:程序入口*/
  636. //************************************************************************************************************************************
  637. void main(void)//主函数
  638. {
  639.    
  640.         //AT24C04_WritePage();   //密码初始化(只需使用一次写入初始密码)
  641.         System_init();           //系统初始化
  642.         while(1)
  643.         {            
  644.                 if(keyboard==0)        //如果密码错误三次则锁定键盘
  645.          {
  646.                   KeyDown();                       //按键检测
  647.          }
  648.                 keysend();                         //数据传递
  649.                 lcdxianshi();                 //输入显示
  650.                 sure();                                   //密码认证
  651.                 condition_delete();    //按键清除
  652.                 new_password();        //密码修改
  653.     Add_Function();               //附功能函数
  654.         }                               
  655. }
  656. //************************************************************************************************************************************
  657. //结束
  658. //************************************************************************************************************************************
复制代码

下载:
电子锁源代码.zip (1.7 MB, 下载次数: 42)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:171085 发表于 2017-3-16 22:23 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

板凳
ID:171612 发表于 2017-3-17 18:35 | 只看该作者
谢谢楼主
回复

使用道具 举报

地板
ID:171666 发表于 2017-3-17 21:53 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

5#
ID:66287 发表于 2017-4-6 10:19 | 只看该作者
仿真不成功,怎么了?
回复

使用道具 举报

6#
ID:102963 发表于 2020-12-18 09:48 | 只看该作者
这资料乱七八糟的,根本就对不上!
回复

使用道具 举报

7#
ID:781892 发表于 2020-12-18 16:31 来自手机 | 只看该作者
比较完美
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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