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

📄 waterpos.c

📁 水控POS机的程序
💻 C
📖 第 1 页 / 共 4 页
字号:
                               uchar data *point=idcode;
                               uchar data i;
                               uchar data pf;

                               *pnt++=0x9;
                               *pnt++=0x2;
                               pf=0x0b;

                               *pnt++=address;
                               pf+=address;

                               for (i=0;i<5;i++)
                               {
                                   *pnt++=*point;
                                   pf+=*point++;
                               }

                               *pnt++=pf;
                               serial0_sendnum=0x9;
                               TI=1;
                               re184=1;
                               NOP5();
                            }

                         //--------流水发送?------------
                            else if (f_sal)
                            {
                                 uchar data i;
                                 uchar data pf;
                                 uchar xdata *pnt=sendbuf;
                                 uchar xdata *pnt1=salebuf;

                                 *pnt++=17;
                                 *pnt++=0x3;
                                 pf=20;

                                 for (i=0;i<14;i++)
                                 {
                                     *pnt=*pnt1++;
                                     pf+=*pnt++;
                                 }

                                 *pnt++=pf;
                                 serial0_sendnum=17;

                                 TI=1;
                                 re184=1;
                                 NOP5();
                            }

                            //-------普通应答-------
                            else
                            {
                                uchar xdata *pnt=sendbuf;
                                uchar data pf;

                                *pnt++=0x5;            //数据长度
                                *pnt++=0x1;            //功能号
                                pf=0x6;
                                *pnt++=address;        //地址
                                pf+=address;
                                *pnt++=status;         //功能状态
                                pf+=status;
                                *pnt++=pf;             //校验和
                                serial0_sendnum=5;

                                TI=1;
                                re184=1;
                                NOP5();
                            }
                       }
                       break;


                       case 0x02://接收指定ID号的信息
                       {
                            f_zh=0; //请求到帐号
                       }
                       break;


                       case 0x03://更新时间
                       {
                       }
                       break;

                       case 0x04://收到消费流水后的应答
                       {
                            if (receivebuf[1]==0x55)
                               f_sal=0;               //清除发送流水记录标志
                       }
                       break;

                       case 0x05://管理机检测在线POS
                       {
                            uchar xdata *pnt=sendbuf;
                            uchar data pf;

                            *pnt++=0x3;            //数据长度
                            *pnt++=0x04;            //功能号
                            pf=0x7;
                            *pnt++=pf;             //校验和
                            serial0_sendnum=3;

                            TI=1;
                            re184=1;
                            NOP5();
                       }
                       break;

                       default:
                       {
                       }
                       break;
                  }

                  lengh=0; pf=0;
                  rmod=0; SM2=1;
               }
               else
               {                       //接收校验和错误
                  lengh=0; pf=0;
                  rmod=0; SM2=1;
               }
             }
             break;

             default:
             {
                    lengh=0;
                    pf=0;
                    rmod=0;
                    SM2=1;
             }
             break;
            }


     }

     //串口中断发送中断处理
     if (TI)
     {
          TI=0;re184=1;
          if(serial0_sendnum!=0)                //判断是否发送完毕
              {

                SBUF=*serial0_ReadSendPoint;
                serial0_ReadSendPoint++;
                serial0_sendnum--;

              }
          else
              {
               serial0_ReadSendPoint=sendbuf;   //发送完毕,恢复指针
               NOP5();NOP5();
               re184=0;
              }
       }
}

//************************************
//函数功能:检测水表发讯信号/60ms
//入口参数,出口参数:无
//************************************
void read_plus(void)
{
 if(!plusa)
    { delay_ms(10);
      if(plusa==0){
       if(lastplusa) f_plusa=1;
       lastplusa=plusa;
       }
       lastplusa=plusa;
    }
 else
    lastplusa=plusa;

 if(!plusb)
    { delay_ms(10);
      if(plusb==0){
      if(lastplusb) f_plusb=1;
      lastplusb=plusb;
      }
      lastplusb=plusb;
    }
 else
    lastplusb=plusb;
}

/**********************************/
/*功能:求XORSUM                  */
/**********************************/
bit xorsum(void)
{
    uchar i;
    uchar data *p;		 /*定义一个指针变量*/
    uchar xrlsum;

    p=idcode;	         /*将指针指向数组头*/
    xrlsum=0;                /*初始化校验和单元*/

    for (i=0;i<5;i++)
	xrlsum=xrlsum^(*p++);

    if (*p++==xrlsum)
    {
       return 1;
    }
    else
    {
       return 0;
    }

}


