需要c语言代码的详细注释和流程图,流程图可以手绘图片,也可以电脑绘制,能参考就行,最好每句话或者每一个函数节点都有注释,感谢!
#include <REG52.H>
#include <string.h>
#include "lcd1602.h"
#include "delay.h"
#include "key_m.h"
#include "password.h"
#include "buzzer.h"
#include "RC522.h"
#include "eeprom.h"
#include "stepMoto.h"
#define PW_MODE_INPUT 1//输入密码开锁模式
#define PW_MODE_REGIST 2//注册新密码模式
#define IC_REGIST 3//IC注册
#define IC_DELETE 4//IC删除
unsigned char IC_SN[3][4]={0};//存放用户的IC卡序列号
u8 openDoor=0;
u8 saveEEPROM=0;
void Dis_ICcode(u8* _IC);
u8 Search_IC(u8 *_IC);
void Save_IC(u8 _ID,u8 *_IC);
u8 Find_hole_InLib(void);
void Delelt_ID_inLib(u8 _ID);
unsigned char USRT_key;
void main(void)//主函数入口
{
u8 mode;
u8 key;
u8 i;
u8 sta;
u8 err=0;
delay_Init();
LCD_Init();
PW_Init(); //复位初始密码
Beep(200);
Start:
mode = PW_MODE_INPUT;
LCD_Clear();
LCD_GotoXY(0x00,0);
LCD_Print("RFID PWord. Lock");
LCD_GotoXY(0x00,1);
LCD_Print("----------------");
Motor1_Stop();
while(1)//主循环
{
delay_ms(1);
key = KeyScan(0);
if(key==0)
{
key = USRT_key;
USRT_key = 0;
}
if(key)
{
Beep(200);
if(key=='*')
{
mode = IC_REGIST;//IC卡注册
LCD_GotoXY(0x00,0);
LCD_Print(" Regist IC code ");
}
else if(key=='#')
{
mode = IC_DELETE;//IC删除
LCD_GotoXY(0x00,0);
LCD_Print(" delete IC code ");
}
else if(mode==PW_MODE_INPUT)//输入密码模式
{
switch (InputPassword(key))
{
case 0xFF://特权密码正确
err = 0;
mode=PW_MODE_REGIST;//进入录入模式
LCD_GotoXY(0x00,0);
LCD_Print(" Enter a new PW.");
LCD_GotoXY(0x00,1);
LCD_Print("----------------");
break;
case 0x0F://用户密码
openDoor=1;
err = 0;
break;
case 0xEE://密码错误
LCD_GotoXY(0x0,1);
LCD_Print(" PassWord error ");
Beep(200);Beep(200);Beep(200);
delay_ms(500);
err++;
goto Start;
break;
default:
break;
}
}
else if(mode==PW_MODE_REGIST)//录入密码模式
{
sta=SetPassword(key);
LCD_GotoXY(0x00,0);
if(sta)
{
if(sta==0xF1)LCD_Print("Set PW.->[24C02]");
if(sta==0xF2)LCD_Print("Set PW.->[Flash]");
if((sta>>4)==0x0E)LCD_Print("*Set PW. Error* ");
Beep(200);
Beep(200);
delay_ms(400);
mode = PW_MODE_INPUT;//回到输入模式
goto Start;
}
}
}
else if((mode==PW_MODE_INPUT)||(mode==IC_REGIST)||(mode==IC_DELETE))
{
if(ReadICcode(buf)==0)
{
Dis_ICcode(buf);
Beep(200);
delay_ms(400);
sta=Search_IC(buf);
if(mode==PW_MODE_INPUT)
{
if(sta==0xEE)//新IC卡
{
err++;
openDoor = 0;
LCD_GotoXY(0x0,1);
LCD_Print(" IC code error ");
Beep(100);Beep(100);Beep(100);
delay_ms(1500);
goto Start;
}
else
{
openDoor = 1;
err = 0;
}
}
if(mode==IC_REGIST)
{
if(sta==0xEE)//新IC卡
{
sta = Find_hole_InLib();//在数据库中找到一个空位置
if(sta!=0xEE)
{
Save_IC(sta,buf); //存在这个空位置上
saveEEPROM=1;
LCD_GotoXY(0x0,1);
LCD_Print("Add IC Code OK ");
Beep(500);
}
else
{
LCD_GotoXY(0x0,1);
LCD_Print("Library Is Full ");
Beep(200);Beep(200);Beep(200);
}
}
else
{
LCD_GotoXY(0x0,1);
LCD_Print("IC Already Store");
Beep(200);Beep(200);Beep(200);
}
delay_ms(500);
goto Start;
}
if(mode==IC_DELETE)
{
if(sta==0xEE)//新IC卡
{
LCD_GotoXY(0x0,1);
LCD_Print("Delete Code ERR");
Beep(200);Beep(200);Beep(200);
}
else
{
sta=Search_IC(buf);
Delelt_ID_inLib(sta);
saveEEPROM=1;
LCD_GotoXY(0x0,1);
LCD_Print("Delete Code OK ");
Beep(500);
delay_ms(400);
}
delay_ms(500);
goto Start;
}
}
}
if(openDoor)
{
openDoor=0;
LCD_GotoXY(0x0,1);
LCD_Print("Opening the door");
//Relay=0;
buzzer = 0;
Motor1_Go_F(DEG180);
buzzer = 1;
//Beep(2000);
LCD_GotoXY(0x0,1);
LCD_Print(" Door Is Open ");
delay_ms(1000);
delay_ms(1000);
//Relay=1;
LCD_GotoXY(0x0,1);
LCD_Print("Closing the door");
buzzer = 0;
Motor1_Go_B(DEG180);
buzzer = 1;
LCD_GotoXY(0x0,1);
LCD_Print("----------------");
}
else
Motor1_Stop();
if(err>=3)
{
LCD_GotoXY(0x0,1);
LCD_Print("***Input Lock***");
while(1)
{
delay_ms(150);
buzzer = 0;
delay_ms(150);
buzzer = 1;
}
}
if(saveEEPROM)
{
saveEEPROM = 0;
for(i=0;i<8;i++)
buf[i] = code_PW[i];
for(i=0;i<12;i++)
buf[8+i]=IC_SN[i/4][i%4];
EEPROM_WRITE(buf,20);
}
}
}
void LCD1602_Hex(u8 _hex)
{
u8 temp = _hex>>4;
if(temp>9)LCD_WrDat(temp-10+'A');
else LCD_WrNUM(temp);
temp = _hex&0x0F;
if(temp>9)LCD_WrDat(temp-10+'A');
else LCD_WrNUM(temp);
}
void Dis_ICcode(u8* _IC)//显示16进制IC卡号
{
//"0123456789abcdef"
//"IC:78 FB A8 01 "
LCD_GotoXY(0x0,1);
LCD_Print("IC: ");
LCD_GotoXY(0x3,1);
LCD1602_Hex(_IC[0]);
LCD_GotoXY(0x6,1);
LCD1602_Hex(_IC[1]);
LCD_GotoXY(0x9,1);
LCD1602_Hex(_IC[2]);
LCD_GotoXY(0xC,1);
LCD1602_Hex(_IC[3]);
}
u8 Search_IC(u8 *_IC)//搜索IC卡,返回ID号
{
u8 i;
for(i=0;i<3;i++)
{
if((_IC[0]==IC_SN[i][0])
&&(_IC[1]==IC_SN[i][1])
&&(_IC[2]==IC_SN[i][2])
&&(_IC[3]==IC_SN[i][3]))
{
return i;
}
}
return 0xEE;
}
void Save_IC(u8 _ID,u8 *_IC)
{
u8 i;
for(i=0;i<4;i++)
{
IC_SN[_ID][i] = _IC[i];
}
}
u8 Find_hole_InLib(void)//搜索空闲位置
{
u8 IC_hole[4]={0};
return Search_IC(IC_hole);
}
void Delelt_ID_inLib(u8 _ID)//删除ID位置的卡号
{
u8 IC_hole[4]={0};
Save_IC(_ID,IC_hole) ;
}