找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机+LCD1602+16点键盘电子密码锁设计

[复制链接]
跳转到指定楼层
楼主
基于51单片机


单片机源程序如下:
  1. #include <intrins.h>
  2. #include <reg52.h>
  3. #define ulong unsigned long
  4. #define uint unsigned int
  5. #define uchar unsigned char
  6. uchar temp,num,flag,r;
  7. /******************************/
  8. //显示字符串定义
  9. uchar code table1[]="You are welcome";
  10. uchar code table3[]="******";
  11. uchar code table4[]="code is wrong!";
  12. uchar code table5[]="you are right!";
  13. uchar code table6[]="the second time!";
  14. uchar code table7[]="the last time!";
  15. uchar code table8[]="Input new password:";
  16. uchar code table9[]="Modify right!!!";
  17. uchar code table10[]="password:";
  18. uchar code table12[]="    calling....";
  19. uchar code table13[]="      ";
  20. uchar code table14[]="Input again:";
  21. uchar code table15[]="Modify error!!!";
  22. /******************************/
  23. uchar  init_password[6]={1,2,3,4,5,6};//定义原始密码存放的数组
  24. uchar  password[6]={0};//定义输入密码存放的数组
  25. /******************************/
  26. //1602位定义
  27. sbit lcdrs=P2^0;// 数据/指令
  28. sbit lcdrw=P2^1;// 读/写
  29. sbit lcden=P2^2;// 使能端
  30. /******************************/
  31. sbit beep=P3^7;
  32. /******************************/
  33. void delay(uint z);
  34. void init();
  35. void write_com(uchar com);
  36. void write_data(uchar dat1);
  37. void keyscan();
  38. void mima();
  39. void mima1();
  40. void delete();
  41. /******************************/
  42. //1602初始化设置
  43. void init()
  44. {
  45.         lcden=0;//使能
  46.         write_com(0x38);//显示模式设置
  47.         write_com(0x0e);//显示开关设置(显示有效、光标显示有效、光标闪烁无效)?
  48.         write_com(0x06);//光标移动设置(读或写一个字符后地址指针加一,光标加一,写一个字符串后,整屏显示不移动)
  49.         write_com(0x01);//显示清屏
  50.         write_com(0x80);//读忙       

  51. }
  52. /******************************/
  53. //向1602写指令
  54. void write_com(uchar com)
  55. {

  56.         lcdrs=0;//指令
  57.         lcdrw=0;//写
  58.         P0=com;//将指令代码送到P0口,通过数据线给1602
  59.         delay(5);
  60.         lcden=1;
  61.         delay(5);
  62.         lcden=0;//下降沿使能
  63. }
  64. /******************************/
  65. //向1602写数据
  66. void write_data(uchar dat1)
  67. {
  68.         lcdrs=1;//数据
  69.         lcdrw=0;//写
  70.         P0=dat1;
  71.         delay(5);
  72.         lcden=1;
  73.         delay(5);
  74.         lcden=0;//下降沿使能
  75. }
  76. /******************************/
  77. //延时子程序
  78. void delay(uint z)
  79. {
  80.         uint x,y;
  81.         for(x=z;x>0;x--)
  82.                 for(y=110;y>0;y--);
  83. }
  84. /******************************/
  85. //按键扫描子程序
  86. void keyscan()                 
  87. {
  88.                         P1=0x7f;
  89.                         temp=P1;
  90.                         temp=temp&0x0f;
  91.                         while(temp!=0x0f)
  92.                                 {
  93.                                         delay(5);
  94.                                         temp=P1;
  95.                                         temp=temp&0x0f;
  96.                                         while(temp!=0x0f)
  97.                                         {
  98.                                                 temp=P1;//按键消抖
  99.                                         switch(temp)
  100.                                                 {
  101.                                                         case 0x7e:num=0;flag=1;//按键0被按下,且0为有效的按键
  102.                                                                 break;
  103.                                                         case 0x7d:num=1;flag=1;//按键1被按下,且1为有效的按键
  104.                                                                 break;
  105.                                                         case 0x7b:num=2;flag=1;//按键2被按下,且2为有效的按键
  106.                                                                 break;
  107.                                                         case 0x77:num=3;flag=1;//按键3被按下,且3为有效的按键
  108.                                                                 break;
  109.                                                 }
  110.                                         while(temp!=0x0f)
  111.                                                 {
  112.                                                         temp=P1;
  113.                                                         temp=temp&0x0f;
  114.                                                 }
  115.                                         }
  116.                                 }

  117.                         P1=0xbf;
  118.                         temp=P1;
  119.                         temp=temp&0x0f;
  120.                         while(temp!=0x0f)
  121.                                 {
  122.                                         delay(5);
  123.                                         temp=P1;
  124.                                         temp=temp&0x0f;
  125.                                         while(temp!=0x0f)
  126.                                         {
  127.                                                 temp=P1;//消抖
  128.                                         switch(temp)
  129.                                                 {
  130.                                                         case 0xbe:num=4;flag=1;//按键4被按下,且4为有效的按键
  131.                                                                 break;
  132.                                                         case 0xbd:num=5;flag=1;//按键5被按下,且5为有效的按键
  133.                                                                 break;
  134.                                                         case 0xbb:num=6;flag=1;//按键6被按下,且6为有效的按键
  135.                                                                 break;
  136.                                                         case 0xb7:num=7;flag=1;//按键7被按下,且7为有效的按键
  137.                                                                 break;
  138.                                                 }
  139.                                         while(temp!=0x0f)
  140.                                                 {
  141.                                                         temp=P1;
  142.                                                         temp=temp&0x0f;
  143.                                                 }
  144.                                         }
  145.                                 }


  146.                         P1=0xdf;
  147.                         temp=P1;
  148.                         temp=temp&0x0f;
  149.                         while(temp!=0x0f)
  150.                                 {
  151.                                         delay(5);
  152.                                         temp=P1;
  153.                                         temp=temp&0x0f;
  154.                                         while(temp!=0x0f)
  155.                                         {
  156.                                                 temp=P1;
  157.                                         switch(temp)
  158.                                                 {
  159.                                                         case 0xde:num=8;flag=1;//按键8被按下,且8为有效的按键
  160.                                                                 break;
  161.                                                         case 0xdd:num=9;flag=1;//按键9被按下,且9为有效的按键
  162.                                                                 break;
  163.                                                         case 0xdb:num=10;//按键10被按下,且该键无效
  164.                                                                 break;
  165.                                                         case 0xd7:num=11;//按键11被按下,且该键无效
  166.                                                                 break;
  167.                                                 }
  168.                                         while(temp!=0x0f)
  169.                                                 {
  170.                                                         temp=P1;
  171.                                                         temp=temp&0x0f;
  172.                                                 }
  173.                                         }
  174.                                 }
  175.                         P1=0xef;
  176.                         temp=P1;
  177.                         temp=temp&0x0f;
  178.                         while(temp!=0x0f)
  179.                                 {
  180.                                         delay(5);
  181.                                         temp=P1;
  182.                                         temp=temp&0x0f;
  183.                                         while(temp!=0x0f)
  184.                                         {
  185.                                                 temp=P1;
  186.                                         switch(temp)
  187.                                                 {
  188.                                                         case 0xee:num=12;//按键12被按下,且该键无效
  189.                                                                 break;
  190.                                                         case 0xed:num=13;flag=1;//按键13,即修改密码键被按下,且13为有效的按键
  191.                                                                 break;
  192.                                                         case 0xeb:num=14;flag=1;//按键14,即退格键被按下,且14为有效的按键
  193.                                                                 break;
  194.                                                         case 0xe7:num=15;flag=1;//按键15,即输入密码键被按下,且15为有效的按键
  195.                                                                 break;
  196.                                                 }
  197.                                         while(temp!=0x0f)
  198.                                                 {
  199.                                                         temp=P1;
  200.                                                         temp=temp&0x0f;
  201.                                                 }
  202.                                         }
  203.                                 }



  204. }
  205. /******************************/
  206. void main()
  207. {
  208.     uchar m=0,w=0;
  209.         init();//1602初始化
  210.         for(r=0;r<15;r++)
  211.         {
  212.           delay(5);
  213.           write_data(table1[r]);       
  214.         }//显示欢迎界面

  215. write_com(0x0c);//显示,关光标
  216.         do
  217.         {                       
  218.                 keyscan();
  219.         }
  220.         while(num!=15);//在输入密码键按下之前一直进行键盘扫描
  221. mima();//子程序调用
  222.   while((password[m]==init_password[m])&m<6)
  223. {
  224.         m++;
  225. }
  226. if(m>=6)
  227. {
  228.        
  229.         mima1();//子程序调用       
  230. }
  231. else
  232.         {
  233.                 m=0;
  234.                 write_com(0x80+0x40);//显示从第二行开始
  235.                 for(r=0;r<14;r++)
  236.                         {
  237.                         delay(20);
  238.                         write_data(table4[r]);       
  239.                         }//显示密码错误
  240.             delay(2000);//延时
  241.                 init();//1602初始化       
  242.                 for(r=0;r<16;r++)
  243.                         {
  244.                         delay(20);
  245.                         write_data(table6[r]);       
  246.                         }//显示第二次输入
  247.                 delay(2000);
  248.              mima();
  249.                 while((password[m]==init_password[m])&m<6 )
  250.                         {
  251.                         m++;
  252.                         }
  253.                 if(m>=6)
  254.                         {
  255.                                 mima1();
  256.                         }
  257.                 else
  258.                        
  259.                         {
  260.                                 m=0;
  261.                                 write_com(0x80+0x40);
  262.                                 for(r=0;r<14;r++)
  263.                                 {
  264.                                 delay(20);
  265.                                 write_data(table4[r]);       
  266.                                 }//显示密码错误
  267.                                delay(2000);
  268.                                    init();//1602初始化       
  269.                                for(r=0;r<14;r++)
  270.                                 {
  271.                                 delay(20);
  272.                                 write_data(table7[r]);       
  273.                                 }//最后一次机会
  274.                                 delay(2000);
  275.                                 mima();
  276.                                
  277.                                 while((password[m]==init_password[m])&m<6)
  278.                                         {
  279.                                         m++;
  280.                                         }
  281.                                         if(m>=6)
  282.                                                 {
  283.                                
  284.                                                 mima1();
  285.                                                 }
  286.                                         else
  287.                                         {       
  288.                                                 init();
  289.                                                 write_com(0x80+0x40);
  290.                                                 for(r=0;r<14;r++)
  291.                                                 {
  292.                                                 delay(20);
  293.                                                 write_data(table12[r]);
  294.                                                 }//显示报警
  295.                                         write_com(0x0c);                                     
  296.                                                   while(1)
  297.                                                            {
  298.                                                         delay(1);
  299.                                                         beep=~beep;                                       
  300.                                                          }//喇叭发出警报音
  301.                                         }
  302.                        
  303.                                

  304.                         }



  305.        
  306.                 }
  307.                

  308. }

  309. void mima()
  310. {       
  311.                 uchar w=0;
  312.                 init();
  313.                 for(r=0;r<9;r++)
  314.                         {
  315.                         delay(20);
  316.                         write_data(table10[r]);       
  317.                         }//显示请输入密码
  318.         do
  319.           {       
  320.             flag=0;
  321.             keyscan();
  322.                 write_com(0x80+9+w);//接着password:后第w位处显示
  323.                 if(flag==1&&num<=9)//输入的是0—9的情况下
  324.                  {
  325.                           password[w]=num;//将输入的数存入数组的相应位
  326.                           write_data(table3[w]);//1602显示*
  327.                           w++;//位数加一
  328.                         if(w==6)
  329.                     write_com(0x0c);//六位都输入后,显示从屏幕左方开始       
  330.                  }
  331.                 if(flag==1&&num==14)//如果退格键被按下       
  332.                         {
  333.                                 w--;//位数减一
  334.                                 if(w==255)
  335.                                         w=w+1;//如果位数变成-1,即255,则加一,变成0
  336.                                 write_com(0x80+9+w);//从字符串后第w位处开始显示
  337.                                 write_data(table13[w+1]);//显示*       
  338.                                 if(flag==1&&num<=9)
  339.                                  {
  340.                                   password[w]=num;
  341.                                   write_data(table3[w]);                               
  342.                                 }       
  343.                          }
  344.     }        while(w<=5);

  345. }

  346. void mima1()
  347. {       

  348.         uchar f=0,n=0,d=0;
  349.                 write_com(0x80+0x40); //从第二行开始显示
  350.                         for(r=0;r<14;r++)
  351.                         {
  352.                         delay(20);
  353.                         write_data(table5[r]);//显示密码正确       
  354.                         }
  355.                         delay(2000);
  356.                                         do
  357.                                         {               
  358.                                                 num=16;
  359.                                                 keyscan();
  360.                                         }while(num!=13);//在改密码键按下前一直扫描键盘                       
  361.                                                         if(flag==1&&num==13)
  362.                                                         {
  363.                                                                 init();//显示初始化
  364.                                                                 for(r=0;r<15;r++)
  365.                                                                 {
  366.                                                                 delay(20);
  367.                                                                 write_data(table8[r]);//显示输入新密码
  368.                                                                 }
  369.                                                                 write_com(0x0c);//显示,关光标
  370.                                                                 write_com(0x80+0x40+n);//从第二行开始显示
  371.                                                                 write_com(0x0e);//显示开关初始化
  372.                                                         }
  373.                                         do{       
  374.                                                 num=16;
  375.                                                 keyscan();       
  376.                                                 write_com(0x80+0x40+n);                                                                       
  377.                                                 if(flag==1&&num<=9)
  378.                                                          {
  379.                                 init_password[n]=num;//将输入值存入新的密码数组的相应位
  380.                                                           write_data(table3[n]);//显示*
  381.                                                           n++;
  382.                                                                 if(n==6)
  383.                                                             write_com(0x0c);       
  384.                                                          }
  385.                                                         if(flag==1&&num==14)       
  386.                                                                         {
  387.                                                                                 n--;//如果退格键按下,左移一位
  388.                                                                                 if(n==255)
  389.                                                                                 n=n+1;//如果n减为负值则从0开始
  390.                                                                                 write_com(0x80+0x40+n);//从相应位置开始显示
  391.                                                                                 write_data(table13[n]);//显示空字符       
  392.                                                                                 if(flag==1&&num<=9)
  393.                                                                                          {
  394.                                                                                           password[n]=num;
  395.                                                                                           write_data(table3[n]);                               
  396.                                                                                         }       
  397.                                                                          }                                               
  398.                                         }
  399.                                                 while(n<=5);

  400.                                                 init();
  401.                                         for(r=0;r<12;r++)
  402.                                         {
  403.                                         delay(20);
  404.                                         write_data(table14[r]);       
  405.                                         }//显示重新输入
  406.                                         do
  407.                                           {       
  408.                                                     flag=0;
  409.                                             keyscan();
  410. ……………………

  411. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
LCD1602 16点键盘.zip (44.44 KB, 下载次数: 31)


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

使用道具 举报

无效楼层,该帖已经被删除
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

Powered by 单片机教程网

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