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

📄 main.c

📁 C51源码.其内文件包含spi
💻 C
字号:
#include 	"C8051F020.h"
#include 	"absacc.h"
#include 	"string.h"
#include 	"stdlib.h"
#include 	"stdio.h"
#include 	"setjmp.h"
#include	"intrins.h"
#include 	"define.h"
#include    "Hzcode.h"
#include    "ZiTi.h"

#include "Init.c"
#include "Edit.c"
#include "ADC.c"
#include "DAC.c"
#include "SPI.c"
#include "I2C.c"
#include "Uart.c"
#include "Timer.c"



//#define  SYSCLK         22118400L       // System clock frequency in Hz

#define  SMB_FREQUENCY  10000L         // Target SCL clock rate
                                       // This example supports between 10kHz
                                       // and 100kHz

#define  WRITE          0x00           // WRITE direction bit
#define  READ           0x01           // READ direction bit

// Device addresses (7 bits, lsb is a don't care)
#define  SLAVE_ADDR     0x64           // Device address for slave target

#define  MY_ADDR        0x02           // Address of this SMBus device
                                       // (dummy value since this device does
                                       // not have any defined slave states)

#define  SMB_BUS_ERROR  0x00           // (all modes) BUS ERROR
#define  SMB_START      0x08           // (MT & MR) START transmitted
#define  SMB_RP_START   0x10           // (MT & MR) repeated START
#define  SMB_MTADDACK   0x18           // (MT) Slave address + W transmitted;
                                       //    ACK received
#define  SMB_MTADDNACK  0x20           // (MT) Slave address + W transmitted;
                                       //    NACK received
#define  SMB_MTDBACK    0x28           // (MT) data byte transmitted;
                                       //    ACK rec'vd
#define  SMB_MTDBNACK   0x30           // (MT) data byte transmitted;
                                       //    NACK rec'vd
#define  SMB_MTARBLOST  0x38           // (MT) arbitration lost
#define  SMB_MRADDACK   0x40           // (MR) Slave address + R transmitted;
                                       //    ACK received
#define  SMB_MRADDNACK  0x48           // (MR) Slave address + R transmitted;
                                       //    NACK received
#define  SMB_MRDBACK    0x50           // (MR) data byte rec'vd;
                                       //    ACK transmitted
#define  SMB_MRDBNACK   0x58           // (MR) data byte rec'vd;
                                       //    NACK transmitted

sbit SDA = P0^0;                       // SMBus on P0.0
sbit SCL = P0^1;                       // and P0.1

unsigned char SMB_DATA_IN;             // Global holder for SMBus data
                                       // All receive data is written here

unsigned char SMB_DATA_OUT;            // Global holder for SMBus data.
                                       // All transmit data is read from here

unsigned char TARGET;                  // Target SMBus slave address

bit SMB_BUSY;                          // Software flag to indicate when the
                                       // SMB_Read() or SMB_Write() functions
                                       // have claimed the SMBus

bit SMB_RW;                            // Software flag to indicate the
                                       // direction of the current transfer

unsigned long NUM_ERRORS;              // Counter for the number of errors.


//-----------------------------------------------------------------------------
// SMBus_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters   : None
//
// The SMBus peripheral is configured as follows:
// - SMBus enabled
// - Assert Acknowledge low (AA bit = 1b)
// - Free and SCL low timeout detection enabled
//
void SMBus_Init (void)
{
   SMB0CN = 0x07;                      // Assert Acknowledge low (AA bit = 1b);
                                       // Enable SMBus Free timeout detect;
                                       // Enable SCL low timeout detect

   // SMBus clock rate (derived approximation from the Tlow and Thigh equations
   // in the SMB0CR register description)
   SMB0CR = 257 - (SYSCLK / (2 * SMB_FREQUENCY));

   //SMB0ADR = MY_ADDR;                  // Set own slave address.

   SMB0CN |= 0x40;                     // Enable SMBus;

}


void I2CStart()
{
	STA = 1;
}
void WaitAck()
{
	byte ch,i=5;
	while(i--)
	{
		ch = SMB0STA;
		if(ch == SMB_MTADDACK)
			break;
	}
}
void I2CSendByte(byte Dat)
{
	byte ch;
	
	while(1)
	{
		ch = SMB0STA;
		if(ch == SMB_START)
			break;
	}
	STA = 0;

	SMB0DAT = Dat;
	//SMB_BUSY = 1; 
	while (SMB_BUSY); 
}
void I2CStop()
{
	STO = 1;
}
void SendNotAck()
{
	AA = 0;
}
void SendAck()
{
	AA = 1;
}
byte I2CReceiveByte()
{
	byte Dat;
	Dat =  SMB0DAT;
	SMB_BUSY = 0;
	return   Dat;
}
uchar Clock(uchar opt, uchar tm, uchar val)
{ 	
	uchar buf[8];

	switch(opt)
	{
	case TIME_INIT:
		Ds1307(RD_OPT, 0, 8, buf);
		buf[0] &= 0x7f;
		buf[2] &= 0x3f;
		buf[7] = 0;
		Ds1307(WR_OPT, 0, 8, buf);
		break;
	case WR_OPT:
		Ds1307(WR_OPT, tm, 1, &val);
		break;
	default:
		;
	}
	return 0;
}
void Ds1307(opt, uchar word_addr, uchar num, uchar *buf)
{
    uchar i;
	uchar device_addr;

	switch(opt)
	{
	case WR_OPT:
		device_addr = 0x64;
		I2CStart();
		I2CSendByte(device_addr);
		WaitAck();

		I2CSendByte(word_addr);
		WaitAck();

		for (i = 0; i < num; i++)
		{
			I2CSendByte(buf[i]);
			WaitAck();
		}

		I2CStop();
		break;

	case RD_OPT:
		//set the begin address
		device_addr = 0x64;
		I2CStart();
	    I2CSendByte(device_addr);
	    WaitAck();
	    I2CSendByte(word_addr);
		WaitAck();
		I2CStop();

		device_addr = 0x65;
	    I2CStart();
	    I2CSendByte(device_addr);
	    WaitAck();

	    for (i = 0; i < num; i++)
		{
			buf[i] = I2CReceiveByte();
			if (i != num - 1)
			SendAck();//除最后一个字节外,其他都要从MASTER发应答。
		}

		SendNotAck();
		I2CStop();
		break;
	}
}
byte hexbcd(uchar kir)
{
	byte ch;
	ch=kir/0x10;
	ch=ch*10+kir%0x10;
	return ch;
}

void GetTime(void)
{
	uchar ch;
	uchar i;
	byte  xdata buff[8];
	uchar xdata a[6] = {0, 1, 2, 4, 5, 6};
	uchar xdata b[6] = {17, 14, 11, 8, 5, 2};

	Ds1307(RD_OPT, 0, 8, buff);

	for (i = 0; i < 6; i++)
	{
		time_hexbuff[i] = buff[a[i]];
		time_buff[i]=hexbcd(buff[a[i]]);

		ch = time_buff[i];
		
		str_time[b[i]] = ch /10;
		
		str_time[b[i] + 1] = ch % 10;
	}
	str_time[1]=0;
	str_time[0]=2;
}

	   /*******SPI0*************/

void Timer0_us(byte n)
{
	byte i,j;
	for(i=0;i<n;i++)
	{
		for(j=0;j<100;j++);
	}
} 
void SPI0_Init (void)
{
	SPI0CFG = 0x07;                     // data sampled on 1st SCK rising edge
                                       	// 8-bit data words

   	SPI0CN = 0x03;                      // Master mode; SPI enabled; flags
                                       	// cleared
   	SPI0CKR = SYSCLK/2/2000000;         // SPI clock <= 2MHz (limited by 
                                       	// EEPROM spec.)
   	//EIE1 |= 0x01; 

	SPI_WP		=	1;
	SPI_HOLD	=	1;
	CS25		=	1;
}
/*

BYTE  CheckSPIF()
{
	uint  Cnt=0;

	while(1)
	{
		Cnt++;
		if(SPIF)
		{
			SPIF = 0;
			return 1;
		}

		if(Cnt>10000)
			return 0;
	}
}

				*/
/*
BYTE  SPI_WRITE_CMD(BYTE CMD)
{
	CS25 = 0;
	SPIF = 0;

	SPI0DAT = CMD;
	while (SPIF == 0);

	CS25 = 1;
	return 1;
}

BYTE  SPI_WRITE_STA(BYTE STA)
{
	CS25 = 0;
	SPIF = 0;

	SPI0DAT = SPI_WRITE_STA_REG;
	while (SPIF == 0);
	
	SPIF = 0;

	SPI0DAT = STA;
	while (SPIF == 0);

	CS25 = 1;
	return 1;
}
BYTE  SPI_READ_STA(BYTE *STA)
{
	CS25 = 0;
	SPIF = 0;

	SPI0DAT = SPI_READ_STA_REG;
	while (SPIF == 0);

	SPIF = 0 ;
	SPI0DAT = 5;
	while (SPIF == 0);		
	STA[0] = SPI0DAT ;

	CS25 = 1;
	return 1;
}

BYTE  SPI_Write_Pro(byte *addr,byte *buf,byte len)
{
	uint i;	
	byte ret;

	SPI_WRITE_CMD(0x06);
	Timer0_us(1);

//	SPI_WRITE_STA(0xff);

	SPI_READ_STA(&ret);

	CS25 = 0;
	SPIF = 0;
	Timer0_us(1);

	SPI0DAT = 2;
	while (SPIF == 0);


	for(i=0;i<3;i++)
	{
		SPIF = 0;
		SPI0DAT = 0;//addr[i];
		while (SPIF == 0);
	}
	Timer0_us(1);
	for(i=0;i<256;i++)
	{
		SPIF = 0;
		SPI0DAT = 255-i;//buf[i];
		while (SPIF == 0);
	}
	while(1)
	{
		SPI_READ_STA(&i);
		if((i&0xfe)==0)
			break;
	}
	
	Timer0_us(1);
	CS25 = 1;

	SPI_WRITE_CMD(0x04);

	return 1;
} 
 */
/*
BYTE CheckBusy()
{
	uint  Cnt=0;

	while(1)
	{
		Cnt++;
		if(!BUSY)
		{
			SPIF = 0;
			return 1;
		}

		if(Cnt>10000)
			return 0;
	}
}
*/
byte  abc;
byte  xdata buf[256] = {1,2};
	byte xdata  RecBuf[256] = {0};
BYTE  SPI_Read_Pro(byte *addr,byte *buf,byte len)
{
	byte i,ch;

	CS25 = 0;
	SPIF = 0;
	Timer0_us(1);

	SPI0DAT = 0x03;
	while (SPIF == 0); 

	for(i=0;i<3;i++)
	{ 	
		SPIF = 0;	
		SPI0DAT = 0;//addr[i];
		while (SPIF == 0);
	} 	

	for(i=0;i<len;i++)
	{
		RecBuf[i]=0x55;
		SPIF = 0;
		SPI0DAT = 0;
  		while (SPIF == 0); 		
		abc = SPI0DAT;		
		RecBuf[i] = abc;
		//Timer0_us(1);
		//dis_int_numXX(0,2,0,RecBuf[i]);
	
	}
	
   
   	CS25 = 1;
	Timer0_us(1);
	return 1;
} 
///////////////////////////

byte initSpi()
{
	byte ret;
	SPI_WRITE_CMD(SPI_WRITE_ENABLE);
	SPI_WRITE_STA(0x80);
	SPI_READ_STA(&ret);

	return ret;
}
/*BYTE SPI_TEST_PRO()
{
	byte ret;
	byte addr[3]={0,0,0};
	
//
//	ret = SPI_WRITE_CMD(SPI_WRITE_ENABLE);
	
//	if(!ret)
//		return 0;

//	SPI_READ_STA(&ret);

//	ret = SPI_WRITE_CMD(SPI_WRITE_DISABLE);
	
//	if(!ret)
//		return 0;

//	SPI_READ_STA(&ret);

//	ret = SPI_WRITE_CMD(SPI_WRITE_ENABLE);
	
//	if(!ret)
//		return 0;

//	SPI_READ_STA(&ret);


	ret = SPI_Write_Pro(addr,buf,256);
	

	if(!ret)
		return 0;
	
	ret = SPI_Read_Pro(addr,RecBuf,255);
	
	if(!ret)
		return 0;
	dis_int_numXX(0,2,0,RecBuf[0]) ;
	dis_int_numXX(0,4,0,RecBuf[1]) ;
 
	return ret;
}
 */

