📄 mi2.c
字号:
#include <reg51.h>
#include <intrins.h>
typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef bit BOOL ;
sbit rs = P2^0; //
sbit rw = P2^1;
sbit ep = P2^2;
bit codeflag=0,nameflag=0;
BYTE code diskey[16]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46};
BYTE namein[4]={0};
BYTE namesave[4][4]={1,1,9,0,
2,2,2,2,
4,2,2,5,
8,0,0,5};
BYTE numb=0,card=0;
BYTE OP_READ;
BYTE OP_WRITE;
sbit SCL=P1^0;
sbit SDA=P1^1;
BYTE newcode1[6],newcode2[6];
BYTE codein[6]={0};
BYTE codesave[6]={0};
BYTE code dis1[] = {"DATE:2006/08/30"};
BYTE code dis2[] = {"TIME:12:30 MON"};
BYTE code dis3[] = {"NAME:---- -C-"};
BYTE code dis4[] = {"CODE:------ "};
BYTE code dis5[] = {" --RIGHT-- "};
BYTE code dis6[] = {" --WRONG-- "};
BYTE code dis7[] = {"OPEN DOOR -F-"};
BYTE code dis8[] = {"CHANGE CODE -E-"};
BYTE code dis9[] = {" -WELCOME- "};
BYTE code dis10[] = {" ---SUCCESS--- "};
BYTE code dis11[] = {"NEW CODE:------ "};
BYTE code dis12[] = {"OPEN DOOR -F-"};
BYTE code dis13[] = {"EXIT -B-"};
BYTE code dis15[] = {" --THANKS-- "};
BYTE code dis14[] = {" ---GOODBYE--- "};
BYTE code dis16[] = {" ERROR & BACK "};
name_in();
code_in();
newcode_in2();
newcode_in1();
namecomp();
codecomp();
newcodecomp();
void delayms(BYTE ms);
main();
delay(BYTE ms)
{ // 延时子程序
BYTE i;
while(ms--)
{
for(i = 0; i< 250; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
BOOL lcd_bz()
{ // 测试LCD忙碌状态
BOOL result;
rs = 0;
rw = 1;
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result = (BOOL)(P0 & 0x80);
ep = 0;
return result;
}
lcd_wcmd(BYTE cmd)
{ // 写入指令数据到LCD
while(lcd_bz());
rs = 0;
rw = 0;
ep = 0;
_nop_();
_nop_();
P0= cmd;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
lcd_pos(BYTE pos)
{ //设定显示位置
lcd_wcmd(pos | 0x80);
}
lcd_wdat(BYTE dat)
{ //写入字符显示数据到LCD
while(lcd_bz());
rs = 1;
rw = 0;
ep = 0;
P0 = dat;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
lcd_init()
{ //LCD初始化设定
lcd_wcmd(0x38); //
delay(1);
lcd_wcmd(0x0c); //
delay(1);
lcd_wcmd(0x06); //
delay(1);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(1);
}
void xianshi1()
{BYTE i=0;
lcd_pos(0);
while(dis1[i] != '\0')
{
lcd_wdat(dis1[i]);
i++;
}
lcd_pos(0x40);
i = 0;
while(dis2[i] != '\0')
{
lcd_wdat(dis2[i]);
i++;
}
delay(1000);
}
void xianshi2()
{BYTE i=0;
lcd_pos(0);
while(dis3[i] != '\0')
{
lcd_wdat(dis3[i]);
i++;
}
lcd_pos(0x40);
i = 0;
while(dis4[i] != '\0')
{
lcd_wdat(dis4[i]);
i++;
}
delay(1000);
}
void xianshi3()
{BYTE i=0;
lcd_init();
lcd_pos(0x40);
while(dis5[i] != '\0')
{
lcd_wdat(dis5[i]);
i++;
}
delay(1000);
}
void xianshi6()
{BYTE i=0;
lcd_init();
lcd_pos(0x40);
while(dis6[i] != '\0')
{
lcd_wdat(dis6[i]);
i++;
}
delay(1000);
}
void xianshi5()
{BYTE i=0;
lcd_pos(0);
while(dis7[i] != '\0')
{
lcd_wdat(dis7[i]);
i++;
}
lcd_pos(0x40);
i = 0;
while(dis8[i] != '\0')
{
lcd_wdat(dis8[i]);
i++;
}
delay(1000);
}
void xianshi4()
{BYTE i=0;
lcd_pos(0);
while(dis12[i] != '\0')
{
lcd_wdat(dis12[i]);
i++;
}
lcd_pos(0x40);
i = 0;
while(dis13[i] != '\0')
{
lcd_wdat(dis13[i]);
i++;
}
}
void xianshi10()
{BYTE i=0;
lcd_init();
lcd_pos(0x40);
while(dis16[i] != '\0')
{
lcd_wdat(dis16[i]);
i++;
}
delay(1000);
}
void xianshi7()
{BYTE i=0;
lcd_init();
lcd_pos(0x40);
while(dis4[i] != '\0')
{
lcd_wdat(dis4[i]);
i++;
}
delay(1000);
}
void xianshi8()
{BYTE i=0;
lcd_init();
lcd_pos(0x40);
while(dis10[i] != '\0')
{
lcd_wdat(dis10[i]);
i++;
}
delay(1000);
}
void xianshi9()
{BYTE i=0;
lcd_init();
lcd_pos(0x40);
while(dis9[i] != '\0')
{
lcd_wdat(dis9[i]);
i++;
}
delay(1000);
}
start()
// 开始位
{
SDA = 1;
SCL = 1;
_nop_();
_nop_();
SDA = 0;
_nop_();
_nop_();
_nop_();
_nop_();
SCL = 0;
}
stop()
// 停止位
{
SDA = 0;
_nop_();
_nop_();
SCL = 1;
_nop_();
_nop_();
_nop_();
_nop_();
SDA = 1;
}
shin()
// 从AT24Cxx移入数据到MCU
{
BYTE i,read_data;
for(i = 0; i < 8; i++)
{
SCL = 1;
read_data <<= 1;
read_data |= (BYTE)SDA;
SCL = 0;
}
return(read_data);
}
shout(BYTE write_data)
// 从MCU移出数据到AT24Cxx
{
BYTE i;
bit ack_bit;
for(i = 0; i < 8; i++) // 循环移入8个位
{
SDA = (bit)(write_data & 0x80);
_nop_();
SCL = 1;
_nop_();
_nop_();
SCL = 0;
write_data <<= 1;
}
SDA = 1; // 读取应答
_nop_();
_nop_();
SCL = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ack_bit = SDA;
SCL = 0;
return ack_bit; // 返回AT24Cxx应答位
}
void write_byte(BYTE addr, BYTE write_data)
// 在指定地址addr处写入数据write_data
{
start();
shout(OP_WRITE);
shout(addr);
shout(write_data);
stop();
delayms(10); // 写入周期
}
BYTE read_current()
// 在当前地址读取
{
BYTE read_data;
start();
shout(OP_READ);
read_data = shin();
stop();
return read_data;
}
BYTE read_random(BYTE random_addr)
// 在指定地址读取
{
start();
shout(OP_WRITE);
shout(random_addr);
return(read_current());
}
void delayms(BYTE ms)
// 延时子程序
{
BYTE i;
while(ms--)
{
for(i = 0; i < 120; i++);
}
}
/************************************************************
键盘扫描及取键值程序
BYTE getkeyin(void)
功能:键值放入keyin。
*************************************************************/
BYTE getkeyin(void)
{BYTE keyin;
BYTE temp,i;
P3=0x0f;
temp=P3;
if(temp==0x0f)
{
keyin=0xff;
}
if(temp!=0x0f)
{ //按键有松开过
for(i=10;i>0;i--); //键盘去抖延迟
P3=0xef; //P1^4=0
temp=P3;
temp=temp&0x0f;
if (temp!=0x0f)
{
switch(temp)
{
case 0x0e:keyin=0x0f;
break; //keyin='a'
case 0x0d:keyin=0x0b;
break; //keyin='b'
case 0x0b:keyin=8;break; //keyin='c'
case 0x07:keyin=4;break; //keyin='d'
}
return keyin;
}
P3=0xdf; //P1^5=0
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
switch(temp)
{
case 0x0e:keyin=0x0e;
break; //keyin='3'
case 0x0d:keyin=0x0a;
break; //keyin='6'
case 0x0b:keyin=7;break; //keyin='9'
case 0x07:keyin=3;break; //keyin='f'
}
return keyin;
}
P3=0xbf; //P1^6=0
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
switch(temp)
{
case 0x0e:keyin=0x0d;break; //keyin='2'
case 0x0d:keyin=0;break; //keyin='5'
case 0x0b:keyin=6;break; //keyin='8'
case 0x07:keyin=2;break; //keyin='0'
}
return keyin ;
}
P3=0x7f; //P1^7=0
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
switch(temp)
{
case 0x0e:keyin=0x0c;break; //keyin='1'
case 0x0d:keyin=9;break; //keyin='4'
case 0x0b:keyin=5;break; //keyin='7'
case 0x07:keyin=1;break; //keyin='e'
}
return keyin;
}
}
keyin=0x20;
}
name_in()
{BYTE i=0x12,j=4;
// 初始化LCD
while(1)
{
P3=0x0f;
if((P3!=0x0f))
delay(12);
if(P3!=0x0f)
{ i=getkeyin();
P3=0x0f;
while(P3!=0x0f)
{}
if((i>=0)&&(i<=9))
j++;
}
if((i>=0)&&(i<=9))
{
lcd_pos(j);
lcd_wdat(diskey[i]);
namein[j-5]=i;}
delay(10);
if(j==8)break;
}
if(namecomp())
code_in();
}
code_in()
{
BYTE i=0x12,j=0x44,jian,k=0;
// 初始化LCD
delay(10);
while(1)
{
P3=0x0f;
if((P3!=0x0f))
delay(12);
if(P3!=0x0f)
{ i=getkeyin();
P3=0x0f;
while(P3!=0x0f)
{}
if((i>=0)&&(i<=9))
{j++;
k++;}
}
if((i>=0)&&(i<=9))
{
lcd_pos(j);
lcd_wdat(0x2a);
codein[k-1]=i;
}
delay(10);
if(j==0x4a)
{delay(500);
break;}
}
if(codecomp())
{xianshi3();
ef:
xianshi5();
delay(1000);
P3=0x0f;
while(P3==0x0f)
{}
jian=getkeyin();
P3=0x0f;
while(P3!=0x0f)
{}
if(jian==0x0f) //xiaodou
xianshi9();
else if(jian==0x0e)
newcode_in1();
else
goto ef;
}
else {xianshi6();
xianshi7();
code_in();}
}
namecomp()
{BYTE i,j,k=0;
bit flag;
for(j=0;j<4;j++)
for(i=0;i<4;i++)
{ if(namein[i]!=namesave[j][i])
{flag=0;
break;}
else
{ k++;
if(k==4)
numb=j;}
}
if(k==4)
{flag=1;
}
if(flag==1)
return 1;
if(flag==0)
return 0;
}
codecomp()
{BYTE i,k=0,n=0;
bit flag;
for(i=0;i<6;i++)
{OP_READ=0xa1;
OP_WRITE=0xa0;
n=6*numb;
codesave[i]=read_random(n);
n++;
}
for(i=0;i<6;i++)
{ if(codein[i]!=codesave[i])
{flag=0;
break;}
else k++;
}
if(k==6)flag=1;
if(flag==1)
return 1;
if(flag==0)
return 0;
}
newcode_in1()
{
BYTE i=0x12,j=0x44,k=0;
xianshi7(); // 初始化LCD
delay(10);
while(1)
{ P3=0x0f;
if((P3!=0x0f))
delay(12);
if(P3!=0x0f)
{ i=getkeyin();
P3=0x0f;
while(P3!=0x0f)
{}
if((i>=0)&&(i<=9))
{ j++;
k++;}
}
if((i>=0)&&(i<=9))
{ lcd_pos(j);
lcd_wdat(0x2a);
newcode1[k-1]=i;
}
delay(10);
if(j==0x4a)
{delay(500);
break;}
}
newcode_in2();
}
newcode_in2()
{
BYTE i=0x12,j=0x44,k=0,jian;
xianshi7(); // 初始化LCD
delay(10);
while(1)
{ P3=0x0f;
if((P3!=0x0f))
delay(12);
if(P3!=0x0f)
{ i=getkeyin();
P3=0x0f;
while(P3!=0x0f)
{}
if((i>=0)&&(i<=9))
{ j++;
k++;}
}
if((i>=0)&&(i<=9))
{ lcd_pos(j);
lcd_wdat(0x2a);
newcode2[k-1]=i;
}
delay(10);
if(j==0x4a)
{delay(500);
break;}
}
if(newcodecomp())
{
xianshi8();
bf: xianshi4();
delay(1000);
jian=getkeyin();
P3=0x0f;
while(P3==0x0f)
{}
jian=getkeyin();
P3=0x0f;
while(P3!=0x0f)
{}
if(jian==0x0f) //xiaodou
{ xianshi9();
delay(10);
xianshi1();}
else if(jian==0x0b)
main();
else goto bf;
}
else
{ xianshi10();
newcode_in1();
}
}
newcodecomp()
{BYTE i,n,k=0;
bit flag;
for(i=0;i<6;i++)
{ if(newcode1[i]!=newcode2[i])
{flag=0;
break;}
else k++;
}
if(k==6)flag=1;
if(flag==1)
{ for(k=0;k<6;k++)
{OP_READ=0xa1;
OP_WRITE=0xa0;
n=6*numb;
write_byte(n,newcode1[k]);
}
return 1;}
if(flag==0)
return 0;
}
main()
{BYTE jian,j,n=0,k=0;
SDA = 1;
SCL = 1;
lcd_init();
hui: xianshi1();
jian=getkeyin();
if(jian==0x0a)
{xianshi2();
delay(500);
name_in();}
goto hui;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -