找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1160|回复: 0
收起左侧

接上次密码锁 两次密码不正确 自动锁 单片机源程序

[复制链接]
ID:812531 发表于 2021-1-14 11:32 | 显示全部楼层 |阅读模式
  1. #include <reg52.h>

  2. typedef unsigned char uchar;
  3. typedef unsigned int uint;

  4. sbit RS = P1^0;
  5. sbit RW = P1^1;
  6. sbit EN = P2^5;
  7. sbit key=P3^4;

  8. unsigned char KeyPro();
  9. unsigned char num1;
  10. unsigned char code mi[]={1,2,3,4};
  11. bit Flag;
  12. //?????,??????
  13. void delayms(unsigned int xms)
  14. {
  15.    unsigned i,j;
  16.         for(i=xms;i>0;i--)
  17.            for(j=110;j>0;j--);
  18. }

  19. void Read_Busy()
  20. {
  21.         uchar busy;
  22.         P0 = 0xff;
  23.         RS = 0;
  24.         RW = 1;
  25.         do
  26.         {
  27.                 EN = 1;
  28.                 busy = P0;
  29.                 EN = 0;
  30.         }while(busy & 0x80);
  31. }
  32. //?LCD1602??????
  33. void Write_Cmd(uchar cmd)
  34. {
  35.         Read_Busy();//???
  36.         RS = 0;
  37.         RW = 0;
  38.         P0 = cmd;
  39.         EN = 1;
  40.         EN = 0;
  41. }
  42. //???????
  43. void Write_Dat(uchar dat)
  44. {
  45.         Read_Busy();
  46.         RS = 1;
  47.         RW = 0;
  48.         P0 = dat;
  49.         EN = 1;
  50.         EN = 0;
  51. }
  52. void charter(unsigned char x,unsigned char y,unsigned char dat)
  53. {
  54. if(y==0)
  55. {
  56. Write_Cmd(0x80+x);
  57. }
  58. else
  59. {
  60. Write_Cmd(0xc0+x);

  61. }
  62. Write_Dat( dat);  
  63. }
  64. void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
  65. {     
  66. if (y == 0)
  67.         {     
  68. Write_Cmd(0x80 + x);     
  69.         }
  70. else
  71.         {     
  72. Write_Cmd(0xC0 + x);     
  73.         }        
  74. while (*s)
  75.         {     
  76. Write_Dat( *s);     
  77. s ++;     
  78.         }
  79. }
  80. void lcdinit()
  81. {
  82.    Write_Cmd(0x38);  
  83.    Write_Cmd(0x08);    /*????*/
  84.    Write_Cmd(0x01);    /*????*/
  85.    Write_Cmd(0x06);    /*????????*/
  86.    Write_Cmd(0x0C);    /*????????*/
  87. }
  88. void main()
  89. {
  90.         unsigned char a[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
  91.         unsigned char i,num,j,b;
  92.         unsigned char temp[4];
  93. lcdinit();         

  94.      LCD_Write_String(0,0,"secret code:1234");      
  95.         LCD_Write_String(0,1,"input password");      

  96. while(1)
  97. {
  98.                 num=KeyPro();

  99. if(num!=0xff)
  100. {      

  101.         if(i==0)
  102.         {   
  103. LCD_Write_String(0,1,"                ");
  104.         }
  105. if(i<4)
  106. {   
  107.         
  108. temp[i]=num;
  109.     charter(0+i,1,'0'+num);    [/i][i]  //charter(0+i,1,'0'+num);     这里可用‘*’ 代替[/i][i]
  110. }

  111. i++;
  112. if(i==5)
  113. {
  114. i=0;
  115.         Flag=1;
  116.         for(j=0;j<4;j++)
  117.         {
  118.          Flag=Flag&&(temp[j]==mi[j]);
  119.                 if(Flag)
  120.                 {
  121. LCD_Write_String(0,1,"right open");      
  122.                 }
  123.                 else
  124.                 {
  125.                 LCD_Write_String(0 ,0,"wrong retry              ");
  126.                                                                         LCD_Write_String(0,1,"                ");
  127.                                                                
  128.                                                                         if(b<4)
  129. {   
  130.                                 
  131. temp[b]=num;
  132.         if(b==0)
  133.                                                                         {
  134.                                                                                 LCD_Write_String(0,1,"                ");
  135.                                                                         
  136.     charter(0+b,1,'0'+num);      [/b][/i]
  137. [i] //charter(0+i,1,'0'+num);     这里可用‘*’ 代替[/i][i][b]           
  138. }
  139.   }
  140. b++;
  141. if(b==5)
  142. {
  143. b=0;
  144.         Flag=1;
  145.         for(j=0;j<4;j++)
  146.         {
  147.          Flag=Flag&&(temp[j]==mi[j]);
  148.                 if(Flag)
  149.                 {
  150. LCD_Write_String(0,1,"right open");      
  151.                 }
  152.                 else
  153.                 {
  154.                                                                          LCD_Write_String(0 ,0,"no chance");
  155.                 LCD_Write_String(0 ,1,"wait police");
  156.                                                                         while(1)
  157.                                                                         {
  158.                                                                         P1=0x0f;
  159.                                                                         }
  160.                                                                         
  161.                 }
  162.         }
  163. }
  164. }

  165.         }
  166. }
  167. }
  168. }
  169. }

  170. unsigned char KeyScan(void)  //??????,?????????
  171. {
  172. unsigned char temp,num;//???????
  173. P3=0x0f;            //??????0
  174. temp=P3&0x0f;     //?????
  175. if(temp!=0x0f)    //?????????
  176. {
  177.   delayms(10);        //??
  178.   if((P3&0x0f)!=0x0f)
  179.   {
  180.    temp=P3&0x0f;  //?????
  181.     P3=temp|0xf0;  //???????
  182.     num=P3&0xf0;  //?????

  183.     while((P3&0xf0)!=0xf0);//???????

  184.     return(temp+num);//????????
  185.    }
  186.   }     //????
  187. }
  188. /*
  189. unsigned char KeyPro(void)
  190. {
  191. switch(KeyScan())
  192. {
  193.   case 0x7e:num1=0;break;//0 ??????????????
  194.   case 0x7d:num1=1;break;//1
  195.   case 0x7b:num1=2;break;//2
  196.   case 0x77:num1=3;break;//3
  197.   case 0xbe:num1=4;break;//4
  198.   case 0xbd:num1=5;break;//5
  199.   case 0xbb:num1=6;break;//6
  200.   case 0xb7:num1=7;break;//7
  201.   case 0xde:num1=8;break;//8
  202.   case 0xdd:num1=9;break;//9
  203.   case 0xdb:num1=10;break;//a
  204.   case 0xd7:num1=11;break;//b
  205.   case 0xee:num1=12;break;//c
  206.   case 0xed:num1=13;break;//d
  207.   case 0xeb:num1=14;break;//e
  208.   case 0xe7:num1=15;break;//f
  209.   default:return 0xff;break;
  210. }
  211. }
  212. */
  213. unsigned char KeyPro(void)
  214. {
  215. switch(KeyScan())
  216. {
  217.   case 0x7e:return 0;break;//0 ??????????????
  218.   case 0x7d:return 1;break;//1
  219.   case 0x7b:return 2;break;//2
  220.   case 0x77:return 3;break;//3
  221.   case 0xbe:return 4;break;//4
  222.   case 0xbd:return 5;break;//5
  223.   case 0xbb:return 6;break;//6
  224.   case 0xb7:return 7;break;//7
  225.   case 0xde:return 8;break;//8
  226.   case 0xdd:return 9;break;//9
  227.   case 0xdb:return 10;break;//a
  228.   case 0xd7:return 11;break;//b
  229.   case 0xee:return 12;break;//c
  230.   case 0xed:return 13;break;//d
  231.   case 0xeb:return 14;break;//e
  232.   case 0xe7:return 15;break;//f
  233.   default:return 0xff;break;
  234. }
  235. }

复制代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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