byte cnt=0;
void SPI0_ISR (void) interrupt 6
{
	SPIF = 0;
	if(hh==0)
		datasoi[cnt++] =  SPI0DAT;
	else
		hh=0;
}





uint xdata ADC0OutVal=0;
void ProTime_10ms()
{ 
	CHAN = 1;
	ADC_Start(CHAN);
	adcbufCnt++;
	if(adcbufCnt>12)
		adcbufCnt =0;
	
	ADC0OutVal = 4000;
	DAC0Out(ADC0OutVal);

	//dis_int_numXX(0,0,0,ADC0OutVal);
	ADC0OutVal++;
	if(ADC0OutVal>4095)
		ADC0OutVal = 0;
}
void ProTime_100ms()
{
	uint i;
	byte ch;
	unsigned long Dat;

	for(ch=0;ch<8;ch++)
	{
		for(Dat=0,i=0;i<12;i++)
		{
			Dat += AdcBuff[ch][i];
		}
	
		Dat = Dat/12;
		//temp = TempCount(Dat);
		//Dat = temp;
	
		//Dat *= 244;//33
		//Dat /= 4096;
		//DAC0Out(Dat);
		//dis_int_numXX(ch/4*0x40,ch%4*2,0,(int)Dat);
	}
}
uint  xdata   bvuf[10240];
void ProTime_200ms()
{

	uint  i,Dat;
  
	for(i=0;i<10240;i++)
	{
		bvuf[i]=i;

		Dat = bvuf[i];

		if(Dat !=i)
		{
			Work = ~Work;
			K3   = OutBuf;
			dis_int_numXX(0,2,0,Dat) ;
		}
	}
}
void disb8(uchar y,uchar x,uchar z,bit cpls)
{
	uchar ch,com,dat,j;
	int hznum;
	hznum=z*0x8;
	com=x|0xb8;
    prl0(com);
    prr0(com);
    if(y<0x40)
	{
    	com=y|0x40;
    	prl0(com);
		for(j=0;j<8;j++)
		{
        	dat=CTAB[hznum];
			if(cpls)
				dat=~dat;
	    	prl1(dat);
			hznum++;
		}
	}
    else
	{
		ch=y-0x40;
    	com=ch|0x40;
	   	prr0(com);
		for(j=0;j<8;j++)
		{
    		dat=CTAB[hznum];
			if(cpls)
				dat=~dat;
	    	prr1(dat);
			hznum++;
		}
	}
}
void  Distime1()
{
	byte i;
//	if(time_buff[0]==DisTimeFlag)	return;
//	else							DisTimeFlag=time_buff[0];

	for(i=0;i<=9;i++)
	{
		disb8(0x30+i*8,7,str_time[i],0);
		dis_int_numXX(0,4,0,str_time[i]) ;
	}

	for(i=11;i<19;i++)
	{
		disb8(0x40+(i-11)*8,0,str_time[i],0);

		dis_int_numXX(0,2,0,str_time[i]) ;
	}
}
void ProTime_500ms()
{
	
	
	Work = ~Work;
	K3   = OutBuf;

	Uart1Send();

	GetTime();
	Distime1();
	disb8(0x30,7,5,0);
}

void m_pro(void)
{
	byte i;

	for(i=0;i<max_pro;i++)
	{
		if(!OP_TIME[i])
		{
			OP_TIME[i] = OP[i].time_val;
			OP[i].proc();	
		}
	}
}
void DelayMs(uint cnt)
{
	uint idata mmm;
  	while(cnt--)
  	{	
		for(mmm=0;mmm<860;mmm++)
		{;}
	}
}

byte GetKey()
{
	bit Bit;

	Bit = xXR1;
	Bit = xXR2;
	Bit = xXR3;
	Bit = xXR4;

	yYW1 = 0;
	yYW2 = 1;
	yYW3 = 1;
	yYW4 = 1;

	Bit = xXR1;
	if(Bit==0)
		return 1;
	Bit = xXR2;
	if(Bit==0)
		return 2;
	Bit = xXR3;
	if(Bit==0)
		return 3;
	Bit = xXR4;
	if(Bit==0)
		return 4;
	/******************/
	yYW1 = 1;
	yYW2 = 0;
	yYW3 = 1;
	yYW4 = 1;
	
	Bit = xXR1;
	if(Bit==0)
		return 5;
	Bit = xXR2;
	if(Bit==0)
		return 6;
	Bit = xXR3;
	if(Bit==0)
		return 7;
	Bit = xXR4;
	if(Bit==0)
		return 8;
	/******************/
	yYW1 = 1;
	yYW2 = 1;
	yYW3 = 0;
	yYW4 = 1;

	Bit = xXR1;
	if(Bit==0)
		return 9;
	Bit = xXR2;
	if(Bit==0)
		return 10;
	Bit = xXR3;
	if(Bit==0)
		return 11;
	Bit = xXR4;
	if(Bit==0)
		return 12;
	/******************/
	yYW1 = 1;
	yYW2 = 1;
	yYW3 = 1;
	yYW4 = 0;

	Bit = xXR1;
	if(Bit==0)
		return 13;
	Bit = xXR2;
	if(Bit==0)
		return 14;
	Bit = xXR3;
	if(Bit==0)
		return 15;
	Bit = xXR4;
	if(Bit==0)
		return 16;	
	
	return  0;
}
#define  SET_PIC   1
void SetPro()
{
//	byte i;

}
void OpenBJQ()
{
	BJQQ =  1;
	K3   =  OutBuf;
}
void CloseBJQ()
{
	BJQQ =  0;
	K3   =  OutBuf;
}

void PulaseGgatherInt() interrupt 1      //t0中断,置0.1ms标志,使用
{
	static uint WDOGCnt=0;
	byte i;

	SELECT_P62256
	TF0 	= 	0;
	TR0 	= 	0;
	TL0 	= 	0x66;//0x8F;
	TH0 	= 	0xfc;//0xFE;             //置T0初值,(0xFFFF-TH0TL0+1)*12/22.1184MHz=0.2ms
	TR0 	= 	1;
	//WDOG 
	WDI	= ~WDI;
	P4  = PP4;
	WDOGCnt++;
	if(WDOGCnt>9000)
	{
		OpenBJQ();
		yYW1 = 1;
	yYW2 = 1;
	yYW3 = 1;
	yYW4 = 1;
	xXR1=1;
	xXR2=1;
	xXR3=1;
	xXR4=1;
	}
	else
	{
		CloseBJQ();
		yYW1 = 0;
	yYW2 = 0;
	yYW3 = 0;
	yYW4 = 0;

	xXR1=0;
	xXR2=0;
	xXR3=0;
	xXR4=0;
	}
	if(WDOGCnt>10000)
	{
		WDOGCnt = 0;
	}
	
	for(i=0;i<max_pro;i++)
	{
		if(OP_TIME[i])
			OP_TIME[i]--;
	}	
}
void AxlesGatherInt() interrupt 3      		//t1中断,禁止
{       
}

/******************************************************************/

/******************************************************************/

void main(void)
{
	byte key,i,j;
	
	OscInit();
	SELECT_P62256
	CpuIinit();
	KeyIni();
	InitPro();		  
	IniLcd();
	SPI0_Init();
	clearlcd();
	Init8123();

	DAC0Init();
	ADCInit();
	SMBus_Init();
	Clock(TIME_INIT,0,0);

	for(i=0;i<4;i++)
	{
		for(j=0;j<8;j++)
			dishzXX(0x10*j,i*2,4*i+j,0);
	}
	clearlcd();
	
	for(i=0;i<max_pro;i++)
		OP_TIME[i]=OP[i].time_val;

	SPI_WP		=	1;
	SPI_HOLD	=	1;
	initSpi();
	while(1)
	{
/*
		CS25 = 0;
		SPIF = 0;
		hh=1;
   		SPI0DAT = 0x01;
		Timer0_us (100);
		hh=1; 
		SPI0DAT = 0x0; 
		Timer0_us (100); 
		   
		CS25 = 1;

		Timer0_us (100); 
		CS25 = 0;
		SPIF = 0;
   		SPI0DAT = 0x05;
		Timer0_us (10000);  
		CS25 = 1;
*/

//		SPI_TEST_PRO();

		
		
		key = GetKey();
		switch(key)
		{
		case SET_PIC:
			SetPro();
			//SPI_TEST_PRO();
			break;
		default:
			;
		}
		m_pro();
	}
}






⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -