📄 addcard.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 + -