📄
字号:
#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 + -