📄 2.txt
字号:
case 3:
return NINE;//键值为9
break;
case 4:
return INPUT;//键值为输入
break;
case 5:
return FOUR;//键值为4
break;
case 6:
return FIVE;//键值为5
break;
case 7:
return SIX;//键值为6
break;
case 8:
return CLEAR;//键值为清除
break;
case 9:
return ONE;//键值为1
break;
case 10:
return TWO;//键值为2
break;
case 11:
return THREE;//键值为3
break;
case 12:
return MODIFY;//键值为修改
break;
case 13:
return ZERO;//键值为0
break;
case 14:
return LOCK;//键值为检查
break;
case 15:
return STORE;//键值为存储
break;
case 16:
return OK;//键值为确定
break;
}
}
/***********************************************************
Function: InitLock()
Description:初始化函数
Calls: r24c02(unsigned char address)
Called by: main ()
Input: NULL
Output: NULL
return: void
***********************************************************/
void InitLock()
{
unsigned char i;//循环变量
for(i = 0; i < 6; i++)
{
password[i] = r24c02(i);//读出密码
}
TMOD = 0x11;//定时器方式1
TH0 = -(50000 / 256);//定时器高位赋初值
TL0 = -(50000 % 256);////定时器低位赋初值
TH1 = -(50000 / 256);//定时器高位赋初值
TL1 = -(50000 % 256);////定时器低位赋初值
EA = 1;//开总中断
ET0 = 1;//开定时器0中断
ET1 = 1;//开定时器1中断
TR0 = 0;//定时器0停止工作
TR1 = 0;//定时器1停止工作
RED = 1;//红灯灭
YELLOW = 1;//黄灯灭
GREEN = 1;//绿灯灭
RING = 1;//铃声不响
P0 = 0x00;
}
/***********************************************************
Function: Error ()
Description:报错函数
Calls: DelayMs (unsigned char i)
Called by: OpenLock(),ModifyPassword()
Input: NULL
Output: NULL
return: void
***********************************************************/
void Error()
{
if(++errorTime >= 3)//如果错误次数等于三次
{
RED = 0;//红灯亮
YELLOW = 1;//黄灯灭
GREEN = 1;//绿灯亮
RING = 0;//报警
TR0 = 1;//定时器0工作
errorTime = 0;//错误次数清零
second = 0;//秒钟清0
lock = 1;
}
else
{
YELLOW = 0;//黄灯亮
RED = 1;
GREEN = 1;
}
displayNum = 0;//显示数目清0
DelayMs(1000);
}
/***********************************************************
Function: ErrorRing ()
Description:报警函数
Calls: DelayMs (unsigned char i)
Called by: ModifyPassword ()
Input: NULL
Output: NULL
return: void
***********************************************************/
void ErrorRing()
{
RING = 0;
DelayMs(500);
RING = 1;
}
/***********************************************************
Function: Right ()
Description:密码输入正确函数
Calls: NULL
Called by: OpenLock(),ModifyPassword()
Input: NULL
Output: NULL
return: void
***********************************************************/
void Right()
{
GREEN = 0;//绿灯亮
RED = 1;//红灯灭
YELLOW = 1;//黄灯灭
DelayMs(1000);
}
/***********************************************************
Function: Clear()
Description:清0函数
Calls: NULL
Called by: Main()
Input: NULL
Output: NULL
return: void
***********************************************************/
void Clear()
{
GREEN = 1;//绿灯灭
YELLOW = 1;//黄灯灭
displayNum = 0;//显示个数清0
}
/***********************************************************
Function: DelayMs ()
Description:延时函数
Calls: NULL
Called by: ScanKey(unsigned char time)
Input: NULL
Output: NULL
return: void
***********************************************************/
void DelayMs(unsigned int ms)
{
int i,j;
for(i = 0; i < ms; i++)
{
for(j = 0; j < 110; j++);
}
}
/********************************************
内部函数,延时1
********************************************/
void Delay(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_(); /*根据晶振频率制定延时时间*/
}
/********************************************
内部函数,I2C开始
********************************************/
void Start(void)
{
EA=0;
SDA=1;
SCL=1;
Delay();
SDA=0;
Delay();
SCL=0;
}
/********************************************
内部函数,I2C结束
********************************************/
void Stop(void)
{
SDA=0;
SCL=0;
Delay();
SCL=1;
Delay();
SDA=1;
Delay();
EA=1;
}
/********************************************
内部函数,输出ACK ,每个字节传输完成,输出ack=0,结束读书据,ack=1;
********************************************/
void WriteACK(unsigned char ack)
{
SDA = ack;
Delay();
SCL=1;
Delay();
SCL=0;
}
/********************************************
内部函数,等待ACK
********************************************/
void WaitACK()
{
unsigned char errtime=20;
SDA=1;
Delay(); /*读ACK*/
SCL=1;
Delay();
while(SDA)
{ errtime--;
if(!errtime)
{
Stop();
break;
}
}
SCL=0;
Delay();
}
/********************************************
内部函数.输出数据字节
********************************************/
void writebyte(unsigned char wdata)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(wdata&0x80) SDA=1;
else SDA=0;
wdata<<=1;
SCL=1;
Delay();
SCL=0;
}
WaitACK(); //如果通讯错误,将不能接收到ack
}
/********************************************
内部函数.输入数据
********************************************/
unsigned char Readbyte(void)
{
unsigned char i,bytedata;
SDA=1;
for(i=0;i<8;i++)
{
SCL=1;
bytedata<<=1;
bytedata|=SDA;
SCL=0;
Delay();
}
return(bytedata);
}
////////////////读24c01--外部调用/////////////////////////
unsigned char r24c02(unsigned char address)
{ unsigned char mdata;
Start();
writebyte(0xa0);
writebyte(address);
Start();
writebyte(0xa1);
mdata=Readbyte();
WriteACK(1);
Stop();
Delay(); //此处延时根据实际情况,如果没有延时,可能会不正常
return(mdata);
}
//////////////////写24c01--外部调用//////////////////////////
void w24c02(unsigned char address,unsigned char udata)
{
Start();
writebyte(0xa0);
writebyte(address);
writebyte(udata);
Stop();
Delay(); //此处延时根据实际情况,如果没有延时,可能会不正常
}
/***********************************************************
Function: main()
Description:主函数
Calls: InitLock(), Scankey(), OpenLock(), ModifyPassword()
Called by: NULL
Input: NULL
Output: NULL
return: void
***********************************************************/
void main()
{
unsigned char key;//输入的键值
//unsigned char i;
InitLock();//初始化电子锁
while(1)//执行电子锁工作
{
DisplayLed(displayNum);//显示LED
key = ScanKey(MAXTIME);//扫描键盘得到按键的值
if(key == LOCK)
{
lock = (lock == 1) ? 0 : 1;
}
if(lock == 1)
{
continue;
}
switch(key)//根据键值选择功能
{
case INPUT://输入密码开锁
OpenLock();
Clear();//清除指示灯
break;
case MODIFY://修改密码
ModifyPassword();
Clear();//清除指示灯
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -