⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 2.txt

📁 主要是防到锁的一些基于C语言的编程
💻 TXT
📖 第 1 页 / 共 2 页
字号:
#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 + -