📄 waterpos.c
字号:
return(dd);
}
//********************
//从指定地址连续读取N 个字节
//********************
uchar read_N_fm(uint address,uchar number,uchar *point)
{ uchar i;
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;}
for(i=0;i<number-1;i++)
{*point++=rdbyte();
mack(); //发送非应答位
}
*point++=rdbyte();
mnack();
iic_stop();
}
//***********************************************
//函数功能:向指定地址写一个数据
//入口参数:address--指定写入地址 dd--写入数据
//出口参数:无
//***********************************************
void iwrbyte(uint address,uchar dd)
{
uchar ddd;
ddd=((address&0x7ff)/256)<<1;
wp=0; //写允许
iic_start();
wrbyte(0xa0|ddd);
if(cack()!=1){iic_stop();return;}
wrbyte(address);
if(cack()!=1){iic_stop();return;}
wrbyte(dd);
if(cack()!=1){iic_stop();return;}
iic_stop();
wp=1; //写禁止
}
//***********************************************
//函数功能:向指定地址写入N个数据
//入口参数:*point--源数据首地址 address--目的地址 count--写入数据个数
//出口参数:无
//*****************************************************
void write_N_fm(uchar xdata *point,uint address,uchar count)
{
uchar ddd;
ddd=((address&0x7ff)/256)<<1;
wp=0; //写允许
iic_start();
wrbyte(0xa0|ddd);
if(cack()!=1){iic_stop();return;}
wrbyte(address);
if(cack()!=1){iic_stop();return;}
for(ddd=0;ddd<count;ddd++){
wrbyte(*point++);
if(cack()!=1){iic_stop();return;}
}
iic_stop();
wp=1; //写禁止
}
/////////以上FM操作函数///////////
/************************
函数功能:ms级延时子程序
************************/
void delay_ms(uint count)
{
uchar i;
while ((count--)!=0)
{
for (i=0;i<125;i++)
{;}
}
}
/************************
函数功能:10ms级延时子程序
************************/
void wait10ms()
{
uchar i,j;
for (j=0;j<10;j++)
{
for (i=0;i<125;i++)
{;}
}
}
//************************
//函数功能:蜂鸣器短叫一声
//************************
void beepp(void)
{
beep=0;
delay_ms(254);
beep=1;
}
/****************************************************************************/
/*函数功能:收集消费数据 */
/* uchar xdata salebuf: flag+adress+IDnumber+time+sale totle: 17 */
/*入口参数:无 */
/*输出参数:无 */
/****************************************************************************/
void collect_saledata(void)
{
uchar i,j;
uchar xdata *pnt=salebuf;
//uchar data *pnt1=idcode;
//uchar xdata *pnt1=&fm_idnum;
uchar fm_data;
uint fm_add;
*pnt++=0x41;//flag; //标志
*pnt++=address; /*pos address*/
fm_add=fm_data*0x0+0x4;
for (i=0;i<5;i++)
{
//*pnt++=*pnt1++; /*ID Number*/
*pnt++=irdbyte( fm_add++ );
}
expence=liuliang*(ulong)rate;
if (expence==0)
{
*pnt++=0;
*pnt++=0;
*pnt++=rate;
*pnt++=0;
*pnt++=0;
*pnt++=50;
*pnt++=salecount++;
}
else
{
*pnt++=liuliang/0x10000;
*pnt++=liuliang/0x100;
*pnt++=liuliang%0x100;
*pnt++=expence/0x10000;
*pnt++=expence/0x100;
*pnt++=expence%0x100;
*pnt++=salecount++;
}
}
//-----关闭电磁阀------
void closevalue(void)
{
cm_a=0;
cm_b=1;
}
//----打开电磁阀---------------
void openvalue(void)
{
cm_a=1;
cm_b=0;
}
//---------处理请求到的帐户信息--------------
void accounts(void)
{
if (JudgeFlagId()!=1) //判断卡标志和ID号码
{
money=receivebuf[7]*0x10000+receivebuf[8]*0x100+receivebuf[9]; //3 char to ULONG
if(money!=0)
{
rate=receivebuf[10]; //保存费率
iwrbyte( SAL_RATE,rate );
expence=0; //消费额清零
liuliang=0;
disp_money();
error=0;
}
else
{
f_err=1; //显示卡中余额
error=ERR9;
}
}
}
//-----错误报警处理-----------------------------------------
void errordeal(void)
{
uchar idata i;
switch (error)
{
case 0: /*---ERR 0 */
break;
case 1: /*---ERR 1 */
break;
case 2: /*---ERR 2 */
break;
case 3: /*---ERR 3 */
break;
case 4: /*---ERR 4 */
break;
case 5: /*---ERR 5 */
break;
case 6: /*---ERR 6 */
break;
case 7: /*---ERR 7 */
break;
case 8: /*读卡错误*/
dispbuf[0]=0xc;
dispbuf[1]=0xd;
dispbuf[2]=0xd;
dispbuf[3]=0x0;
dispbuf[4]=0x8;
beep=0;
disp();
delay_ms(1500); /*delay 1.5s */
beep=1;
disp_name();
break; /*---ERR 8 */
case 9: /*---ERR 9 --- 卡中余额不足 --- */
dispbuf[0]=0xc;
dispbuf[1]=0xd;
dispbuf[2]=0xd;
dispbuf[3]=0x0;
dispbuf[4]=0x9;
closevalue();
beep=0;
disp();
delay_ms(1500); /*delay 1.5s */
beep=1;
disp_name();
break;
case 0xa: /*---ERR 10 --- 此卡未注册 --- */
dispbuf[0]=0xc;
dispbuf[1]=0xd;
dispbuf[2]=0xd;
dispbuf[3]=0x1;
dispbuf[4]=0x0;
closevalue();
beep=0;
disp();
delay_ms(1500); /*delay 1.5s */
beep=1;
disp_name();
break;
case 0xb: /*---ERR 11 --- 注销卡 --- */
dispbuf[0]=0xc;
dispbuf[1]=0xd;
dispbuf[2]=0xd;
dispbuf[3]=0x1;
dispbuf[4]=0x1;
closevalue();
beep=0;
disp();
delay_ms(1500); /*delay 1.5s */
beep=1;
disp_name();
break;
case 0xc: /*网络线出现问题----------*/
dispbuf[0]=0xc;
dispbuf[1]=0xd;
dispbuf[2]=0xd;
dispbuf[3]=0x1;
dispbuf[4]=0x2;
beep=0;
disp();
delay_ms(1500); /*delay 1.5s */
beep=1;
disp_name();
break;
case 0xd: /*---ERR 13 --- 请求卡信息超时 --- */
dispbuf[0]=0xc;
dispbuf[1]=0xd;
dispbuf[2]=0xd;
dispbuf[3]=0x1;
dispbuf[4]=0x3;
beep=0;
disp();
delay_ms(1500); /*delay 1.5s */
beep=1;
disp_name();
break;
case 0xe: /*---ERR 14 --- 卡号比较不正确 --- */
dispbuf[0]=0xc;
dispbuf[1]=0xd;
dispbuf[2]=0xd;
dispbuf[3]=0x1;
dispbuf[4]=0x4;
beep=0;
disp();
delay_ms(1500); /*delay 1.5s */
beep=1;
disp_name();
break;
case 0xf: /*---ERR 15 */
break;
case 0x10: /*---ERR 16 */
break;
default:
break;
}
}
/***************************************************/
/*-------更新帐户余额和消费流量--------------------*/
/***************************************************/
void updata(void)
{ if(f_com)
{
if(error==13)
{
liuliang++;
money=liuliang;
disp_money();
}
else
{
liuliang++;
expence=liuliang*(ulong)rate;
money=money-(ulong)rate; /*更新消费金额 */
if(money>=0x800000)
{
f_mifare=0;
Card_On_Or_Off_Count=0;
}
else
{
disp_money();
}
}
}
else
{
liuliang++;
money=liuliang;
disp_money();
}
}
/*-----清除片外RAM------*/
void clear_xram(void)
{
uchar xdata *pnt;
uint i;
for(i=0;i<0x400;i++)
*pnt++=0;
}
/**********************************/
/******保存消费数据和消费费率******/
void SaveSaleRecord(void)
{ uchar fm_data;
uint fm_add;
uchar *pnt=idcode;
uchar i;
fm_data=irdbyte(SAL_BEG);
if(fm_data==200)
{
fm_data=0;
iwrbyte( SAL_END,0X0 );
}
fm_add=fm_data*0x8+0x100;
for(i=0;i<5;i++)
{
iwrbyte(fm_add++,*pnt++);
}
iwrbyte( fm_add++, liuliang/0x10000 );
iwrbyte( fm_add++, liuliang/0x100 );
iwrbyte( fm_add++, liuliang%0x100 );
fm_data=irdbyte( SAL_BEG );
fm_data+=1;
iwrbyte ( SAL_BEG ,fm_data );
}
/********************************************************/
/********************************************************/
void ReadSaleData(void)
{
uchar i;
uchar fm_data;
uint fm_add;
uchar xdata *pnt=salebuf;
ulong saveexpence;
ulong saveliuliang;
*pnt++=0x41;
*pnt++=address;
fm_data=irdbyte( SAL_END );
fm_add=fm_data*0x8+0x100;
for(i=0;i<5;i++)
{
*pnt++=irdbyte( fm_add++ );
}
saveliuliang=irdbyte( fm_add++)*0x10000;
saveliuliang+=irdbyte( fm_add++)*0x100;
saveliuliang+=irdbyte( fm_add );
rate=irdbyte( SAL_RATE );
saveexpence=saveliuliang*(ulong)rate;
if (saveexpence==0)
{
*pnt++=0;
*pnt++=0;
*pnt++=rate;
*pnt++=0;
*pnt++=0;
*pnt++=50;
*pnt++=salecount++;
}
else
{
*pnt++=saveliuliang/0x10000;
*pnt++=saveliuliang/0x100;
*pnt++=saveliuliang%0x100;
*pnt++=saveexpence/0x10000;
*pnt++=saveexpence/0x100;
*pnt++=saveexpence%0x100;
*pnt++=salecount++;
}
fm_data=irdbyte( SAL_END );
fm_data++;
iwrbyte( SAL_END, fm_data);
f_sal=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -