找回密码
 立即注册

QQ登录

只需一步,快速开始

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

新手设计的简易单片机密码锁 LCD1602显示

[复制链接]
跳转到指定楼层
楼主
ID:248410 发表于 2017-11-11 16:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
新手设计的简易密码锁
单片机源程序如下:
  1. /**************************************************************************************
  2. *                              LCD1602液晶显示实验                                                                                                  *
  3. 实现现象:        具体接线操作请参考视频教程
  4.                         下载程序后插上LCD1602液晶在开发板上,即可显示
  5. 注意事项:                                                                                                                                                                  
  6. ***************************************************************************************/

  7. #include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器
  8. #include "lcd.h"

  9. typedef unsigned int u16;          //对数据类型进行声明定义
  10. typedef unsigned char u8;



  11. #define GPIO_DIG P0
  12. #define GPIO_KEY P1
  13. sbit beep=P3^5;
  14. sbit motor=P3^6;
  15. u8 KeyValue;        //用来存放读取到的键值
  16. int count=0;    //用来存放按键的次数
  17. u8 Disp[]="set initial code";
  18. u8 DispCode[]="input code";

  19. u8 Dispcorrect[]="welcome back";

  20. u8 Disperror[]="catch thief";
  21. char code1[8],inicode[8];

  22. /*******************************************************************************
  23. * 函 数 名         : delay
  24. * 函数功能                   : 延时函数,i=1时,大约延时10us
  25. *******************************************************************************/
  26. void delay(u16 i)
  27. {
  28.         while(i--);       
  29. }



  30. sbit LSA=P2^2;
  31. sbit LSB=P2^3;
  32. sbit LSC=P2^4;

  33. u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  34.                                         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};           //显示0~F的值
  35. /****************************************************
  36. 函数名:        DigDisplay 数码管显示函数
  37. 函数功能:        输入显示的数字和点亮的数码管x,i;在对应的数码管上显示对应的数                               
  38. *****************************************************/


  39. void DigDisplay(int x,int i)                      //输入显示的数字和点亮的数码管x,i
  40. {

  41.          
  42.        
  43.        
  44.                 switch(i)         //位选,选择点亮的数码管,
  45.                 {
  46.                         case(0):
  47.                                 LSA=0;LSB=0;LSC=0; break;//显示第0位
  48.                         case(1):
  49.                                 LSA=1;LSB=0;LSC=0; break;//显示第1位
  50.                         case(2):
  51.                                 LSA=0;LSB=1;LSC=0; break;//显示第2位
  52.                         case(3):
  53.                                 LSA=1;LSB=1;LSC=0; break;//显示第3位
  54.                         case(4):
  55.                                 LSA=0;LSB=0;LSC=1; break;//显示第4位
  56.                         case(5):
  57.                                 LSA=1;LSB=0;LSC=1; break;//显示第5位
  58.                         case(6):
  59.                                 LSA=0;LSB=1;LSC=1; break;//显示第6位
  60.                         case(7):
  61.                                 LSA=1;LSB=1;LSC=1; break;//显示第7位       
  62.   }
  63.         P0=smgduan[x];//发送段码
  64.         P0=0x00;//消隐       
  65.                 delay(100); //间隔一段时间扫描       
  66.          
  67.        
  68. }
  69. /***************************************************
  70. 函数名:KeyDown
  71. 矩阵键盘
  72. 1   2    3   A
  73. 4   5    6   B
  74. 7   8    9   C
  75. *   0    #   D
  76. 函数功能:
  77. 注意重点:成功按下一次后count记一次数,count初值为0
  78. ***************************************************/
  79. void KeyDown()
  80. {
  81.         int        a=0;
  82.         int i=0;
  83.        
  84.         GPIO_KEY=0x0f;
  85.         if(GPIO_KEY!=0x0f)        //读取按键是否按下
  86.         {
  87.                 delay(1000);                    //延时10ms进行消抖
  88.                 if(GPIO_KEY!=0x0f)      //再次检测键盘是否按下
  89.                 {       
  90.                         count++;              //按键按下一次记一次数
  91.                                               //测试列
  92.                         GPIO_KEY=0X0F;
  93.                         switch(GPIO_KEY)
  94.                         {
  95.                                 case(0X07):        KeyValue=1;break;
  96.                                 case(0X0b):        KeyValue=2;break;
  97.                                 case(0X0d): KeyValue=3;break;
  98.                                 case(0X0e):        KeyValue=10;break;
  99.                         }
  100.                 }
  101.         }
  102.                         //测试行
  103.                         /* 找出第四列单独处理*/
  104.                         if(GPIO_KEY==0X0e)
  105.                 {
  106.                         GPIO_KEY=0XF0;
  107.                         switch(GPIO_KEY)
  108.                         {
  109.                                 case(0X70):        KeyValue=KeyValue;break;
  110.                                 case(0Xb0):        KeyValue=KeyValue+1;break;
  111.                                 case(0Xd0): KeyValue=KeyValue+2;break;
  112.                                 case(0Xe0):        KeyValue=KeyValue+3;break;
  113.                         }
  114.                 }
  115.                 //第一二三列的处理
  116.                 else
  117.                 {
  118.                         GPIO_KEY=0XF0;
  119.                         //单独处理第四行
  120.                         if(GPIO_KEY==(0Xe0)&&KeyValue==1)
  121.                                 KeyValue='*';
  122.                         if(GPIO_KEY==(0Xe0)&&KeyValue==2)
  123.                                 KeyValue=0;
  124.                         if(GPIO_KEY==(0Xe0)&&KeyValue==3)
  125.                                 KeyValue='#';
  126.                                
  127.                         switch(GPIO_KEY)
  128.                         {
  129.                                 case(0X70):        KeyValue=KeyValue;break;
  130.                                 case(0Xb0):        KeyValue=KeyValue+3;break;
  131.                                 case(0Xd0): KeyValue=KeyValue+6;break;
  132.                                
  133.                         }
  134.                 }
  135.                 while((a<50)&&(GPIO_KEY!=0xf0))         //检测按键松手检测
  136.                         {
  137.                                 delay(1000);
  138.                                 a++;
  139.                         }
  140.        
  141.        
  142.   
  143.                 
  144. }
  145.                

  146. /*******************************************************************************
  147. * 函 数 名         : main
  148. * 函数功能                   : 主函数
  149. * 输    入         : 无
  150. * 输    出         : 无
  151. *******************************************************************************/
  152. void main()
  153. {
  154.        
  155.         u8 i;
  156.         int inicount;
  157.         int j,flag=0,count1=0,j1=0;
  158.         LcdInit();
  159.         for(i=0;i<16;i++)          //显示set initial code
  160.           {
  161.                 LcdWriteData(Disp[i]);
  162.                         delay(1000000);
  163.           }       
  164.          delay(100000000);
  165.         LcdWriteCom(0x01);           //清屏
  166.         KeyValue=0;                  //给KeyValue一个初值,避免乱码
  167.         motor=0;                      //给motor一个初值,避免乱转

  168. while(KeyValue!='#'||count<8)
  169.                 {                                          //按键判断函数  输入初始密码 并存入inicode
  170.                                 KeyDown();
  171.                
  172.                         if(inicount!=count)
  173.                         {
  174.                inicode[count1]=KeyValue;
  175.                                 count1++;
  176.                                 beep=0;
  177.                                 delay(200);
  178.                                 beep=1;
  179.                                
  180.                                
  181.                         }
  182.                
  183.                         DigDisplay(count1,4);
  184.                         DigDisplay(KeyValue,0);
  185.                         inicount=count;
  186.        
  187.                 }       
  188.        
  189.                        
  190.         i=0;       
  191.   while(i<200)                  //在数码管显示inicode
  192.             {
  193.                           for(j=0;j<8;j++)
  194.                     DigDisplay(inicode[j],j);
  195.                                        
  196.                     i++;       
  197.             }

  198.         while(1)
  199.         {   
  200.                
  201.                 for(i=0;i<10;i++)
  202.                 {
  203.     LcdWriteData(DispCode[i]);
  204.                         delay(10000);
  205.                 }
  206.                
  207.         KeyValue=0;               
  208.         count=0;
  209.         count1=0;
  210.         inicount=0;
  211.   P0=0X00;
  212.                 flag=0;       
  213.                 while(KeyValue!='#'||count<8)
  214.                 {                                          //按键判断函数  输入密码并存入code1
  215.                                 KeyDown();
  216.                
  217.                         if(inicount!=count)
  218.                         {
  219.                code1[count1]=KeyValue;
  220.                                 count1++;
  221.                                 beep=0;
  222.                                 delay(200);
  223.                                 beep=1;
  224.                         }
  225.                                 DigDisplay(count1,4);
  226.                         DigDisplay(KeyValue,0);
  227.                         inicount=count;
  228.        
  229.                 }       
  230.        
  231.        
  232.                 i=0;
  233.                
  234.   while(i<200)
  235.             {
  236.                           for(j=0;j<8;j++)
  237.                     DigDisplay(code1[j],j);
  238.                     i++;
  239.             }
  240.                        
  241.         P0=0X00;        LcdWriteCom(0x01);           //清屏
  242.       flag=1;                       
  243.                         for(j=0;j<8;j++)        
  244.                   {
  245.                 if(code1[j]==inicode[j])     //密码匹配
  246.                                         ++flag;
  247. ……………………

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

所有资料51hei提供下载:
密码锁.zip (51.32 KB, 下载次数: 55)


评分

参与人数 1黑币 +3 收起 理由
萌新哦 + 3 赞一个!

查看全部评分

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

使用道具 举报

沙发
ID:330406 发表于 2018-5-17 22:37 | 只看该作者
学习一下
回复

使用道具 举报

板凳
ID:335339 发表于 2018-5-21 23:02 | 只看该作者
新手来学习学习
回复

使用道具 举报

地板
ID:139308 发表于 2018-5-23 16:44 | 只看该作者
为啥子下不来,505
回复

使用道具 举报

5#
ID:336931 发表于 2018-5-23 22:35 | 只看该作者
我来看下下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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