求下面这段代码的注释和流程图,尽可能的详细一些,实在是有些看不懂啊~(„ಡωಡ„)栓Q
#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) ;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:1、C语言和汇编的区别(汇编完全对应机器操作,C对应逻辑操作)
(1)C语言叫高级语言,汇编语言叫低级语言。
(2)低级语言的意思是汇编语言和机器操作相对应,汇编语言只是CPU的机器码的助记符,用汇编语言写程序必须拥有机器的思维。因为不同的CPU设计时指令集差异很大,因此用汇编编程的差异很大。
(3)高级语言(C语言)它对低级语言进行了封装(C语言的编译器来完成),给程序员提供了一个靠近人类思维的一些语法特征,人类不用过于考虑机器原理,而可以按照自己的逻辑原理来编程。譬如数组、结构体、指针····
(4)更高级的语言如java、C#等只是进一步强化了C语言提供的人性化的操作语法,在易用性上、安全性上进行了提升。
2、C语言的一些“小动作”
(1)高级语言中有一些元素(如运算符等)是机器中没有的
(2)高级语言在运算中允许我们大跨度的运算。意思就是低级语言中需要好几步才能完成的一个运算,在高级语言中只要一步即可完成。譬如C语言中一个变量i要加1,在C中只需要i++即可,看起来只有一句代码。但实际上翻译到汇编阶段需要3步才能完成:第1步从内存中读取i到寄存器,第2步对寄存器中的i进行加1,第3步将加1后的i写回内存中的i。
3、使用临时变量来理解强制类型转换
4、使用临时变量来理解不同数据类型之间的运算
#include <stdio.h>
int main(void)
{
int b;
float a;
b = 10;
a = b / 3; // 第一步先算 b/3,第二步将第一步的结果强制类型转换为float生成一个临时变量,第三步将第二步生成的临时变量赋值给a,第四步销毁临时变量。
printf("a = %f.\n", a);
/*
int b;
float a, f;
b = 10;
f = 1.5;
a = b / f;
printf("a = %f.\n", a);
*/
/*
float a = 12.34;
int b = (int)a; // a被强制类型转换后自己本身竟然没变
// (int)a强制类型转换并赋值在底层实际分了4个步骤:第一步先在另外的地方找一个内存构建一个临时变量x(x的类型是int,x的值等于a的整数部分),第二步将float a的值的整数部分赋值给x,第三步将x赋值给b,第四步销毁x。
// 最后结果:a还是float而且值保持不变,b是a的整数部分。
printf("a = %f, b = %d.\n", a, b);
*/
return 0;
}