菜鸟小艾 2023-05-15 01:16 采纳率: 70.6%
浏览 89
已结题

关于#c语言#的问题:需要c语言代码的详细注释和流程图

需要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) ;
}
  • 写回答

3条回答 默认 最新

  • yy64ll826 2023-05-16 11:16
    关注

    需要多详细

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 5月22日
  • 创建了问题 5月15日