查看: 1325|回复: 0
打印 上一主题 下一主题

密码锁

[复制链接]
跳转到指定楼层
沙发
发表于 2015-4-15 12:45:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg52.h>
#define uchar unsigned char
#define uint  unsigned  int       
uchar duan[11]={0xbf,0xc0,0Xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};         //所需的段的位码
//uchar wei[6]={0X7f,0Xbf,0Xdf,0Xef,0xf7,0xfb};    //位的控制端        (开发板)
uchar wei[6]={0X80,0X40,0X20,0X10,0x08,0x04};      //位的控制端        (仿真)
uchar aj[6]={0xbf,0Xbf,0xbf,0xbf,0xbf,0xbf};
uchar z,x,c,v,b,n;        //定义数据类型
uchar  count;
uchar  pwflag;//密码是否正确的标志位
uchar  pwflag;//密码是否正确的标志位
uchar m[]={1,2,3,4,5,6}; //初始密码
static uchar mbuf[6];///输入的密码
/******************************************************************

延时函数

******************************************************************/
void delay(uchar t)
{
  uchar i,j;
   for(i=0;i<t;i++)
   {
            for(j=1000;j>0;j--);
         { ;
         }
   }
}

/**********************************************************************
                数码管动态扫描
*********************************************************************/
void xianshi()
{
/*****************数据转换*****************************/

          P2=wei[0];
          P0=duan[mbuf[0]];
          delay(1);  
            P2=wei[1];
      P0=duan[mbuf[1]];
          delay(1);  
             P2=wei[2];
      P0=duan[mbuf[2]];
          delay(1);  
      P2=wei[3];
      P0=duan[mbuf[3]];
          delay(1);
          P2=wei[4];
      P0=duan[mbuf[4]];
          delay(1);
          P2=wei[5];
      P0=duan[mbuf[5]];
          delay(1);
}
/*************************************************************************
                                密码对错判断       
**************************************************************************/
bit pwcmp(void)
{
        bit flag;
        uchar i;
        for (i=0;i<6;i++)
        {
                if (m==mbuf)   flag = 1;   //*密码正确*/
                else  {        flag = 0;  i=6; } //*密码错误*/
        }
        return(flag);
}
/*************************************************************************
                                取键值       
**************************************************************************/
uchar getkey(void)///得到键值
{
uchar h,l,k;
while(P1!=0x0f)
  {
   h=P1&0x0f;
   P1=0xf0;
   l=P1&0xf0;
   k=h|l;
   return(k);
  }
}
/*************************************************************************
                              串口发送数据
**************************************************************************/
void disp(void)
{
uchar i;
for(i=6;i>=0;i--)
{
SBUF=68;//mbuf;
while(!TI);
TI=0;
}
}
/*************************************************************************
                              恢复初始值
**************************************************************************/
void chushiz(void)
{          count=0;
      P2=wei[0];
          P0=duan[mbuf[0]];
          delay(1);  
            P2=wei[1];
      P0=duan[mbuf[1]];
          delay(1);  
             P2=wei[2];
      P0=duan[mbuf[2]];
          delay(1);  
      P2=wei[3];
      P0=duan[mbuf[3]];
          delay(1);
          P2=wei[4];
      P0=duan[mbuf[4]];
          delay(1);
          P2=wei[5];
      P0=duan[mbuf[5]];
          delay(1);
}
/*************************************************************************
                                判断键值       
**************************************************************************/
void Getch (uchar i)
{

switch (i) //判断键值(那一个键按下)
{
case 0xe7: if (count<6) { mbuf[count]=1; count++;SBUF=65;while(!TI);TI=0;}break;
case 0xd7: if (count<6) { mbuf[count]=2; count++;SBUF=66;while(!TI);TI=0;}break;
case 0xb7: if (count<6) { mbuf[count]=3; count++;SBUF=67;while(!TI);TI=0;}break;
case 0x77: if (count<6) { mbuf[count]=4; count++;SBUF=68;while(!TI);TI=0;}break;
case 0xeb: if (count<6) { mbuf[count]=5; count++;SBUF=69;while(!TI);TI=0;}break;
case 0xdb: if (count<6) { mbuf[count]=6; count++;SBUF=70;while(!TI);TI=0;}break;
case 0xbb: if (count<6) { mbuf[count]=7; count++;SBUF=71;while(!TI);TI=0;}break;
case 0x7b: if (count<6) { mbuf[count]=8; count++;SBUF=72;while(!TI);TI=0;}break;
case 0xed: if (count<6) { mbuf[count]=9; count++;SBUF=73;while(!TI);TI=0;}break;
case 0xdd: if (count<6) { mbuf[count]=10;count++;SBUF=74;while(!TI);TI=0;}break;
case 0xbd: if (count==6) { pwflag = pwcmp();} else  pwflag = 0;
if(pwflag) {P3=0Xaa;} else {P3=0X00;}break;
case 0x7d: if (count<=6) {count=0;}break;

} }

/*************************************************************************
                     串口初始化,波特率9600,方式1
**************************************************************************/
void Init_Com(void)
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd;
TL1 = 0xFd;
TR1 = 1;
}

/*************************************************************************
                                主函数       
**************************************************************************/
void main()
{

uchar key;
Init_Com();//串口初始化
count=0;
P0=0xbf;
while(1)
        {
P1=0x0f;
if(P1!=0x0f)  
{
  delay(400);

  key=getkey();
  Getch(key);
  delay(400);

} /*
if ( RI ) //扫描判断是否接收到数据,
        {
          date = SBUF; //接收数据SBUF赋与dat
          RI=0; //RI 清零。
          SBUF = date; //在原样把数据发送回去
                  
         }        */
  xianshi();

}
}       



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?加入因仑

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

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