📄 wanterhub.c
字号:
/*****************************************************************************************
* *
* File: 2006.10.26 *
* *
* Version: *
*
*
*****************************************************************************************/
#include <w77c32.h>
#include<absacc.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define NOP5() _nop_();_nop_();_nop_();_nop_();_nop_()
#define SYSFLAG XBYTE[0x0400]
#define SALEBEG_H XBYTE[0x0401]
#define SALEBEG_L XBYTE[0x0402]
#define SALEEND_H XBYTE[0x0403]
#define SALEEND_L XBYTE[0x0404]
#define FmSaleCount XBYTE[0X0405]
#define SALEBEG_H1 XBYTE[0x0406]
#define SALEBEG_L1 XBYTE[0x0407]
#define SALEEND_H1 XBYTE[0x0408]
#define SALEEND_L1 XBYTE[0x0409]
#define SALEBEG_H2 XBYTE[0x040a]
#define SALEBEG_L2 XBYTE[0x040b]
#define SALEEND_H2 XBYTE[0x040c]
#define SALEEND_L2 XBYTE[0x040d]
#define FmList XBYTE[0x040e]
#define TEST_XRAM XBYTE[0X0500] //检测XRAM区
#define SaleBuf XBYTE[0X0600] //no02
#define SaleInformationBuf XBYTE[0x1000]
#define SaleLength 13 //+pf 14BYTE
#define TimeLength 6
#define AccountLen 6 //+PF 7BYTE
uchar data status;
uchar data address; //HUB地址
uchar idata list; //流水号
uchar data PosName;
uchar data SaleCount; //打包数据消费笔数
uchar data Serial0SendNum; //串口0发送数据字节变量
uchar data Serial1SendNum; //串口1发送数据字节变量
uchar idata Ri1Buf[20]; //串口1接收缓冲区 与PCI卡通讯
uchar idata Ti1Buf[23]; //串口1发送缓冲区
uchar idata pci_count;
uchar xdata Ri0Buf[246]; //串口0接收缓冲区 与POS终端通讯
uchar xdata Ti0Buf[175]; //串口0发送缓冲区
uchar xdata AccountBuf[224]; //请求帐户信息列表 (1字节POS机号+5字节ID号)
//uchar xdata TimeUpdataBuf[6]; //时间更新信息
uchar xdata ListCode[32]; //消费流水帐号
uchar xdata *Serial0SendPoint=Ti0Buf;
uchar idata *Serial1SendPoint=Ti1Buf;
uchar xdata *SalePoint=&SaleInformationBuf; //消费流缓冲区指针
uint data SaleBeg;
uint data SaleEnd;
bdata char InOrOff[8]; //POS状态缓冲区
sbit beep=P1^0;
sbit re184_up=P3^2;//P1^6;
sbit batter=P3^3;
//sbit line_led=P1^7;
sbit fm_cs=P1^5;
sbit re184_dn=P1^6;//P3^2;
sbit line_addr=P1^1; //读地址片选
sbit watchdog=P1^7; //看门狗喂狗
bit f_zh; //请求帐号标志
bit f_zhdown;
bit f_send;
bit f_id;
bit f_sal;
bit s_err; //串口1接收错误
bit f_1500ms; //1.5秒到标志
bit f_ri1; //
bit f_time; //更新系统时间标志
bit f_serial1; //串口0正在发送数据标志
bit f_sign; //test 消费数据是否重复发送
bit f_over; //消费数据区满标志
bit f_zhstate;
bit f_err; //消费数据区指针异常
//函数申明
uchar ReadAddress(void); //读取HUB地址
void InialSerial(void); //初始化串口
void ClearXram(void); //清除片外RAM
void ClearXXram(void); //清理片外RAM 1000~8000,前提是ADD为FFH
void LookForPos(void); //轮寻POS
void SendByte(uchar data1); //串口1发送一字节
uchar ReceiveByte(void); //串口1接收一字节
void SendSaleRecord(void); //检测是否有消费数据发送
bit test_xram(void);
void ReckonFinger(void); //计算指针数据存储区头尾指针,结合ReadSys
void ReckonFinger1(void);
void ReadSys(void);
void beepp(uint times);
void poszhGet(void); //轮寻pos后判断pos是否已经申请过帐号 存储申请信息
//*******************************************************/
/*Function:测试XRAM */
/*Input: Non */
/*Output: bit */
/*Desription: */
/********************************************************/
bit test_xram( void )
{
uchar xdata *point=&TEST_XRAM;
uchar i;
fm_cs=0;
for(i=0;i<8;i++)
{
*point++=0x55;
}
point=&TEST_XRAM;
for(i=0;i<8;i++)
{
if(*point++!=0x55)
return(1);
}
point=&TEST_XRAM;
for(i=0;i<8;i++)
{
*point++=0x00;
}
fm_cs=1;
}
/********************************************************/
/*Function: 读取HUB地址 */
/*Input: Nun. */
/*Output: address */
/*Description: */
/********************************************************/
uchar ReadAddress(void)
{
uchar address;
line_addr=0;
NOP5();
address=P2;
line_addr=1;
if(address==0x7f)
{
ClearXXram();
}
return ~address;
}
/********************************************************/
/*Function: 判断是否恢复指针 */
/*Input: */
/*Output: */
/*Description: */
/********************************************************/
void ReckonFinger(void)
{
uchar xdata a,b,c,d;
fm_cs=0;
_nop_();
a=SALEBEG_H;
b=SALEBEG_H1;
c=SALEBEG_H2;
d=(a-b)|(a-c);
a=SALEBEG_L;
b=SALEBEG_L1;
c=SALEBEG_L2;
d+=(a-b)|(a-c);
a=SALEEND_H;
b=SALEEND_H1;
c=SALEEND_H2;
d+=(a-b)|(a-c);
a=SALEEND_L;
b=SALEEND_L1;
c=SALEEND_L2;
d+=(a-b)|(a-c);
if(d!=0)
{
ReckonFinger1();
beepp(400);
}
fm_cs=1;
}
/********************************************************/
/*Function: 恢复指针 */
/*Input: */
/*Output: */
/*Description: */
/********************************************************/
void ReckonFinger1(void)
{
uint xdata i,j,k;
uchar xdata *pnt=0x1000;
fm_cs=0;
_nop_();
k=0;
j=0;
for(i=0;i<2000;i++) //判断end
{
if(*pnt==0xff)
{
if(i==1999)
{
j=0; //end
k=0; //beg
i++;
break;
}
else
{
pnt+=14;
continue;
}
}
else
{
j=i++;
break;
}
}
for(;i<2000;i++)
{
if(*pnt!=0xff)
{
if(i==1999)
{
k=1999; //beg
i++;
break;
}
else
{
pnt+=14;
continue;
}
}
else
{
k=i;
i++;
break;
}
}
for(;i<2000;i++)
{
if(*pnt==0xff)
{
pnt+=14;
continue;
}
else
{
j=i;
break;
}
}
SaleBeg=k;
SaleBeg=SaleBeg%2000;
SALEBEG_H=SaleBeg/0x100;
SALEBEG_L=SaleBeg%0x100;
SALEBEG_H1=SALEBEG_H;
SALEBEG_L1=SALEBEG_L;
SALEBEG_H2=SALEBEG_H;
SALEBEG_L2=SALEBEG_L;
SaleEnd=j;
SaleEnd=SaleEnd%2000;
SALEEND_H=SaleEnd/0x100;
SALEEND_L=SaleEnd%0x100;
SALEEND_H1=SALEEND_H;
SALEEND_L1=SALEEND_L;
SALEEND_H2=SALEEND_H;
SALEEND_L2=SALEEND_L;
fm_cs=1;
}
/********************************************************/
/*Function: 读取系统标志和缓冲区数据数目 */
/*Input: Nun. */
/*Output: Nun. */
/*Description: */
/********************************************************/
void ReadSys(void)
{
fm_cs=0;
_nop_();
if (SYSFLAG==0xaa)
{
SaleBeg=SALEBEG_H*0x100+SALEBEG_L;
SaleEnd=SALEEND_H*0x100+SALEEND_L;
if((SaleBeg+1)%2000==SaleEnd)
f_over=1;
else
f_over=0;
list=FmList;
SaleCount=FmSaleCount;
if(SaleCount!=0)
{
f_sal=1;
}
else
{
f_sal=0;
}
}
else
{
SYSFLAG=0xaa;
f_over=0;
SaleBeg=0;SaleEnd=0;
SALEBEG_H=0;SALEBEG_L=0;
SALEEND_H=0;SALEEND_L=0;
SALEBEG_H1=0;
SALEBEG_L1=0;
SALEBEG_H2=0;
SALEBEG_L2=0;
SALEEND_H1=0;
SALEEND_L1=0;
SALEEND_H2=0;
SALEEND_L2=0;
SaleCount=0;FmSaleCount=0;f_sal=0;FmList=0;
}
fm_cs=1;
}
/********************************************************/
/*Function: 清除片外RAM */
/*Input: Nun. */
/*Output: Nun. */
/*Description: */
/********************************************************/
void ClearXram(void)
{
uchar xdata *pnt=0x0000;
uint i;
for (i=0;i<0x0400;i++)
*pnt++=0xff;
}
//Function: 清除片外RAM
void ClearXXram(void)
{
uchar xdata *pnt=0x1000;
uint i;
fm_cs=0;
_nop_();
SYSFLAG=0xaa;
f_over=0;
SaleBeg=0;SaleEnd=0;
SALEBEG_H=0;SALEBEG_L=0;
SALEEND_H=0;SALEEND_L=0;
SALEBEG_H1=0;
SALEBEG_L1=0;
SALEBEG_H2=0;
SALEBEG_L2=0;
SALEEND_H1=0;
SALEEND_L1=0;
SALEEND_H2=0;
SALEEND_L2=0;
SaleCount=0;FmSaleCount=0;f_sal=0;FmList=0;
for (i=0;i<0x8000;i++)
*pnt++=0xff;
f_err=0;
fm_cs=1;
}
/********************************************************/
/*Function: 初始化定时器0 */
/*Input: Nun. */
/*Output: Nun. */
/*Description: */
/********************************************************/
void InialTime0(void)
{
TH0=-(30000/256);
TL0=-(30000%256);
ET0=1;
TR0=1;
}
/********************************************************/
/*Function: 初始化串口 */
/*Input: Nun. */
/*Output: Nun. */
/*Description: */
/********************************************************/
void InialSerial(void)
{
SCON=0xf0; //串口1与POS通讯 28800bps
SCON1=0xd0; //串口0与PCI卡通讯 115200bps
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -