单片机案例开发——电子密码锁

#include <STCREG.H>
#define uint unsigned int
#define	uchar unsigned char
#define pwdLEN 10                   
#define STLEN 3                    
sbit l1 = P3^5;						
sbit bump = P3^6;					
sbit relay = P3^7;				
sbit lcden = P1^3;					
sbit lcdrw = P1^2;
sbit lcdrs = P1^1;
sbit sda = P1^6;				
sbit scl = P1^7;				

uchar code xianshi0[] = " input  password:";
uchar code xianshi1[] = " Please come in!";	
uchar code xianshi2[] = "*";				
uchar code xianshi3[] = " you are thief!";
uchar code xianshi4[] = " new  password:";	
uchar code xianshi5[] = " alter succeed!";	
uchar code xianshi6[] = "  first error!";
uchar code xianshi7[] = "  second error!";	
uchar code xianshi8[] = "  third error!";	
uchar code xianshi9[] = "  alter fail!!";	
uchar table[pwdLEN];					
uchar table1[12] ={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x01,0x02,0x03};				
uchar mima[pwdLEN];					
uchar num, num1, num2, num3, etimes, fanhui, kai;
bit alterflog, cpflog, suoflog;	
void keyscan();						
void init();
void keydeal15();
void keydeal16();					

void delay_xs(uint x)
{
	uint i, j;
	for(i = x; i > 0; i--)
		for(j = 123; j > 0; j--);
}

void writecom(uchar com)			
{
	P0 = com;
	lcdrs = 0;
	lcdrw = 0;
	lcden = 0;
	lcden = 1;
}

void writedate(uchar date)		
{
	P0 = date;
	lcdrs = 1;
	lcdrw = 0;
	lcden = 0;
	lcden = 1;
}


void delay()		
{;;}

void start()					
{	
	sda = 1;
	delay();
	scl = 1;
	delay();
	sda = 0;
	delay();
}

void stop()						
{
	sda = 0;
	delay();
	scl = 1;
	delay();
	sda = 1;
	delay();
}

void respons()						
{
	uchar i;
	scl=1;
	delay();
	while((sda == 1) && (i < 250))
		i++;
	scl = 0;
	delay();
}

void write_byte(uchar date)			
{
	uchar i, temp;
	temp = date;

	for(i = 0; i < 8; i++)
	{
		temp = temp << 1;
		scl = 0;
		delay();
		sda = CY;
		delay();
		scl = 1;
		delay();
	}
	scl = 0;
	delay();
	sda = 1;
	delay();
}

uchar read_byte()				
{
	uchar i, k;
	scl = 0;
	delay();
	sda = 1;
	delay();
	for(i = 0; i < 8; i++)
	{
		scl = 1;
		delay();	
		k = (k <<1 ) | sda;
		scl = 0;
		delay();	
	}
	return k;
}

void write24c02(uchar address, uchar date) 
{
	start();
	write_byte(0xa0);
	respons();
	write_byte(address);
	respons();
	write_byte(date);
	respons();
	stop();
}

uchar read24c02(uchar address)		
{
	uchar date;
	start();
	write_byte(0xa0);
	respons();
	write_byte(address);
	respons();
	start();
	write_byte(0xa1);
	respons();
	date=read_byte();
	stop();
	return date;
}

void keydeal1()		              
{
	table[num] = 1;
	num++;
	if(alterflog == 1)
	{
		table1[num1] = 1;
		num1++;
	}
}

void keydeal2()		               
{
	table[num] = 2;
	num++;
	if(alterflog == 1)
	{
		table1[num1] = 2;
		num1++;
	}
}

void keydeal3()		             
{
	table[num] = 3;
	num++;
	if(alterflog == 1)
	{
		table1[num1] = 3;
		num1++;
	}
}
void keydeal4()		             
{
	table[num] = 4;
	num++;
	if(alterflog == 1)
	{
		table1[num1] = 4;
		num1++;
	}
}

void keydeal5()		              
{
	table[num] = 5;
	num++;
	if(alterflog == 1)
	{
		table1[num1] = 5;
		num1++;
	}
}

void keydeal6()					
{
	table[num] = 6;
	num++;
	if(alterflog == 1)
	{
		table1[num1] = 6;
		num1++;
	}
}

void keydeal7()					
{
	table[num] = 7;
	num++;
	if(alterflog == 1)
	{
		table1[num1] = 7;
		num1++;
	}
}

void keydeal8()						
{
	table[num] = 8;
	num++;
	if(alterflog == 1)
	{
		table1[num1] = 8;
		num1++;
	}
}
void keydeal9()					
{
	table[num] = 9;
	num++;
	if(alterflog == 1)
	{
		table1[num1] = 9;
		num1++;
	}
}

void keydeal10()				  
{
	table[num] = 0;
	num++;
	if(alterflog == 1)
	{
		table1[num1] = 0;
		num1++;
	}
}

void compare()						
{
	uchar j;
	for(j = 0; j < pwdLEN; j++)
	{
		if(table[j] == mima[j])
		{
			cpflog = 1;
			l1 = 0;
		}
		else
			cpflog = 0;
		l1 = 1;
	} 	
}

void keydeal11()				
{
	uchar j;
	if(alterflog == 1)
		goto n;					
	if(num == pwdLEN)				
	{
		num = 0;				
		compare();				
		for(j = 0; j < pwdLEN; j++)		
		{
			table[j] = 0x0f;
		}
	}

	if(cpflog == 1)				
	{
		l1 = 0;					
		cpflog = 0;					
		etimes = 0;					
		kai = 1;					
		writecom(0x01);			
		delay_xs(5);
		delay_xs(5);
		for(j = 0; j < 15; j++)
		{
			writedate(xianshi1[j]);
			delay_xs(5);
		}
		for(j = 0; j < 2; j++)		
		{
			bump=0;
			delay_xs(2000);
			bump=1;
			delay_xs(2000);
			bump=0;
			delay_xs(2000);
			bump=1;
			delay_xs(2000);
			relay = 0;
		}
	
		while((suoflog != 1) && (alterflog != 1)) 
		{
			P2 = 0xf7;
			if(P2 == 0xe7)
				{suoflog = 1;	
					relay = 1;
					}
			P2 = 0xfb;				
			if(P2 == 0xeb)
				alterflog = 1;				
			if(suoflog ==1 )	
			{
				init();
			}
n:			if(alterflog == 1)	
			{
				writecom(0x01);
				delay_xs(5);
				writecom(0x80);		
				delay_xs(5);
				for(j = 0; j < 15; j++)
				{
					writedate(xianshi4[j]);
					delay_xs(5);
				}
			}
		}
		suoflog = 0;			
	}
	else						
	{
		num = 0;					
		num1 = 0;				
		etimes++;				
		bump = 0;				
		delay_xs(5000);
		bump = 1;
		for(j = 0; j < pwdLEN; j++)	
		{
			table1[j] = 0x0f;
		}
		if(etimes == 1)			
		{
			writecom(0x01);			
			delay_xs(5);
			writecom(0x80);
			delay_xs(5);
			for(j = 0; j < 14; j++)
			{
				writedate(xianshi6[j]);
				delay_xs(5);
			}
			delay_xs(20000);		
			writecom(0x01);		
			delay_xs(5);
			writecom(0x80);
			delay_xs(5);
			for(j = 0; j < 16; j++)	
			{
				writedate(xianshi0[j]);
				delay_xs(5);
			}					   
			writecom(0x80 + 0x40 + STLEN);
			delay_xs(5);
			for(j = 0; j < pwdLEN; j++)
			{
				writedate('-');
				delay_xs(5);
			}
		}
		if(etimes == 2)			
		{
			writecom(0x01);
			delay_xs(5);
			writecom(0x80);
			delay_xs(5);
			for(j = 0; j < 15; j++)	
			{
				writedate(xianshi7[j]);
				delay_xs(5);
			}
			delay_xs(20000);			
			writecom(0x01);			
			delay_xs(5);
			writecom(0x80);
			delay_xs(5);
			for(j = 0; j < 16; j++)	
			{
				writedate(xianshi0[j]);
				delay_xs(5);
			}
			writecom(0x80 + 0x40 + STLEN);
			delay_xs(5);
			for(j = 0; j < pwdLEN; j++)	
			{
				writedate('-');
				delay_xs(5);
			}
		}
		if(etimes == 3)			
		{
			writecom(0x01);
			delay_xs(5);
			writecom(0x80);
			delay_xs(5);
			for(j = 0; j < 15; j++)	
			{
				writedate(xianshi3[j]);
				delay_xs(5);
			}
			for(j = 0; j < 10; j++)	
			{
				bump = 0;
				delay_xs(5000);
				bump = 1;
				delay_xs(5000);
			}
			init();				
		}
	}
}

void keydeal12()				
{
	uint i;
	if(kai == 0)				
	{							
		init();
	}
	else						
	{
		if(alterflog == 1)
		{
			num = 0;
			num1 = 0;
			writecom(0x01);
			delay_xs(5);
			writecom(0x80);			
			delay_xs(5);
			for(i = 0; i < 15; i++)
			{
				writedate(xianshi4[i]);
				delay_xs(5);
			}
		}
	}
}

void keydeal15()				
{
	uchar i;
	alterflog = 0;				
	num = 0;					
	for(i = 0; i < pwdLEN; i++)		
	{
		table[i] = 0x0f;	
	}
	if(num1 == 8)				
	{
		num1 = 0;				
		for(i = 0; i < pwdLEN; i++)	
		{
			write24c02(i, table1[i]);
			delay_xs(50);		
		}
		writecom(0x01);			
		delay_xs(5);
		writecom(0x80);
		delay_xs(5);
		for(i = 0; i < 15; i++)	
		{
			writedate(xianshi5[i]);
			delay_xs(5);
		}
		delay_xs(20000);
	}
	else						
	{
		num1 = 0;				
		writecom(0x01);			
		delay_xs(5);
		writecom(0x80);
		delay_xs(5);
		for(i = 0; i < 14; i++)	
		{
			writedate(xianshi9[i]);
			delay_xs(5);
		}
		delay_xs(20000);
	}
	
	if(kai == 1)				
	{
		num = 0;					
		delay_xs(2000);			
		writecom(0x01);			
		delay_xs(5);
		writecom(0x80);
		delay_xs(5);
		for(i = 0; i < 15; i++)	
		{
			writedate(xianshi1[i]);
			delay_xs(5);
		}						
		while((suoflog != 1) & (alterflog != 1))
		{
			P2 = 0xf7;
			if(P2 == 0xe7)
				suoflog = 1;
			P2 = 0xfb;
			if(P2 == 0xeb)
				alterflog = 1;
			if(suoflog == 1)
			{
				init();
			}
			if(alterflog == 1)
			{
				writecom(0x01);
				delay_xs(5);
				writecom(0x80);	
				delay_xs(5);
				for(i = 0; i < 15; i++)
				{
					writedate(xianshi4[i]);
					delay_xs(5);
				}
			}
		 }
	}
	else							
	{							
		delay_xs(2000);
		init();
	}
}

void keydeal16()				
{
	
}

void keyscan()
{
	uchar temp;

	P2 = 0xf7;
	temp = P2 & 0xf0;
	if(temp != 0xf0)
	{
		delay_xs(10);
		if(temp != 0xf0)
			temp = P2;
		switch(temp)
		{
			case 0x77:	keydeal7();		break;
			case 0xb7:	keydeal8();		break;
			case 0xd7:	keydeal9();		break;
			case 0xe7: 	
				break;
		}
		while((P2 & 0xf0) != 0xf0);	

	}

	P2 = 0xfb;
	temp = P2 & 0xf0;
	if(temp != 0xf0)
	{
		delay_xs(10);
		if(temp != 0xf0)
			temp = P2;
		switch(temp)
		{
			case 0x7b:	keydeal4();		break;
			case 0xbb: 	keydeal5();		break;
			case 0xdb:	keydeal6();		break;
			case 0xeb:	
				break;
		}
		while((P2 & 0xf0) != 0xf0);	
	}

	P2 = 0xfd; 
	temp = P2 & 0xf0;
	if(temp != 0xf0)
	{
		delay_xs(10);
		if(temp != 0xf0)
			temp = P2;
		switch(temp)
		{
			case 0x7d: 	keydeal1();		break;
			case 0xbd:	keydeal2();		break;
			case 0xdd:	keydeal3();		break;
			case 0xed:	keydeal12(); 	break;
		}
		while((P2 & 0xf0) != 0xf0);
	}

	P2 = 0xfe;
	temp = P2 & 0xf0;
	if(temp != 0xf0)
	{
		delay_xs(10);
		if(temp != 0xf0)
			temp = P2;
		switch(temp)
		{
			case 0x7e:	keydeal11();	break;
			case 0xbe:	keydeal10();	break;
			case 0xde: 	keydeal15(); 	break;
			case 0xee:	keydeal16(); 	break;
		}
		while((P2 & 0xf0) != 0xf0);
	}
}

void display()
{
	uint c;
	writecom(0x80 + 0x40 + STLEN);
	delay_xs(5);
	if(alterflog == 0)			
	{
		for(c = 0; c < num; c++)
		{
			writedate('*');
			delay_xs(5);
		}
	}
	else						
	{
		for(c = 0; c < num1; c++)
		{
		writedate('#');
		delay_xs(5);
		}
	}


}

void init()
{
	uint i, a, b;
	num = 0;					
	num1 = 0;
	kai = 0;					
	l1 = 1;						
	alterflog = 0;				
	sda = 1;		
	delay();
	scl = 1;
	delay();
	lcden = 1;
	writecom(0x38);				
	delay_xs(5);
	writecom(0x38);				
	delay_xs(5);
	writecom(0x0c);
	delay_xs(5);
	writecom(0x06);
	delay_xs(5);
	writecom(0x80);
	delay_xs(5);
	writecom(0x01);
	for(i = 0; i < pwdLEN; i++)		
	{
		mima[i] = read24c02(i);
	}
	delay_xs(5);
	writecom(0x01);				
	delay_xs(5);
	writecom(0x80);
	delay_xs(5);
	for(a = 0; a < 16; a++)		
	{
		writedate(xianshi0[a]);
		delay_xs(5);
	}
	writecom(0x80 + 0x40 + STLEN);	
	delay_xs(5);
	for(b = 0; b < pwdLEN; b++)
	{

		writedate('-');
		delay_xs(5);
	} 
}

void mimachuzhi(void)
{
	int i;
	sda = 1;			
	delay();
	scl = 1;
	delay();
	for(i = 0;i < pwdLEN; i++)	 
	{
		write24c02(i, table1[i]);
		delay_xs(50);			
	}
	for(i = 0; i < pwdLEN; i++)
	{
		table1[i] = 0x0f;
	}
}


void main()
{	  mimachuzhi();
	init();						
	while(1)					
	{
		keyscan();				
		display();				
	}
}
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值