/********************************/
/*功能:判断卡信息合法性         */
/*1、比较标志                   */
/*2、比较ID卡号                 */
/********************************/
bit JudgeFlagId(void)
{
    uchar data i;
    uchar data money_h;
    uchar data *pnt=idcode;
    uchar xdata *pnt1=&receivebuf[2];
    uchar fm_data;
    uint  fm_add;

    f_err=0;

    switch (receivebuf[1])     //判断标志位
    {
      case 0:
             error=ERR10;       //写未注册错误代码 ERR10
             f_err=1;           //置位错误标志
             break;

      case 1:
             break;

      case 2:
             error=ERR11;       //写挂失卡错误代码 ERR11
             f_err=1;           //置位错误标志
             break;

      case 3:
             break;

      default:
              break;
    }

  if(f_err) return (f_err);     //判断标志比较有无错误,有则提前返回

  fm_add=fm_data*0x0+0x4;
  for(i=0;i<5;i++)              //开始比较卡号
    {
      if(*pnt++==*pnt1)
        {
        iwrbyte(fm_add++,*pnt1++);
        }

      else
       {
        error=ERR14;            //写卡号比较错误代码 ERR14
        f_err=1;                //置位错误标志
        break;}

      if(f_err) break;
    }

  if (f_err) return (f_err);    //判断卡号比较是否错误,有误提前返回

  money_h=*pnt1;                      //取出卡金额的最高字节
  if (money_h&0x80)                   //判断卡金额的最高位
  {
     f_err=1;
     error=ERR9;
  }
  return (f_err);

}

/********************************/
/*功能:显示机号函数             */
/*入口参数:无                  */
/*出口参数:无                  */
/********************************/
void disp_name(void)
{
     if((!f_off_line)&&(!f_com))
       {
        dispbuf[0]=0xb;
        dispbuf[1]=0xb;
        dispbuf[2]=address/100;
        dispbuf[3]=(address%100)/10;
        dispbuf[4]=address%10;
        }
      else if(!f_com)
        {
           dispbuf[0]=0xa;
           dispbuf[1]=0xa;
           dispbuf[2]=0xa;
           dispbuf[3]=0xa;
           dispbuf[4]=0xa;
        }
      else
        {
           dispbuf[0]=0xa;
           dispbuf[1]=0xa;
           dispbuf[2]=address/100;
           dispbuf[3]=(address%100)/10;
           dispbuf[4]=address%10;
        }

      disp();
}


//***************************************
//函数功能:将显示缓冲区的数据显示到LED上
//***************************************
void disp(void)
{
     uchar data i;
     for (i=0;i<5;i++)
    {
        byte_to_595(tempt[dispbuf[i]]);
     }
     NOP5();
     rclk=1;NOP5();NOP5();
     rclk=0;NOP5();NOP5();rclk=1;            //正跳变,将数据并行打出
}
//******************************************
//功能:卡中余额
//入口参数:无
//出口参数:无
//******************************************
void disp_money(void)
{    uchar i=5;
     ulong moneycopy;

     if (money<0x800000)
     {
        dispbuf[4]=(money%1000000)/100000;//dispbuf[0]=(money%100000)/10000;
        dispbuf[3]=(money%100000)/10000;//dispbuf[1]=(money%10000)/1000;
        dispbuf[2]=(money%10000)/1000;//dispbuf[2]=(money%1000)/100;
        dispbuf[1]=(money%1000)/100;//dispbuf[3]=(money%100)/10;
        dispbuf[0]=money%100/10;//dispbuf[4]=money%10;

        if(money<=999999)
          {
          if( dispbuf[4]==0 )
             {
             dispbuf[4]=0xa;
                 if( dispbuf[3]==0 )
                 dispbuf[3]=0xa;
             }
          }

     }
     else
     {
        moneycopy=~money+1;

        dispbuf[4]=0xb;
        dispbuf[3]=(moneycopy%100000)/10000;
        dispbuf[2]=(moneycopy%10000)/1000;
        dispbuf[1]=(moneycopy%1000)/100;
        dispbuf[0]=moneycopy%100/10;

        if(dispbuf[3]==0)
           dispbuf[3]=0xa;

     }

     while(i--)
     {     if(i==2)
             byte_to_595(tempt[dispbuf[i]]|0x80); //添加小数点
           else
             byte_to_595(tempt[dispbuf[i]]);

     }                                            //连续输出5字节数据

     NOP5();
     rclk=1;NOP5();NOP5();
     rclk=0;NOP5();NOP5();rclk=1;                 //正跳变,将数据并行打出

}
//*******************************
//功能:595发送一个字节
//入口参数: value--待发送的数据
//*******************************
void byte_to_595(uchar value)
{
        ACC=value;
        ser=a7;srclk=0;_nop_();_nop_();srclk=1;
        ser=a6;srclk=0;_nop_();_nop_();srclk=1;
        ser=a5;srclk=0;_nop_();_nop_();srclk=1;
        ser=a4;srclk=0;_nop_();_nop_();srclk=1;
        ser=a3;srclk=0;_nop_();_nop_();srclk=1;
        ser=a2;srclk=0;_nop_();_nop_();srclk=1;
        ser=a1;srclk=0;_nop_();_nop_();srclk=1;
        ser=a0;srclk=0;_nop_();_nop_();srclk=1;
}


/////////以下FM操作函数///////////
//*************************************************
//iic起始函数
//*************************************************
void iic_start(void)
{
    sda1=1;
    _nop_();
    scl1=1;  //起始条件建立时间大于4.7us
    NOP5();
    sda1=0;  //起始条件锁定时间大于4.7us
    NOP5();
    scl1=0;  //钳住总线准备发送数据
    _nop_();
}


//*********************
//iic停止函数
//*********************
void iic_stop(void)
{
    sda1=0;
    _nop_();
    scl1=1;      //发送结束时间的时钟信号
    NOP5();     //结束时间大于4us
    sda1=1;      //结束总线
    NOP5();     //保证一个终止信号和起始信号的空闲时间大于4.7us
}

//*********************
//发送应答信号函数
//*********************
void mack(void)
{
    sda1=0;             //将sda1置0
    _nop_();_nop_();
    scl1=1;
    NOP5();             //保持数据时间,即scl1为高的时间大于4.7us
    scl1=0;
    _nop_();_nop_();

}

//******************
//发送非应答位函数
//******************
void mnack(void)
{
    sda1=1;      //将sda1置1
    _nop_();_nop_();
    scl1=1;
    NOP5();     //保持数据时间,即scl1为高的时间大于4.7us
    scl1=0;
    _nop_();_nop_();
}

//********************
//检查应答位函数
//********************
bit cack(void)
{
    sda1=1;
    _nop_();_nop_();
    scl1=1;
    _nop_();_nop_();_nop_();

    if(sda1)
    {
      _nop_();
      scl1=0;
      _nop_();
      return 0;
    }

    else
    {
      _nop_();
      scl1=0;
      _nop_();
      return 1;
    }
}

//********************
//发送字节函数
//********************
void wrbyte(uchar byte)
{
    ACC=byte;
    sda1=a7;_nop_();scl1=1;NOP5();scl1=0;NOP5();
    sda1=a6;_nop_();scl1=1;NOP5();scl1=0;NOP5();
    sda1=a5;_nop_();scl1=1;NOP5();scl1=0;NOP5();
    sda1=a4;_nop_();scl1=1;NOP5();scl1=0;NOP5();
    sda1=a3;_nop_();scl1=1;NOP5();scl1=0;NOP5();
    sda1=a2;_nop_();scl1=1;NOP5();scl1=0;NOP5();
    sda1=a1;_nop_();scl1=1;NOP5();scl1=0;NOP5();
    sda1=a0;_nop_();scl1=1;NOP5();scl1=0;NOP5();

}

//********************
//读取一个字节
//********************
uchar rdbyte(void)
{
    sda1=1;_nop_();scl1=1;_nop_();_nop_();a7=sda1;scl1=0;NOP5();
    sda1=1;_nop_();scl1=1;_nop_();_nop_();a6=sda1;scl1=0;NOP5();
    sda1=1;_nop_();scl1=1;_nop_();_nop_();a5=sda1;scl1=0;NOP5();
    sda1=1;_nop_();scl1=1;_nop_();_nop_();a4=sda1;scl1=0;NOP5();
    sda1=1;_nop_();scl1=1;_nop_();_nop_();a3=sda1;scl1=0;NOP5();
    sda1=1;_nop_();scl1=1;_nop_();_nop_();a2=sda1;scl1=0;NOP5();
    sda1=1;_nop_();scl1=1;_nop_();_nop_();a1=sda1;scl1=0;NOP5();
    sda1=1;_nop_();scl1=1;_nop_();_nop_();a0=sda1;scl1=0;NOP5();

    return ACC;
}

//********************
//从指定地址读取1个字节数据
//********************
uchar irdbyte(uint address)
{
    uchar dd;
	dd=((address&0x7ff)/256)<<1;

    iic_start();

    wrbyte(0xa0|dd);
    if(cack()!=1){iic_stop();return;}

    wrbyte(address);
    if(cack()!=1){iic_stop();return;}
    scl1=0;

    iic_start();

    wrbyte(0xa1|dd);
    if(cack()!=1){iic_stop();return;}

    dd=rdbyte();
    mnack();        //发送非应答位
    iic_stop();

⌨️ 快捷键说明

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