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

📄 stccoinboxnew.c

📁 投币按摩椅驱动程序
💻 C
📖 第 1 页 / 共 5 页
字号:
/*
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 + -