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

📄 card_adddel.c

📁 采用430单片机完成的门禁控制器程序
💻 C
字号:
/*****卡号重复错误******/
void cdsameerror(uint n)
{
  uint i;
  uint j=0;
  TX_DATA[0] =0XAA;
  TX_DATA[1] =0X03;
  TX_DATA[2] =0X03;
  i =n/4;
  TX_DATA[3] =0x00;
  TX_DATA[4] =(i>>8) & 0xff;
  TX_DATA[5] =i & 0xff;
  /****计算和值******/
  for(i=0; i<n+6; i++)
  {
    j += TX_DATA[i];
  }
  j &= 0xff;
  TX_DATA[n+6] = j;
  
  tx_len = n+7;
  FLAG |=gb_tx;
}
/****接收正常*****/
void card_receive_ok()
{
  TX_DATA[0] = 0XAA;
  TX_DATA[1] = 0X03;
  TX_DATA[2] = 0X01;
  TX_DATA[3] = 0XAE;
  tx_len =4;
  FLAG |=gb_tx;
}
/***********/
/**********/
/****增加卡号*****/
void card_add(ulong addr_pre, ulong ncount)
{
  uchar m;
  uchar cardbuf[4];
  ulong j;
  ulong addr39;
  
  /***查询新增的卡号是否已存在,查询次数为增加卡号的数目****/  
  if(ncount>0)
  {
    addr39 = addr_pre;    //查询从正式卡或者巡更卡的存储首地址开始
    for(j=0; j<ncount; j++)  //循环以已存储的卡号数目为终止
    {
      for(m=0; m<4; m++)    //读取一个完整的卡号
      {
        cardbuf[m] =read040(addr39);
        addr39++;
      }
      /***判断是否已存在,如果已存在,则记录到RX_DATA中,并置
       标志位,通知卡号重复******/
      if((cardbuf[0]==RX_DATA[6]) && (cardbuf[1]==RX_DATA[7])
         && (cardbuf[2]==RX_DATA[8]) && (cardbuf[3]==RX_DATA[9]))
      {
        TX_DATA[6] = RX_DATA[6];
        TX_DATA[7] = RX_DATA[7];
        TX_DATA[8] = RX_DATA[8];
        TX_DATA[9] = RX_DATA[9];
        FLAG1 |= gb_cdsame;
        break;
      }
    }
  }
  /*如果卡号重复,则调用出错程序,赋值TX_DATA*/
  if(FLAG1 & gb_cdsame)
  {
    cdsameerror(4);
  }
  else
  {
    addr39 =addr_pre + ncount*4;
    for(j=6; j<10; j++)
    {
      write040pre();
      write040(addr39, RX_DATA[j]);
      addr39++;
    }
  }
}
/****增加正式卡号*****/
void card_addvip()
{
  if(FLAG & gb_addvip)
  {
    FLAG &=~gb_addvip;
    if(nvip<500)
    {
      ulong addr_pre=0x00;
      card_add(addr_pre, nvip);
      if(FLAG1 & gb_cdsame)
      {
        FLAG1 &=~gb_cdsame;
      }
      else
      {
        nvip +=1;
        card_receive_ok();
        FLAG1 |=gb_flashw;
      }  
    }      
  }
}
/****增加巡更卡号*****/
void card_addnom()
{
  if(FLAG & gb_addnom)
  {
    FLAG &=~gb_addnom;
    if(nnom < 500)
    {
      ulong addr_pre;
      addr_pre =0x1000;    //巡更卡号从0x1000开始
      card_add(addr_pre, nnom);
      if(FLAG1 & gb_cdsame)
      {
        FLAG1 &=~gb_cdsame;
      }
      else
      {
        nnom +=1;
        card_receive_ok();
        FLAG1 |=gb_flashw;
      }    
    }
  }
}

/*****删除卡号处理程序******/
void deldeal()
{
  if(FLAG1 & gb_deldeal)
  {
    FLAG1 &= ~gb_deldeal;
    ulong i;
    uchar cardbuf;
    for(i=0; i<nvip*4; i++)
    {
      cardbuf = read040(i);
      write040pre();
      write040((i+0x70000),cardbuf);
    }
    for(i=0x1000; i<(nnom*4+0x1000); i++)
    {
      cardbuf = read040(i);
      write040pre();
      write040((i+0x70000),cardbuf);
    }
    erasesector040(0x0000);
    if(addrbuf < 0x1000)
    {
      for(i=0; i<addrbuf; i++)
      {
        cardbuf =  read040(i+0x70000);
        write040pre();
        write040(i,cardbuf);
      }
      for(i=addrbuf; i<(nvip-1)*4; i++)
      {
        cardbuf = read040(i+0x70004);
        write040pre();
        write040(i,cardbuf);
      }
      for(i=0x1000; i<(nnom*4+0x1000); i++)
      {
        cardbuf = read040(i+0x70000);
        write040pre();
        write040(i,cardbuf);
      }
    }
    else
    {
      for(i=0; i<nvip*4; i++)
      {
        cardbuf =  read040(i+0x70000);
        write040pre();
        write040(i,cardbuf);
      }
      for(i=0x1000; i<addrbuf; i++)
      {
        cardbuf = read040(i+0x70000);
        write040pre();
        write040(i,cardbuf);
      }
      for(i=addrbuf; i<((nnom-1)*4+0x1000); i++)
      {
        cardbuf = read040(i+0x70004);
        write040pre();
        write040(i,cardbuf);
      }
    }
    addrbuf =0;
  }
}
/****删除卡号*********/
void card_del(ulong add_pre, ulong ncount)
{
  uchar m;
  uchar cardbuf[4];
  ulong j;
  ulong addr39;
  /***查询删除的卡号是否已存在,查询次数为增加卡号的数目****/
  addr39 = add_pre;    //查询从正式卡或者巡更卡的存储首地址开始
  for(j=0; j<ncount; j++)  //循环以已存储的卡号数目为终止
  {
    for(m=0; m<4; m++)    //读取一个完整的卡号
    {
      cardbuf[m] =read040(addr39);
      addr39++;
    }
    /***判断是否已存在,如果已存在,则记录地址。
     如果不存在,则记录到TX_DATA中,并置标志位,通知卡号不存在******/
    if(cardbuf[0]==RX_DATA[6] && cardbuf[1]==RX_DATA[7]
       && cardbuf[2]==RX_DATA[8] && cardbuf[3]==RX_DATA[9])
    {
      addrbuf = addr39-4;
      break;
    }
    else if(addr39>=(ncount*4+add_pre))
    {
      TX_DATA[6] = RX_DATA[6];
      TX_DATA[7] = RX_DATA[7];
      TX_DATA[8] = RX_DATA[8];
      TX_DATA[9] = RX_DATA[9];
      FLAG1 |=gb_cdsame;
    }
  }
}
/****删除正式卡号*****/
void card_delvip()
{
  if(FLAG & gb_delvip)
  {
    FLAG &=~gb_delvip;
    ulong del_pre;
    del_pre =0x00;
    if(nvip==0)
    {
      FLAG1 |=gb_cdsame;
      TX_DATA[6] = RX_DATA[6];
      TX_DATA[7] = RX_DATA[7];
      TX_DATA[8] = RX_DATA[8];
      TX_DATA[9] = RX_DATA[9];
      cdsameerror(4);
      FLAG1 &=~gb_cdsame;
    }
    else
    {
      card_del(del_pre, nvip);
      if(FLAG1 & gb_cdsame)
      {
        cdsameerror(4);
        FLAG1 &=~gb_cdsame;
      }
      else
      {
        nvip -=1;
        card_receive_ok();
        FLAG1 |=gb_flashw;
        FLAG1 |=gb_era7;
        FLAG1 |=gb_deldeal; 
      }      
    }
  }
}

/****删除巡更卡号*****/
void card_delnom()
{
  if(FLAG & gb_delnom)
  {
    FLAG &=~gb_delnom;
    FLAG &=~gb_delvip;
    ulong  del_pre;
    del_pre =0x1000;
    //addrrr =ncount_cardvip*4;
    if(nnom==0)
    {
      FLAG1 |=gb_cdsame;
      TX_DATA[6] = RX_DATA[6];
      TX_DATA[7] = RX_DATA[7];
      TX_DATA[8] = RX_DATA[8];
      TX_DATA[9] = RX_DATA[9];
      cdsameerror(4);
      FLAG1 &=~gb_cdsame;
    }
    else
    {
      card_del(del_pre, nnom);
      if(FLAG1 & gb_cdsame)
      {
        cdsameerror(4);
        FLAG1 &=~gb_cdsame;
      }
      else
      {
        nnom -=1;
        card_receive_ok();
        FLAG1 |=gb_flashw;
        FLAG1 |=gb_era7;
        FLAG1 |=gb_deldeal; 
      }      
    }
  }
}

⌨️ 快捷键说明

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