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

📄 addcard.c

📁 一体化锁主程序
💻 C
字号:
#include "KKZQ.H"
//
//=====================================================================================
//                  RAM资源
//   占用 45 个字节      eeprom_buf[]  =  24个字节        读写x24c128
//                       set_user_buf[]=  16个字节        用户信息
//                       card_index;       1个字节        卡用户数量寄存器
//                       card_addr;        1个字节        当前相同卡号对应的EEPROM位置
//===================================================================================
//EEPROM 地址分配
//0x0000 - 0x1000   256 x 16字节  用户卡号存储区,                  占用64页 EEPROM
//0x1000 - 0x3000   512 x 16字节  事件存储区 (最多存储512事件)      占用128页EEPROM
//0x3000 - 0x3040   4   x 16字节  工作日准进时段  (4张表格,每个表格对应4个准进时段,一张表格占用16个字节)
//0x3040 - 0x3050   1   x 16字节  非工作日准进时段(1张表格,表格对应4个准进时段,一张表格占用16个字节)
//0x3080 - 0x3e80   16 x 7 x 32   星期准进时段-->对应16张表格   每个表格包含7天(星期一 --- 星期日)
//                                每天包含6个准进时段 每个时段4个字节
//                                (每天的时段24个字节,占用EEPROM半页)
//0x3e80 - 0x3f80   2 x  128      节假日时间存储区(最多保存128个假日)
//                                每个节日占用2个字节 xx:yy   xx 月  yy 日
//
//0x3fc0  -  0x3fc1        刷卡器用户数量
//0x3fc2  -  0x3fc3        休息日设定存储区    每星期2天
//0x3fc4                   门锁继电器执行时间  最大25.6秒
//0x3fc5                   开门后延迟时间  最大25.6秒
//0x3fc6  -  0x3fca        历史事件计数器,当前历史纪录序号存储区 5个字节
//0x3fcb                   节假日天数计数器

//==========================================================================

xdata uchar user_buf[960];          //用户EM卡信息数组,可存放60个用户
// 用户EM卡信息数组数据安排
// 每个用户占用 16 个子节
// 偏移量  0 --- 4   用户卡号            5
// 偏移量  5 --- 8   用户ID号            4
// 偏移量  9 --- 10  用户密码            2
// 偏移量  11 -- 14  用户有效期, 年月日  4
// 偏移量  15 --     用户权限            1
//
uchar idata set_user_buf[16];       //接收到的卡信息缓冲区
uchar idata eeprom_buf[16];

// 用户EM卡信息数组数据安排
// 每个用户占用 16 个子节
// 偏移量  0 --- 4   用户卡号            5
// 偏移量  5 --- 8   用户ID号            4
// 偏移量  9 --- 10  用户密码            2
// 偏移量  11 -- 14  用户有效期, 年月日  4
// 偏移量  15 --     用户权限            1
//
uchar idata card_index;         //卡用户数量寄存器

//==========================================================================
uchar serch_order();            //匹配卡号函数
uchar serch_id();               //匹配ID函数
uchar add_card();               //加卡函数
uchar del_card(uchar ch);       //删卡函数

void  save_history();           //保存历史函数
//==============================================================================
//filename : add_card()
//功    能 : 增加一个用户
//           1. 将新用户添加到用户结构数组尾部
//           2. 用户个数加 1
//           3. 最大用户数 = 60
//返    回 : 添加成功返回 ----------- 0
//           该卡号已存在 ----------- 1
//           该ID号已存在 ----------- 2
//           缓冲区已满不能再添加 --- 3
//==============================================================================
//xdata uchar user_buf[960];          //用户EM卡信息数组,可存放60个用户
// 用户EM卡信息数组数据安排
// 每个用户占用 16 个子节
// 偏移量  0 --- 4   用户卡号            5
// 偏移量  5 --- 8   用户ID号            4
// 偏移量  9 --- 10  用户密码            2
// 偏移量  11 -- 14  用户有效期, 年月日  4
// 偏移量  15 --     用户权限            1

