⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 linshi.c

📁 MSC51的密码锁程序
💻 C
📖 第 1 页 / 共 2 页
字号:
bit keycmp(void)
{
  bit flag;
  unsigned char i;
  for (i=0;i<4;i++)
    {
       if (keyword[i]==keyinterim[i])
          flag = 1;
       else
         {
           flag = 0;
           i = 4;
         }
     }
  return(flag);
}



void Resetkey(void)
{/*r1*/
  unsigned char j,key;
  int wait1,wait;
  int xunhuan0=1;                          // 定义循环0的控制字符
  int xunhuan1=1;                          // 定义循环1的控制字符
  while(xunhuan0)
    {/*W11*/
      key = keyscan();                     // 调用键盘扫描函数
      switch(key) 
      {/*S11*/
        case 0x11:                         // 1行1列,数字7
          if (recount<4)
            {
              font[recount] = 7;                
              keyinterim[recount] = 7;
              recount++;
            }
          break;
        case 0x21:                          // 1行2列,数字8
          if (recount<4)
            {
              font[recount] = 8;                      
              keyinterim[recount] = 8;
              recount++;
            }
           break;			  
        case 0x41:                          // 1行3列,数字9
          if (recount<4)
            {
              font[recount] = 9;                     
              keyinterim[recount] = 9;
              recount++;
            }
          break;               
        case 0x12:                          // 2行1列,数字4
          if (recount<4)
            {
              font[recount] = 4;                      
              keyinterim[recount] = 4;
              recount++;
            }
          break;
        case 0x22:                          // 2行2列,数字5
          if (recount<4)
            {
              font[recount] = 5;                      
              keyinterim[recount] = 5; 
              recount++;
            }
          break;
        case 0x42:                          // 2行3列,数字6
          if (recount<4)
            {
              font[recount] = 6;                      
              keyinterim[recount] = 6;
              recount++;
            }
          break;
        case 0x14:                           // 3行1列,数字1
          if (recount<4)
            {
              font[recount] = 1;                       
              keyinterim[recount] = 1;
              recount++;
            }
          break;
        case 0x24:                           // 3行2列,数字2
           if (recount<4)
             {
               font[recount] = 2;                      
               keyinterim[recount] = 2;
               recount++;
             }
          break;
        case 0x44:                           // 3行3列,数字3
          if (recount<4) 				
             { 
               font[recount]=3;
               keyinterim[recount]=3;
               recount++;
             }
          break;						
        case 0x18:                           // 4行1列,取消
          recount = 0;                       // 密码计数清零
          for (j=0;j<4;j++)
            {
              font[j] = 15;                  // 数码管显示----
              keyinterim[j] = 15;
            }
          break;
        case 0x28:                           // 4行2列,数字0
          if (recount<4)
            {
              font[recount]=0;
              keyinterim[recount]=0;
              recount++;
            }
          break;
        case 0x88:                           // 4行4列,确认键按下
          enter= 1;                          // 确认键按下
          if (recount==4)                    // 只有输入4个密码后按确认键才作密码比较
             keyflag = keycmp();
           else
             keyflag = 0;                    // 否则直接pmflag赋0
          break;
        default:break;
      }/*s12*/
      Delay(10);

     if (enter==1)                           // 如果按下确认键                                              
        {/*F11*/ 
          xunhuan0=0;                        // 下次不做循环0
          enter= 0;                          // 确认键标志位置回0
          recount = 0;                       // 修改密码位计数器清零            
          for (j=0;j<4;j++)
           {
             keyinterim[j] = 0x0f;           // 用----清除已经输入的密码
             font[j] = 10;                   // 显示bbbb
           } 
          if (keyflag==1)                    // 如果密码正确			
            {/*F21*/  
			   open=0;           // 门开
               while(xunhuan1)
                 {/*W21*/
                   key = keyscan();          // 调用键盘扫描函数
                   switch(key) 
                   {/*S21*/
                     case 0x11:              // 1行1列,数字7
                       if (recount<4)
                         {
                           font[recount] = 7;
                           setkey[recount] = 7;
                           recount++;
                         }
                     break;
                     case 0x21:               // 1行2列,数字8
                       if (recount<4)
                         {
                           font[recount] = 8;                      
                           setkey[recount] = 8;
                           recount++;
                         }
                     break;			  
                     case 0x41:               // 1行3列,数字9
                       if (recount<4)
                         {
                           font[recount] = 9;                     
                           setkey[recount] = 9;
                           recount++;
                         }
                     break;               
                     case 0x12:               // 2行1列,数字4
                       if (recount<4)
                         {
                           font[recount] = 4;                      
                           setkey[recount] = 4;
                           recount++;
                         }
                     break;
                     case 0x22:                // 2行2列,数字5
                       if (recount<4)
                         {
                           font[recount] = 5;                      
                           setkey[recount] = 5; 
                           recount++;
                         }
                     break;
                     case 0x42:                 // 2行3列,数字6
                       if (recount<4)
                         {
                           font[recount] = 6;                      
                           setkey[recount] = 6;
                           recount++;
                         }
                     break;
                     case 0x14:                 // 3行1列,数字1
                       if (recount<4)
                         {
                           font[recount] = 1;                       
                           setkey[recount] = 1;
                           recount++;
                         }
                     break;
                     case 0x24:                 // 3行2列,数字2
                       if (recount<4)
                         {
                           font[recount] = 2;                      
                           setkey[recount] = 2;
                           recount++;
                         }
                     break;
                     case 0x44:                 // 3行3列,数字3
                       if (recount<4) 				
                         { 
                           font[recount]=3;
                           setkey[recount]=3;
                           recount++;
                         }
                     break;						
                     case 0x18:                 // 4行1列,取消
                       recount = 0;             // 密码计数清零
                       for (j=0;j<4;j++)
                        {
                          font[j] = 15;         // 数码管显示----
                          setkey[j] = 15;		       
                        }
                     break;
                     case 0x28:                 // 4行2列,数字0
                       if (recount<4)
                         {
                           font[recount]=0;
                           setkey[recount]=0;
                           recount++;
                         }
                     break;
                     case 0x88:                  // 4行4列       
                       alter=0;                
                        if (recount==4)          // 只有输入4个密码后按确认键才作密码比较
                         {
                           alter=1;
                           xunhuan1=0;
                         }						                       
                     break;
                     default:break;
                   }/*S22*/
                   Delay(10);                    // 延时防止重复读取键盘 
                   if(alter==1)
                     { 
                       alter=0;
                       Write_I2C(0x00,setkey[0]);
                       Write_I2C(0x01,setkey[1]);
                       Write_I2C(0x02,setkey[2]);
                       Write_I2C(0x03,setkey[3]);
                       keyword[0]=Read_I2C(0x00); 
                       keyword[1]=Read_I2C(0x01); 
                       keyword[2]=Read_I2C(0x02); 
                       keyword[3]=Read_I2C(0x03);     
					 } 
                 }/*W22*/   
            }/*F22*/
            else							
              { 
                buzzer= 1;                       // 报警器响	
                for (wait1=1;wait1<9;wait1++)
                 {for (wait=1;wait<9999;wait++);
                 }
                buzzer=0;
              }
        }/*F12*/
    }/*W12*/
}/*r2*/



void Delay(unsigned int number)
{									   
    unsigned char temp;
    for(;number!=0;number--)
    {
      for(temp=112;temp!=0;temp--);
    }
}


void Start()
{
    SDA=1;
    SCL=1;
    SDA=0;
    SCL=0;
}


void Stop()
{
   SCL=0;
   SDA=0;
   SCL=1;
   SDA=1;
}


void NoAck()
{
   SDA=1;
   SCL=1;
   SCL=0;
}


bit TestAck()
{
   bit ErrorBit;
   SDA=1;
   SCL=1;
   ErrorBit=SDA;
   SCL=0;
   return(ErrorBit);
}


void Write8Bit(unsigned char input)	 
{ 
   unsigned char 	temp;
   for(temp=8;temp!=0;temp--)
   {
     SDA=(bit)(input&0x80);
     SCL=1;
     SCL=0;
     input=input<<1;
   }
}


void Write_I2C(unsigned char address,unsigned char ch)
{
   Start();
   Write8Bit(WriteDeviceAddress);
   TestAck();
   Write8Bit(address);
   TestAck();
   Write8Bit(ch);
   TestAck();
   Stop();
   Delay(10);
}


unsigned char Read8Bit(void)
{
   unsigned char rbyte=0,temp;
   bit s1;
   for(temp=0;temp<8;temp++)
   {
     SDA=1;    
     SCL=1;    
     s1=SDA;
     SCL=0;
     if(s1==1)
     {
       rbyte=rbyte<<1;
       rbyte=rbyte|0x01;
     }
     else
       rbyte=rbyte<<1;
   }
   return(rbyte);
}

  
unsigned char Read_I2C(unsigned char address)
{
   unsigned char ch;
   Start();
   Write8Bit(WriteDeviceAddress);
   TestAck();
   Write8Bit(address);
   TestAck();
   Start();
   Write8Bit(ReadDviceAddress);
   TestAck();
   ch=Read8Bit();
   NoAck();
   Stop();
   return(ch);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -