#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();
}
}
单片机案例开发——电子密码锁
最新推荐文章于 2023-09-19 16:36:01 发布