📄 stccoinboxnew.c
字号:
/*
void WriteACK(uchar ack)
{
bSda=ack;
Delay();
bScl=1;
Delay();
bScl=0;
}
*/
/********************************************
内部函数,等待ACK
********************************************/
/*
void WaitACK()
{ uchar errtime=20;
bSda=1;
Delay(); //读ACK
bScl=1;
Delay();
while(bSda)
{ errtime--;
if(!errtime) Stop();
}
bScl=0;
Delay();
}
*/
/********************************************
内部函数.输出数据字节
入口:B=数据
********************************************/
/*
void writebyte(uchar wdata)
{
uchar nCnt;
for(nCnt=0;nCnt<8;nCnt++)
{
if(wdata&0x80) bSda=1;
else bSda=0;
wdata<<=1;
bScl=1;
Delay();
bScl=0;
}
WaitACK(); //I2C器件或通讯出错,将会退出I2C通讯
}
*/
/********************************************
内部函数.输入数据
出口:B
********************************************/
/*
uchar Readbyte()
{
uchar nCnt,bytedata;
bSda=1;
for(nCnt=0;nCnt<8;nCnt++)
{
bScl=1;
bytedata<<=1;
bytedata|=bSda;
bScl=0;
Delay();
}
return(bytedata);
}
*/
/********************************************
输出数据->pcf8563
********************************************/
/*
void writeData(uchar address,uchar mdata)
{
Start();
WriteOneByte(0xa2); //写命令//
WriteOneByte(address); //写地址//
WriteOneByte(mdata); //写数据//
Stop();
}
*/
void writeData(uchar address,uchar mdata)
{bit bEepromAck ;
EA=0;
Start();
WriteOneByte(0xa2);
bSda = 1;
bEepromAck = CheckAck();
WriteOneByte(address);
bSda = 1;
bEepromAck = CheckAck();
WriteOneByte(mdata);
bSda = 1;
bEepromAck = CheckAck();
Stop();
EA=1;
}
/********************************************
输入数据<-pcf8563
********************************************/
uchar ReadData(uchar address) /*单字节*/
{ uchar rdata;
bit bEepromAck ;
Start();
WriteOneByte(0xa2); /*写命令*/
bSda = 1 ;
bEepromAck = CheckAck();
if(bEepromAck==1) return FALSE ;
WriteOneByte(address); /*写地址*/
bSda = 1 ;
bEepromAck = CheckAck();
if(bEepromAck==1) return FALSE ;
Start();
WriteOneByte(0xa3); /*读命令*/
bSda = 1 ;
bEepromAck = CheckAck();
if(bEepromAck==1) return FALSE ;
rdata=ReadOneByte();
NoAck();
Stop();
return(rdata);
}
void ReadData1(uchar address,uchar count,uchar * buff) /*多字节*/
{ bit bEepromAck;
uchar nCnt;
Start();
WriteOneByte(0xa2); /*写命令*/
bSda = 1 ;
bEepromAck = CheckAck();
if(bEepromAck==1) return ;//FALSE;
WriteOneByte(address); /*写地址*/
bSda = 1 ;
bEepromAck = CheckAck();
if(bEepromAck==1) return;// FALSE;
Start();
//WP=0;
WriteOneByte(0xa3); /*读命令*/
bSda = 1 ;
bEepromAck = CheckAck();
if(bEepromAck==1) return;// FALSE;
//Start();
for(nCnt=0;nCnt<count;nCnt++)
{
buff[nCnt]=ReadOneByte();
if(nCnt!=count-1)
{
Ack();
bSda = 1 ;
}
else
{
NoAck();
}
}
Stop();
}
/********************************************
内部函数,读入时间到内部缓冲区
********************************************/
void P8563_Read()
{ uchar idata time[7];
ReadData1(0x02,0x07,time);
g8563_Store[0]=time[0]&0x7f;//&0x7f; /*秒*/
g8563_Store[1]=time[1]&0x7f;//time[1]&0x7f; /*分*/
g8563_Store[2]=time[2]&0x3f; /*小时*/
g8563_Store[3]=time[3]&0x3F; /*日*/
g8563_Store[4]=time[4]&0x07; /*星期*/
g8563_Store[5]=time[5]&0x1F; /*月*/
g8563_Store[6]=time[6]&0xFF; /*年*/
}
/********************************************
读入时间到内部缓冲区----外部调用
********************************************/
void P8563_gettime()
{
P8563_Read();
if(g8563_Store[0]==0)
P8563_Read(); /*如果为秒=0,为防止时间变化,再读一次*/
}
/********************************************
写时间修改值
********************************************/
void P8563_settime()
{
uchar nCnt;
for(nCnt=3;nCnt<=5;nCnt++) { writeData(nCnt,g8563_Store[nCnt-2]); }
writeData(7,g8563_Store[5]);
writeData(8,g8563_Store[6]);
}
/********************************************
P8563的初始化-----外部调用
********************************************/
void P8563_init()
{
// uchar nCnt;
if((ReadData(0xa)&0x3f)!=0x8) /*检查是否第一次启动,是则初始化时间*/
{
//for(nCnt=0;nCnt<=3;nCnt++) g8563_Store[nCnt]=c8563_Store[nCnt]; /*初始化时间*/
P8563_Read();
P8563_settime();
writeData(0x0,0x00);
//writeData(0xa,0x8); /*8:00报警*/
//writeData(0x1,0x12); /*报警有效*/
writeData(0xd,0x00);
}
}
/**************************PCF8563**************************************/
/////////////////////////////////////////////////////////
void Lcd(void)
{
////////////////
if(bDotShow == FALSE) //FALSE//TRUE
{ DotOff; }
else
{
DotOn2;
//if(!bKeyok_Set) DotOn1;
}
if((nSpareMoney < Init_CoinValue)&&(T_Status==0)&&(keystatus==0))
{
if(bShowMoneyTotalPermit==1)
{
// for(nCnt=4;nCnt<10;nCnt++)Lcddis[nCnt]=LcdSeg[10];
TotalMoneyOn;Delay();
// Disp_Process();
}
else
{
// for(nCnt=4;nCnt<10;nCnt++)Lcddis[nCnt]=LcdSeg[10];
Nop;
Nop;
// InitMoneyOn;
}
}
//////////////////////////////////////
switch ( nDisCount )
{
case 0:
nLcdDisplay1 = Lcddis[0];
nLcdDisplay2 = Lcddis[0];
nLcdDisplay2 >>= 4;
LcdSendData(0,nLcdDisplay1);
LcdSendData(1,nLcdDisplay2);
nDisCount = 1;
break;
case 1:
nLcdDisplay1 = Lcddis[1];
nLcdDisplay2 = Lcddis[1];
nLcdDisplay2 >>= 4;
LcdSendData(2,nLcdDisplay1);
LcdSendData(3,nLcdDisplay2);
nDisCount = 2;
break;
case 2:
nLcdDisplay1 = Lcddis[2];
nLcdDisplay2 = Lcddis[2];
nLcdDisplay2 >>= 4;
LcdSendData(4,nLcdDisplay1);
LcdSendData(5,nLcdDisplay2);
nDisCount = 3;
break;
case 3:
nLcdDisplay1 = Lcddis[3];
nLcdDisplay2 = Lcddis[3];
nLcdDisplay2 >>= 4;
LcdSendData(6,nLcdDisplay1);
LcdSendData(7,nLcdDisplay2);
nDisCount = 4;
break;
case 4:
nLcdDisplay1 = Lcddis[4];
nLcdDisplay2 = Lcddis[4];
nLcdDisplay2 >>= 4;
LcdSendData(8,nLcdDisplay1);
LcdSendData(9,nLcdDisplay2);
nDisCount = 5;
break;
case 5:
nLcdDisplay1 = Lcddis[5];
nLcdDisplay2 = Lcddis[5];
nLcdDisplay2 >>= 4;
LcdSendData(10,nLcdDisplay1);
LcdSendData(11,nLcdDisplay2);
nDisCount = 6;
break;
case 6:
nLcdDisplay1 = Lcddis[6];
nLcdDisplay2 = Lcddis[6];
nLcdDisplay2 >>= 4;
LcdSendData(12,nLcdDisplay1);
LcdSendData(13,nLcdDisplay2);
nDisCount = 7;
break;
case 7:
nLcdDisplay1 = Lcddis[7];
nLcdDisplay2 = Lcddis[7];
nLcdDisplay2 >>= 4;
LcdSendData(14,nLcdDisplay1);
LcdSendData(15,nLcdDisplay2);
nDisCount = 8;
break;
case 8:
nLcdDisplay1 = Lcddis[8];
nLcdDisplay2 = Lcddis[8];
nLcdDisplay2 >>= 4;
LcdSendData(16,nLcdDisplay1);
LcdSendData(17,nLcdDisplay2);
nDisCount = 9;
break;
case 9:
nLcdDisplay1 = Lcddis[9];
nLcdDisplay2 = Lcddis[9];
nLcdDisplay2 >>= 4;
LcdSendData(18,nLcdDisplay1);
LcdSendData(19,nLcdDisplay2);
nDisCount = 10;
break;
case 10:
nLcdDisplay1 = Lcddis[10];
nLcdDisplay2 = Lcddis[10];
nLcdDisplay2 >>= 4;
LcdSendData(20,nLcdDisplay1);
LcdSendData(21,nLcdDisplay2);
nDisCount = 11;
break;
case 11:
nLcdDisplay2 = Lcddis[11];
LcdSendData(22,nLcdDisplay1);
nDisCount = 0;
break;
default:
nDisCount = 0;
break;
}
}
void LcdSendCommand(uchar nCommand)
{
uchar nCount ;
unsigned int nSerialData ;
//bit bSendBit ;
bLcdData = HIGH ;
bLcdClock = HIGH ;
bLcdCS = LOW ;
nSerialData = 0x0400 | nCommand ;
for(nCount=0;nCount<12;nCount++)
{
if(nSerialData & 0x0400)
{
bSendBit = 1 ;
}
else
{
bSendBit = 0 ;
}
bLcdData = bSendBit ;
NOP() ;
bLcdClock = LOW ;
Delay();
bLcdClock = HIGH ;
nSerialData <<= 1 ;
}
bLcdCS = HIGH ;
}
void LcdSendData(uchar nAddress,uchar nData)
{
uchar nCount ;
unsigned int nSerialData ;
//bit bSendBit ;
bLcdData = HIGH ;
bLcdClock = HIGH ;
bLcdCS = LOW ;
nAddress &= 0x3f ;
nData &= 0x0f ;
nSerialData = 0x0140 | nAddress ;
nSerialData <<= 4 ;
nSerialData |= nData ;//*nData:低位在前*/
for(nCount=0;nCount<13;nCount++)
{
if(nSerialData & 0x1000)
{
bSendBit = 1 ;
}
else
{
bSendBit = 0 ;
}
bLcdData = bSendBit ;
Delay();
bLcdClock = LOW ;
Delay();
bLcdClock = HIGH ;
nSerialData <<= 1 ;
}
bLcdCS = HIGH ;
}
/////////////////////////////////////////////////////////////////
/*******************************************************/
/******************按键扫描处理************************************/
/******************************************************************/
void Timer0() interrupt 1 using 2
{
TH0=0xf8; //TH0 = 0xf8; //2ms for 12MHZ
TL0=0xcd; //TL0 = 0x30;
P2 = P2|0x08;
//P3 = 0x7f;
P1|=0x04;
bKey_Test=P1&0x04;
P1 = P1|KeyOff;
nTimeCounter++;
SendTime++;
ReceiveTime++;
Cointime++;
// Movtime++;
Totaltime++;
if(bEepromErasePermit)nEepromEraseDelayTime++;
if(bPulseFirstCount)nPulseDelayTime++;
//if(nPulseDelayTime>3000){nPulseDelayTime=0;bPulseFirstCount=0;}
if(bBuzzDelayPermit)nBuzzDelayTime++;
if(bBuzzDelayPermit1)nBuzzDelayTime++;
if(!bKeyok_Set)nflashOnOffDelayTime++;
if((nSpareMoney ==0)&&(keystatus==0)&&(T_Status==0)&&(!bCoinPower))
{
nSpeakDelay++;
nSpeakFlashTime++;
}
else {nSpeakDelay=0;nSpeakFlashTime=0;bSpeakPermit=0;}
if(bTansmitMoneyFull_Delay1Minute)nTansmitMoneyFull_Delay++;
if(nTansmitMoneyFull_Delay>30000){nTansmitMoneyFull_Delay=0;bTansmitMoneyFull_Delay1Minute=0;}
// if((bClearTotalCoinPermit)||(bClearTotalNumberPermit))nClearKeyCounter++;
if(bStartTC35iPermit)GsmDelayTime++;
if(bDelay20mS)GsmDelayTime++;
// if(bDelay160mS)Delay160mSTime++;
// if(Delay160mSTime>80){Delay160mSTime=0;bDelay160mS=0;}
// if(bDelay1S)Delay1STime++;
// if(Delay1STime>500){Delay1STime=0;bDelay1S=0;}
//if(bDelay3S)GsmDelayTime++;
if((GsmDelayTime>10)&&(bDelay20mS)){GsmDelayTime=0;bDelay20mS=0;}
if(GsmDelayTime>1500){GsmDelayTime=0;bStartTC35iPermit=0;}//bDelay3S=0;
// if(StartUpDelayTime>100){GsmDelayTime=0;bStartTC35iPermit=0; }
keydata1 = P1&KeyOff;
/**********************Check coin signal for part A*********/
////////////////////////////////////////////////////////////
if((T_Status==0)&&(nSpareMoney==0))
{
if(((keydata1!=KeyOff)||(bSensorCheck==0))&&(bCoinReceiveA == 1))
{
//////////////////////////////////////////////////////////
nKeyHighLevel2Counter++;
nKeyLowLevel2Counter = 0;
if(nKeyHighLevel2Counter>=KeyMaxHighLevel)
{
nKeyProcessStep2 = 1;
//nKeyHighLevel2Counter =KeyMaxHighLe;
if(bSensorCheck==0)//霍尔检测,显示投币总金额
{
bShowMoneyTotalPermit=1;
bShowTotalcoinsumPermit=1;
bdisp=1;Disp_Process();
keystatus=0;
Totaltime=0;
}
keydata = keydata1;
bKeyPermit = FALSE;
// if(nKeyHighLevel2Counter==KeyMaxHighLevel)
// {Movtime=0;}
// bBeepFlag = TRUE;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -