找回密码
 立即注册

QQ登录

只需一步,快速开始

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

独立按键密码锁程序+流程图

[复制链接]
跳转到指定楼层
楼主
ID:70976 发表于 2014-12-27 16:53 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 daniu 于 2014-12-27 16:55 编辑

这是流程图

  1. //===============================================================
  2. //程序编写人:兰建文
  3. //编写地点
  4. //时间7月9日晚上  星期四
  5. //功能:本程序实现任意四个按键长按3S,连按3次(两次按键间隔不得等
  6. //于1S),再按一下密码确认键,正确显示“GOOD”,不正确显示“BAD”,
  7. //实现独立按键密码锁功能。利用定时器实现按键消抖。数码管为共阳极,
  8. //低电平点亮.
  9. //===============================================================
  10. #include <reg51.h>      //定义8051单片机所有I/O口
  11. #define  uchar  unsigned char
  12. #define  Key    P1      //定义按键输入口
  13. #define  OutPut P2      //定义输出口
  14. #define  PianXuan P3              //定义片选口
  15. bit    Bt0;              //节拍标志位
  16. bit    AnJian1;       //按键标志位
  17. bit    AnJian2;       //有按键按下标志位
  18. bit    ChangAn;       //长按标志位
  19. bit    LianAn;       //连按标志位      
  20. uchar  TimeCount1;      //长按计时1S变量
  21. uchar  TimeCount2;      //连按间隔计时1S变量
  22. uchar  LianAnCount;      //连按次数变量
  23. uchar code  tempt1[]={0x0c0,0x0F9,0x0A4,0x0B0,0x99,0x92,0x82,0x0F8,0x80,0x90};//共阳数据代码
  24. uchar code  tempt2[]={0x90,0xc0,0xc0,0xa1};           //“GOOD”代码
  25. uchar code  tempt3[]={0x83,0x88,0xa1};            //“BAD”代码
  26. void DeLayMS(uchar N);    //声明延时函数
  27. main()        //主函数
  28. {                  
  29. TMOD=0x01;                      //开定时器及开定时器中断
  30. TH0=0xb1;
  31. TL0=0xe0;
  32.     TR0=1;
  33.     EA=1;
  34.     ET0=1;         
  35. LianAn=0;      //标志位复位
  36. ChangAn=0;
  37. Bt0=0;
  38. TimeCount1=150;
  39. TimeCount2=50;
  40. AnJian1=0;
  41. AnJian2=0;
  42. LianAnCount=0;      
  43. while(1)      //死循环
  44. {
  45.   if((Key&0x10)==0x10)  //判断确认密码按键是否按下
  46.   {
  47.    OutPut=0xbf;   //没按下就显示“------”
  48.    PianXuan=0xff;
  49.   }
  50.   else
  51.   {
  52.    if(ChangAn&&LianAn)  //按下了,判断是否有长按和连按
  53.    {
  54.     while(1)    //有长按和连按,则显示“GOOD”
  55.     {
  56.      uchar i,b=0x02;
  57.      for(i=0;i<4;i++)
  58.      {
  59.       OutPut=tempt2;
  60.       PianXuan=b;
  61.       DeLayMS(1);
  62.       PianXuan=0x00;
  63.       b=b<<1;
  64.      }
  65.     }
  66.    }
  67.    else       //没长按和连按,则显示“BAD”
  68.    {
  69.     while(1)
  70.     {
  71.      uchar i,b=0x02;
  72.      for(i=0;i<3;i++)
  73.      {
  74.       OutPut=tempt3;
  75.       PianXuan=b;
  76.       DeLayMS(1);
  77.       PianXuan=0x00;
  78.       b=b<<1;
  79.      }
  80.     }
  81.    }
  82.   }
  83.   if(Bt0==1)        //等待节拍
  84.   {         
  85.    Bt0=0;        //节拍标志位清零
  86.    if(AnJian2==1)      //判断是否有键按下
  87.    {
  88.     if(TimeCount2--==0)    //判断下一次按键间隔是否为1S
  89.     {
  90.      LianAnCount=0;    //为1S,复位
  91.      TimeCount2=50;
  92.      AnJian2=0;
  93.     }
  94.     else
  95.     {
  96.      if(LianAnCount==3) //不为1S,则判断是否连续按键3次
  97.      {
  98.       LianAn=1;  //有3次则连按标志位置1
  99.       TimeCount2=50;
  100.       AnJian2=0;
  101.       LianAnCount=0;
  102.      }
  103.     }
  104.    }
  105.    if((Key&0x0f)!=0x0f)  //判断是否有键按下
  106.    {
  107.     if(AnJian1==0)   //有键按下,判断按键标志位是否为0,20MS消抖作用
  108.     {
  109.      AnJian1=1;   //为1,则按键标志位置1
  110.      AnJian2=1;   //有键按下标志位置1
  111.      TimeCount2=50;  //连按计时复位
  112.      LianAnCount++;     //按键次数加1
  113.     }
  114.     else   
  115.     {
  116.      if(TimeCount1--==0)  //为1判断按键是否一直按了3S
  117.       ChangAn=1;   //按了3S,则长按标志位置1
  118.      if((Key&0x0f)==0x0f) //判断按键是否还按着
  119.      {
  120.       TimeCount1=150;  //抬起了,则长按计时复位
  121.       AnJian1=0;   //按键标志位清0
  122.      }
  123.     }
  124.    }
  125.    else
  126.    {
  127.     if((Key&0x0f)==0x0f)
  128.     {
  129.      TimeCount1=150;
  130.      AnJian1=0;
  131.     }
  132.    }
  133.   }
  134. }
  135. }
  136. void T0Ser(void) interrupt 1 using 0   //定时器服务函数
  137. {
  138. TH0=0xb1;
  139.     TL0=0xe0;
  140. Bt0=1;
  141. }
  142. void DeLayMS(uchar N)       //延时函数
  143. {
  144. uchar i,j;
  145. for(i=N;i>0;i--)
  146.   for(j=50;j>0;j--);  
  147. }
复制代码




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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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