📄 waterpos.c
字号:
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 + -