uchar add_card(void)
{
    uchar i,j,k;
    uint t;
    uchar xdata *curip,*nextip;
    if(card_index)
    {   if(card_index>59)return(3);     //没有空间
        nextip=&user_buf;
        for(i=0;i<card_index;i++)
        {   curip=nextip; nextip+=16;
            k=0;
            for(j=0;j<5;j++)
            {   if(*curip==set_user_buf[j]){if(++k==5)return(1);}
                ++curip;
            }
            k=0;
            for(j=5;j<9;j++)
            {   if(*curip==set_user_buf[j]){if(++k==4)return(2);}
                ++curip;
            }
        }
    }
    t=(uint)card_index*16;
    nextip=&user_buf+t;
    for(i=0;i<16;i++){*nextip=set_user_buf[i];nextip++;}//新增用户信息保存在RAN
    write128(16,t,&set_user_buf);        //写入24c128
    ++card_index;
    write128(1,index_addr,&card_index);  //保存用户数量
    return(0);
}

//=============================================================================
//判断ID号函数
//功    能 : 匹配ID号
//           如果ID号已存在,返回ID号所在的位置(0-59)
//           如果ID号不存在,返回0x50
//           在添加新用户删除用户时调用此函数
//           card_index    EEPROM存储的用户卡的数量
//           set_user_buf[]    当前的卡号
//=============================================================================

uchar serch_id(void)
{   uchar i,j,k;
    uchar xdata *curip,*nextip;
    nextip=&user_buf;
    for(i=0;i<card_index;i++)
    {   curip=nextip; nextip+=16;
        k=0;
        for(j=5;j<9;j++)
        {   if(*curip==set_user_buf[j])
            {   ++k;
                if(k==4)return(i);
            }
            ++curip;
        }
    }
    return(0x50);
}
//==============================================================================
//filename : serch_order()
//功    能 : 匹配卡号
//           如果卡号已存在,返回ID号所在的位置(0-59)
//           如果卡号不存在,返回0x50
//           在添加新用户删除用户时调用此函数
//==============================================================================
uchar serch_order()
{   uchar i,j,k;
    uchar xdata *curip,*nextip;
    nextip=&user_buf;
    for(i=0;i<card_index;i++)
    {   curip=nextip; nextip+=16;
        k=0;
        for(j=0;j<5;j++)
        {   if(*curip==set_user_buf[j])
            {   ++k;
                if(k==5)return(i);
            }
            ++curip;
        }
    }
    return(0x50);
}

//==============================================================================
//filename : del_card(uchar type)
//功    能 : 按照type值删除一个用户
//           type = 0; 删除结构数组中所有用户
//           type = 1; 删除结构数组中指定卡号的用户
//           type = 2; 删除结构数组中指定ID号的用户
//           如果被删除用户不在数组的尾部, 将数组尾部用户信息移到当前位置
//           保证数组的连续性
//参    数 :
//返    回 : 0  ---- 该用户已删除
//           1  ---- 该用户不存在
//=============================================================================
uchar del_card(uchar ch)
{
    uchar i,j;
    uint  k;
    uchar xdata *sip,*tip;

    if(ch==0){card_index=0; return(0);}
    else if(ch==1)i=serch_order();       //按卡号删除
    else i=serch_id();                   //按ID号删除
    if(i==0x50)return(1);                //没有用户返回1
    --card_index;
    if((card_index)&&(i!=card_index))
    {   k=(uint)i*16;  tip=&user_buf+k;
        k=(uint)(card_index)*16;  sip=&user_buf+k;
        for(j=0;j<16;j++)
        {   *tip=*sip;
            eeprom_buf[j]=*sip;
            tip++; sip++;
        }
        k=(uint)i*16;
        write128(16,k,&eeprom_buf);          //将最后一组数据保存到24c128
    }
    write128(1,index_addr,&card_index);      //保存用户数量
    return(0);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -