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

📄

📁 c语言编程的8位密码锁
💻
字号:

#include <reg51.h>
#include <absacc.h>
#include <STRING.H>
#include <INTRINS.H>
#define uchar unsigned char

sbit row1=P1^0;
sbit row2=P1^1;
sbit row3=P1^2;
sbit row4=P1^3;
sbit col1=P1^4;
sbit col2=P1^5;
sbit col3=P1^6;
sbit col4=P1^7;
sbit P3_2=P3^2;
sbit P3_0=P3^0;				//控制报警//
sbit P3_1=P3^1;
bit key_flag=0;
//sbit SDA=P3^7;
//sbit SCL=P3^6;
uchar pw_hash[8];       //存放原始密码的数组
uchar pw_new[8];          //输入键号存放的单元
uchar pw_p;
uchar i;              
uchar error_time;    //密码输入错误次数
uchar pw_s;          //存放比较结果的变量
uchar *pw_new_p;
char key_s;                   
uchar i=0;
int a;
int j;
int b=0;
int k=0;
int t;
int  KeyTemp;
int  table[8]={0xFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};
int code duanma[]={0xC0,0xF9,0xA4,0xB0,
		           0x99,0x92,0x82,0xF8,
		           0x80,0x90,0x88,0x83,
		           0xC6,0xA1,0x86,0x8E,
                   0xFF,0xBF};
uchar code weima[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
void delay(int count);
int KeyNum();
void BeepCount(int count);
int keydown(void);
void display(void);
int KeyUp(void);
void delay1(void);
//void IICStart(void);
//void IICStop(void);
//bit IICRecAck(void);
//void IICAck(void);
//void IICNoAck(void);
//bit IICSendByte(unsigned char sendbyte);
//void R24C01(uchar Address,uchar idata *R24Ctemp,uchar QuantityByte );
void main()
{
	IE=0X00;                        //禁止中断

	P3_1=0;
	P3_2=0;
    //R24C01(0x00,pw_hash,8 );
	pw_hash[0] = 1;                //设置原始密码
	pw_hash[1] = 2;
	pw_hash[2] = 3;
    pw_hash[3] = 4;
	pw_hash[4] = 5;
	pw_hash[5] = 6;
	pw_hash[6] = 7;
	pw_hash[7] = 8;
	//pw_hash[8] = -1;
	
begin:
    k=0;
	error_time = 0;             //错误次数赋初值0
	 P3_2 = 0; 
	pw_p = 0;                                       
	
	while (error_time != 3)        //当错误次数没有超过3次时执行下面程序                      (0)
	{	 
		a = keydown();         //判断是否有键按下     
		if (a==1)           //若返回值为1,执行下面的程序(为1代表有键按下)            (1)
			{
			key_s=KeyNum();
			BeepCount(1);         //按一下键发一次声音
			if (key_s > 0  && key_s <11)        //如果键值在0~10之间                           
				{
				if (key_s == 10 ) key_s = 16;     //键值为10时,将key_s赋0
				//sendbyte(key_s);                 //发键值到AT24C01
				pw_new[pw_p] = key_s;            //同时将键值放入pw_new数组中                   
			    }
			     
			      /***************以下是比较密码,只有按下确认键后才进行比较*******************/
			      
		if (key_s == 15)                     //确认键 
			{                                                                                  //(2) 
			  pw_p=8;                          //将8赋给pw_new
				pw_s = strncmp (pw_hash, pw_new, pw_p);    //键值和设定的密码进行逐个比较,这里八位密码都进行了比较
				if (pw_s != 0)                     //如果比较结果返回的是1,说明不相等
					{																//(3)
					error_time += 1; 
					
										   for(j=0;j<8;j++)
										   {table[j]=0xFF;}            //错误次数加1
										 k=-1;
				   //pw_p = -1;                      //pw_p赋-1 ,
					//CLS;                            //CLS 代表cls = 0; cls = 1结束信号

	                } 
				else                               //比较结果相等时
				{                                                                     
					P3_2 = 1;                      //开锁灯亮标志置1
					P2=0x00;
					while (1)                     //可以开始设置新密码
						{                                                          //(4)
						key_s = KeyNum();         //键值送key_s
						k=0;
						if (key_s == 14)         //按键14,也即代表要设置密码了
						{   
						int j;
						 for(j=0;j<8;j++)
										   {table[j]=0xFF;}                                                       //(5)
						//	CLS;                 
						//	pw_p = 0;            //pw_p置0?
						
						
						
							/************开始设置密码***************/
						pw_p=0;  
							while(1)  
							         
								{                                              //(6)                  
								a = keydown();   
								if (a==1)
									{   
									key_s=KeyNum();                                       //(7)
									if (key_s > 0  && key_s <11)
										{
									
										if (key_s == 10 ) 
										key_s = 16;
										//sendbyte(key_s);
										pw_hash[pw_p] = key_s;   //将新密码放入pw_hash数组中
									    }
										
									    pw_p += 1;
								        b=key_s;
                                        table[k]=duanma[b];
	                                    k++;		   
									    if (key_s == 11)            //确认键
										{  int j;
										   for(j=0;j<8;j++)
										   {table[j]=0xFF;}
										                                
										//pw_hash[pw_p] = -1;    //不知道什么意思
										//W24C01(0x00,pw_hash,pw_p); //按下确认键后保存密码
										//CLS;                       
										goto begin;                //密码已设置完,跳到开始的begin处
									    }							    
								     }                             //(7)
									 for(t=0;t<8;t++)
	                                           {
	                                               P2=weima[t];	   //位码送P2
	                                               P0=table[t];	  //段选码送P0
	                                               delay(5);
												}
							     }	                                  //(6)
						}                                      //(5)
					}                                         //(4)
				}                                             //(3)
			}                                                 //(2)处结束	
			//if (key_s == 12)                      //
			//{
				//for(j=0;j<8;j++)
	         //{table[j]=0xFF;}  //
          
		  
				 // 	pw_p = -1;
				//	CLS;
				/**********显示*************/
		
		  pw_p += 1; 
	      b=key_s;
          table[k]=duanma[b];
	        k++;
					                                                                   
		}                                     //(1)处结束
	    for(t=0;t<8;t++)
	       {
	        P2=weima[t];	   //位码送P2
	        P0=table[t];	  //段选码送P0
	        delay(5);
           }  

	}                                         //(0)处结束                      
 
	while (1)                                  //开始报警
		{
		BeepCount(100);	
	    }

	while(1);                             
} 
		

/********************************************************************************************
* 函数名称:KeyNum()
* 功    能:检测用户按下的键盘所对应的键盘号并直接转换成段码
* 入口参数:无
* 出口参数:无
* 说    明:用户可根据自己的键盘编号修改该函数。
*********************************************************************************************/
 int  KeyNum(void)
{
    
   int  KeyTemp;
    
    KeyTemp=0;
    
    if(keydown()==1)
    {
    
        col1=0; col2=1; col3=1; col4=1;
        
        if (row1==0) { KeyTemp=7; }
        if (row2==0) { KeyTemp=4; } 
        if (row3==0) { KeyTemp=1; }
        if (row4==0) { KeyTemp=15; }
        
        col1=1; col2=0; col3=1; col4=1;
        
        if (row1==0) { KeyTemp=8; }
        if (row2==0) { KeyTemp=5; }
        if (row3==0) { KeyTemp=2; }
        if (row4==0) { KeyTemp=0; }
        
        col1=1; col2=1; col3=0; col4=1;
        
        if (row1==0) { KeyTemp=9; } 
        if (row2==0) { KeyTemp=6; } 
        if (row3==0) { KeyTemp=3; } 
        if (row4==0) { KeyTemp=14; }    
        
        col1=1; col2=1; col3=1; col4=0;
        
        if (row1==0) { KeyTemp=10; } 
        if (row2==0) { KeyTemp=11; } 
        if (row3==0) { KeyTemp=12; } 
        if (row4==0) { KeyTemp=13; }
        
        while ( KeyUp()!=1); 
        
        return KeyTemp;
    
    }
    else
    return 16;
}

/********************************************************************************************
* 函数名称:delay()
* 功    能:软件延时
* 入口参数:count    延时参数,值越大,延时越长
* 出口参数:无
*********************************************************************************************/
void delay(int count)
{
    int i;             
    
    while(--count != 0)        
    {
        for(i = 0; i < 125; i++);                
    }
}
/********************************************************************************************
* 函数名称:BeepCount()
* 功    能:蜂鸣器按指定次数缝鸣
* 入口参数:count
* 出口参数:无
*********************************************************************************************/
void BeepCount(int count)
{
    for(;count>0;count--)
   {
      
       P3_1=1;delay(120);
	    P3_1=0;delay(120);
   }
}
/********************************************************************************************
* 函数名称:Keydown()
* 功    能:检测键盘是否按下
* 入口参数:无
* 出口参数:返回1表示键盘按下,返回0表示键盘未按下
* 注    意:该函数有消抖功能
*********************************************************************************************/
int keydown(void)
{
    col1=0; col2=0; col3=0; col4=0; 
    
    if((row1==0) || (row2==0) || (row3==0) || (row4==0))
    {
        delay(1);
        if((row1==0) || (row2==0) || (row3==0) || (row4==0))
            return 1;         //返回1表示键盘按下
        else
            return 0;
    } 
    else 
        return 0;     
}
/********************************************************************************************
* 函数名称:KeyUp()
* 功    能:检测键盘是否弹起
* 入口参数:无
* 出口参数:返回1表示键盘弹起,返回0表示键盘未弹起
* 注    意:该函数有消抖功能
*********************************************************************************************/
int KeyUp(void)
{
    col1=0; col2=0; col3=0; col4=0;
    
    if((row1==1) && (row2==1) && (row3==1) && (row4==1))
    {
        delay(1);
        if((row1==1) && (row2==1) && (row3==1) && (row4==1))
            return 1;        //返回1表示键盘弹起
        else
            return 0;
    }
    else 
        return 0;
}
/********************************************************************************************
* 函数名称:display()
* 功    能:显示键号
* 入口参数:无
* 出口参数:无
* 注    意:
*********************************************************************************************/
void display(void)
{
    uchar i=0;
	int a;
	int b;
	int k=0;
	int t;
	int  table[8]={0xFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};
	int code duanma[]={0xC0,0xF9,0xA4,0xB0,
		                 0x99,0x92,0x82,0xF8,
		                 0x80,0x90,0x88,0x83,
		                 0xC6,0xA1,0x86,0x8E,
                         0xFF,0xBF};
	uchar code weima[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
	while(1)
	 {
	    a=keydown();	   //将判键是否按下函数的值赋给a
	    if(a==1)		   //若为1表示有键按下
           {
            b=KeyNum();
            table[k]=duanma[b];
	        k++;
	       }
	    
	    	
	       for(t=0;t<8;t++)
	       {
	        P2=weima[t];	   //位码送P2
	        P0=table[t];	  //段选码送P0
	       delay(1);
           } 
	   
	 
     }		     
}
 

⌨️ 快捷键说明

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