📄 2.txt
字号:
#include<reg52.h>
#include<string.h>
#include <intrins.h>
//键盘扫描最大时间
#define MAXTIME 10
sbit SCL = P3^4;//时钟线
sbit SDA = P3^5;//数据线
sbit GREEN = P3^2;//绿灯
sbit YELLOW = P3^1;//黄灯
sbit RED = P3^0;//红灯
sbit RING = P3^3;//铃声
unsigned char code seg[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,
0x00};
//键盘键值
enum {ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, INPUT, LOCK, OK, STORE, MODIFY, CLEAR, NO};
//存储密码数组
unsigned char password[7] = {0, 1, 2, 3, 4, 5};
//二十分之一秒
unsigned char littlesecond0 = 0;
unsigned char littlesecond1 = 0;
//一秒
unsigned char second = 0;
//键盘扫描码
unsigned char keyRow[4] = {0xef, 0xdf, 0xbf, 0x7f};
// 扫描键盘的时间
unsigned char keyTime;
//输入密码错误次数
unsigned char errorTime = 0;
unsigned char displayNum = 0;
unsigned char lock = 1;
//扫描键盘函数,time为扫描时间,如果在指定时间内有键按下,则返回键值,若没有返回0
unsigned char ScanKey(unsigned char time);
//显示led函数,k为显示led个数,从右到左显示k个'P,'其他显示'8'
void DisplayLed(unsigned char k);
//输入密码函数,如果输入密码正确,则返回1,反之返回0
unsigned char InputPassword();
//修改密码
void ModifyPassword();
//开锁函数
void OpenLock();
//初始化函数
void InitLock();
//报错函数
void Error();
//报警函数
void ErrorRing();
//密码正确函数
void Right();
//清0函数
void Clear();
//延时函数
void DelayMs(unsigned int ms);
//写24c01--外部调用
void w24c02(unsigned char address,unsigned char udata);
//读24c01--外部调用
unsigned char r24c02(unsigned char address);
//内部函数.输出数据字节
void writebyte(unsigned char wdata);
//内部函数,等待ACK
void WaitACK();
//内部函数,输出ACK ,每个字节传输完成,输出ack=0,结束读书据则ack=1;
void WriteACK(unsigned char ack);
//内部函数,I2C结束
void Stop(void);
//内部函数,I2C开始
void Start(void);
//内部函数,延时1
void Delay(void);
//内部函数.输入数据
unsigned char Readbyte(void);
//#include <lock.h>
void timer0(void) interrupt 1// 定时器0中断子程序
{
if(++littlesecond0 >= 20)//如果超过一秒
{
littlesecond0 = 0;//二十分之一秒清0
second++;//一秒加1
if(second >= 60)//如果超过60秒
{
RING = 1;//铃声停
RED = 1;//红灯灭
TR0 = 0;//定时器0停止
second = 0;
}
}
TH0 = -(50000 / 256);//定时器高位赋初值
TL0 = -(50000 % 256);//定时器低位赋初值
}
void timer1(void) interrupt 3// 定时器1中断子程序
{
if(++littlesecond1 >= 20)//如果超过一秒
{
littlesecond1 = 0;//二十分之一秒清0
keyTime++;
}
TH1 = -(50000 / 256);//定时器高位赋初值
TL1 = -(50000 % 256);//定时器低位赋初值
}
/***********************************************************
Function: OpenLock()
Description:开锁函数
Calls: InputPassword(), Error(), Right()
Called by: main ()
Input: NULL
Output: NULL
return: void
***********************************************************/
void OpenLock()
{
if(!InputPassword())//判断输入密码是否正确
{
Error();//错误处理
return;//返回
}
Right();//正确处理
}
/***********************************************************
Function: ModifyPassword()
Description:修改密码函数
Calls: ScanKey(unsigned char time), Error(), Right(), InputPassword(), DisplayLed(unsigned char i) w24c02(unsigned char address,unsigned char udata)
Called by: main ()
Input: NULL
Output: NULL
return: void
***********************************************************/
void ModifyPassword()
{
unsigned char word;//扫描键盘得到的键值
unsigned char i = 0,j = 0;//输入密码的个数
unsigned char password1[7],password2[7];
if(!InputPassword())//判断输入密码是否正确
{
Error();//不正确错误处理
return;//返回
}
Right();
//输入密码过程,如果不是确定键并且输入个数小于等于6则继续
while((i <= 6) && ((word = ScanKey(MAXTIME)) != OK) && (word != NO))
{
if(word == CLEAR)//如果是清除键
{
i--;//键的个数减1
}
else//否则
{
password1[i] = word;//键值存入密码数组
i++;//键的个数加1
}
displayNum = i;
}
if(i == 7)//如果键的个数等于7
{
Error();//错误处理
return;//返回
}
for(; i < 7; i++)
{
password1[i] = '\0';//密码数组末尾以'0'结尾
}
i = 0;
while((i <= 6) && ((word = ScanKey(MAXTIME)) != OK) && (word != NO))
{
if(word == CLEAR)//如果是清除键
{
i--;//键的个数减1
}
else//否则
{
password2[i] = word;//键值存入密码数组
i++;//键的个数加1
}
displayNum = i;
}
if(i == 7)//如果键的个数等于7
{
Error();//错误处理
return;//返回
}
for(; i < 7; i++)
{
password2[i] = '\0';//密码数组末尾以'0'结尾
}
for(j = 0; j < 7; j++)
{
if(password1[j] != password2[j])
{
return;
}
}
if(ScanKey(MAXTIME) != STORE)
{
return;
}
for(i = 0; i < 7; i++)
{
password[i] = password2[i];//密码数组末尾以'0'结尾
}
for(i = 0; i < 6; i++)
{
w24c02(i,password[i]);//存储密码
}
}
/***********************************************************
Function: InputPassword()
Description:输入密码函数
Calls: ScanKey(unsigned char time),DisplayLed(unsigned char i)
Called by: OpenLock(),ModifyPassword()
Input: NULL
Output: NULL
return: unsigned char(0 or 1)
***********************************************************/
unsigned char InputPassword()
{
unsigned char keyInput[7] = {0};//键盘输入值数组
unsigned char word;//扫描键盘得到的键值
unsigned char i = 0, j = 0;//输入密码的个数
//输入密码过程,如果不是确定键并且输入个数小于等于6则继续
while((i <= 6) && ((word = ScanKey(MAXTIME)) != OK) && (word != NO))
{
if(word == CLEAR)//如果是清除键
{
i--;//键的个数减1
}
else//否则
{
keyInput[i] = word;//键值存入密码数组
i++;//键的个数加1
}
displayNum = i;
}
if(i == 7)//如果键的个数等于7
{
return 0;//返回
}
keyInput[i] ='\0';//密码数组末尾以'0'结尾
//判断输入的密码与存储的密码是否相同
for(j = 0; j <6 ; j++)
{
if(keyInput[j] != password[j])
{
return 0;
}
}
return 1;
}
/***********************************************************
Function: DisplayLed()
Description:led显示函数
Calls: NULL
Called by: ModifyPassword(),InputPassword()
Input: NULL
Output: NULL
return: void
***********************************************************/
void DisplayLed(unsigned char k)
{
unsigned char i;//循环变量
unsigned char sda = 1;//控制led显示码
for(i = 0; i < 6 - k; i++)//循环显示'p'
{
P0 = 0x73;//输出数据显示码
P1 = sda;//输出数据控制码
sda <<= 1;//移位显示下一位
DelayMs(5);
}
for(i = 0; i < k; i++)//循环显示'8.‘
{
P1 = sda;//输出数据控制码
P0 = 0xff;//输出数据显示码
sda <<= 1;//移位显示下一位
DelayMs(5);
}
}
/***********************************************************
Function: ScanKey(unsigned char time)
Description:输入密码函数
Calls: DelayMs(unsigned char i)
Called by: InputPassword(),ModifyPassword(),main()
Input: NULL
Output: NULL
return:unsigned char(enum {ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, INPUT, CHECK, OK, STORE, MODIFY, CLEAR};)
***********************************************************/
unsigned char ScanKey(unsigned char time)
{
unsigned char keyNum = 0,keyNumber = 0;//输出键值
unsigned char i = 0,j;//行值
keyTime = 0;//按键计时清0
TR1 = 1;//定时器1开始工作
while((keyTime <= time) && (keyNumber == 0))//如果时间没超过指定时间并且有没有输入则继续
{
DisplayLed(displayNum);//显示LED
for(i = 0; i < 4; i++)
{
P2 = keyRow[i];//输出行值
keyNum = P2; //输入列值
if(keyNum != keyRow[i])//如果有键按下
{
DelayMs(10);//延时
keyNum = P2;//输入列值
if(keyNum != keyRow[i])//如果有键按下
{
while(P2 != keyRow[i]);//等待按键松开
keyNum =~ keyNum;
keyNum &= 0x0f;//取低四位
//计算按键的列值
for(j = 0; j < 8; j++)
{
if(keyNum & 0x01)
{
break;
}
else
{
keyNum >>= 1;
}
}//for(j = 0; j < 8; j++)
keyNumber = i * 4 + j + 1;//计算键值
}//if(keyNum != keyRow[i])
}//if(keyNum != keyRow[i])
}//for(i = 0; i < 4; i++)
}//while((keyTime <= time) && (keyNumber == 0))
TR1 = 0;
if(keyTime > time)
{
lock = 1;
return NO;
}
switch(keyNumber)//根据按键分布选择返回键值
{
case 1:
return SEVEN;//键值为7
break;
case 2:
return EIGHT;//键值为8
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -