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

📄 i2c.c

📁 C51控制24CO2及24C04
💻 C
字号:
/**********************************************************************
		公司名:		广州强智数码科技有限公司
		文件名:		FM100.c
		设计者:		王健强
		开始日:		2005-12-20 12:19
		完成日:		2006-2-7 11:49
----------------------------------------------------------------------
		MCU                       	stc89c51
		Crycle                    	12MHz
		Audio input selector		PT2314	;	FM	PC	MP
		2CH Audio Processor       	PT2314	;	Volume & Tone & Loud
		LCD Drive 					HT1621	;
		A/D 						LM324	;
		Template					DS18B20	;
		Remote transmit         	HT2222
**********************************************************************/

	#define		X0_Seq			0
	#define		T0_Seq			1
	#define		X1_Seq			2
	#define		T1_Seq			3
	#define		T2_Seq			5

	#include	< reg51.h >
	#include	< intrins.h>
	#include	"b.h"

/*************************************************************
           		Data Define
*************************************************************/
	#define		uchar	unsigned char
	#define		uint	unsigned int
	#define		BYTE	unsigned	char
	#define		WORD	unsigned	int

	#define		nop		_nop_()
	#define		True			1
	#define		False			0
	#define		High			1
	#define		Low				0
	#define		ON				1
	#define		OFF				0

	#define		Lcd_On		0x8060
	#define		Lcd_Off		0x8040
	#define		Sys_En		0x8020
	#define		Bais_4		0x8520

	#define		F_Lcd_X1	0
	#define		F_Lcd_X2	1
	#define		F_Lcd_Bal	2
	#define		F_Lcd_FAD	3
	#define		F_Lcd_A		4
	#define		F_Lcd_MP	5
	#define		F_Lcd_X		6
	#define		F_Lcd_AM	7
	#define		F_Lcd_FM	8
	#define		F_Lcd_P1	9
	#define		F_Lcd_T		10
	#define		F_Lcd_X3	11
	#define		F_Lcd_X4	12
	#define		F_Lcd_MHZ	13
	#define		F_Lcd_KHZ	14
	#define		F_Lcd_AUX	15
	#define		F_Lcd_COL	16
	#define		F_Lcd_PC	17

	#define		LCD_0		0
	#define		LCD_1		1
	#define		LCD_2		2
	#define		LCD_3		3
	#define		LCD_4		4
	#define		LCD_5		5
	#define		LCD_6		6
	#define		LCD_7		7
	#define		LCD_8		8
	#define		LCD_9		9
	#define		LCD_A		10
	#define		LCD_B		11
	#define		LCD_C		12
	#define		LCD_d		13
	#define		LCD_E		14
	#define		LCD_F		15

	#define		LCD_Space	16
	#define		LCD_V		17
	#define		LCD_n		18
	#define		LCD_o		19
	#define		LCD_T		20
	#define		LCD_M		21
	#define		LCD_P		22
	#define		LCD_L		23
	#define		LCD_c		24

	#define		Dot_A		25
	#define		Dot_B		26
	#define		Dot_C		27
	#define		Dot_D		28
	#define		Dot_E		29
	#define		Dot_F		30
	#define		Dot_G		31

	#define		No_Key			0
	#define		Key_In			0x0c
	#define		Key_Mute		0x0a
	#define		Key_Ch_Dn		0x09
	#define		Key_Ch_Up		0x11
	#define		Key_Vol_Dn		0x12
	#define		Key_Vol_Up		0x14

/*************************************************************
			P0
*************************************************************/
	sbit	P_DO72130		=	P0^0;
	sbit	P_CLK72130		=	P0^1;
	sbit	P_DI72130		=	P0^2;
	sbit	P_CE72130		=	P0^3;
	sbit	P_SDA			=	P0^4;
	sbit	P_SCK			=	P0^5;
	sbit	P_AD_Ctrl		=	P0^6;
	sbit	P_LoudLed		=	P0^7;

/*************************************************************
			P2
*************************************************************/
	sbit	P_RedLed		=	P2^7;
	sbit	P_GreenLed		=	P2^6;
	sbit	P_BlueLed		=	P2^5;

/*************************************************************
			P1
*************************************************************/
	sbit	P_18B20			=	P1^4;

/*************************************************************
			P3
*************************************************************/
	sbit	P_ADIn			=	P3^2;
	sbit	P_Remote		=	P3^3;
	sbit	P_Cs1621		=	P3^4;
	sbit	P_Clk1621		=	P3^5;
	sbit	P_Dat1621		=	P3^6;
	sbit	P_Buzz			=	P3^7;

/*************************************************************
		bdata max16 bytes ( 20h-3fh )
*************************************************************/
	bit		F_Key_In       		;	//	Key flag
	bit		F_RemAdr			;
/*************************************************************
		data max24+80=104 bytes ( 08h-1fh & 30h-7fh )
*************************************************************/
	uchar	data	Disp_Buf0[8];
	uchar	data	Disp_Char_Buf[4];
	BYTE	Rem_Buf[4]			;
	uchar	data	Key_Tmp		;
	uchar	data	Key_Code	;


	/******************************************
		; Delay
	******************************************/
	void	Delay_10us(void)
	{
			nop	;
			nop	;
			nop	;
			nop	;
			nop	;
			nop	;
	}

	//-----------------------------------------
	void	Delay_100us(uchar count)
	{
		uchar	i=0	;
		uchar	j=0	;
		for	(i=0;i<count;i++)
		{
			for	(j=0;j<10;j++)
			{
				nop	;
				nop	;
				nop	;
				nop	;
				nop	;
				nop	;
			}
		}
	}

	//-----------------------------------------
	void	Delay_ms(uchar count)
	{
		uchar	i=0	;
		uchar	j=0	;
		for	(i=0;i<count;i++)
		{
			for	(j=0;j<78;j++)
			{
				Delay_10us()	;
			}
		}
	}

	uchar	code	Char_Word_Tab[]=
	{
	/*BAegf_xxxx,Bdcba_xxXx,*/
	  B0101_0000,B1111_0000,//0		LCD_0		0
	  B0000_0000,B0110_0000,//1     LCD_1		1
	  B0110_0000,B1011_0000,//2     LCD_2		2
	  B0010_0000,B1111_0000,//3     LCD_3		3
	  B0011_0000,B0110_0000,//4     LCD_4		4
	  B0011_0000,B1101_0000,//5     LCD_5		5
	  B0111_0000,B1101_0000,//6     LCD_6		6
	  B0000_0000,B0111_0000,//7     LCD_7		7
	  B0111_0000,B1111_0000,//8     LCD_8		8
	  B0011_0000,B1111_0000,//9     LCD_9		9
	  B0111_0000,B0111_0000,//A     LCD_A		10
	  B0010_0000,B1111_0010,//B     LCD_B		11
	  B0101_0000,B1001_0000,//C     LCD_C		12
	  B0110_0000,B1110_0000,//D     LCD_D		13
	  B0111_0000,B1001_0000,//E     LCD_E		14
	  B0111_0000,B0001_0000,//F     LCD_F		15
	/*BAegf_xxxx,Bdcba_xxXx,*/
	  B0000_0000,B0000_0000,//space LCD_Space	16
	  B0101_0000,B1110_0000,//U/V   LCD_V		17
	  B0101_0000,B0111_0000,//-     LCD_n		18
	  B0110_0000,B1100_0000,//o     LCD_o		19
	  B0000_0000,B0001_0010,//T     LCD_T		20
	  B0101_0000,B0111_0010,//M     LCD_M		21
	  B0111_0000,B0011_0000,//P     LCD_P		22
	  B0101_0000,B1000_0000,//L     LCD_L		23
	  B0110_0000,B1000_0000,//c     LCD_c		24
	/*BAegf_xxxx,Bdcba_xxXx,*/
	  B0000_0000,B0001_0000,//-     Dot_A		25
	  B0000_0000,B0010_0000,//-     Dot_B		26
	  B0000_0000,B0100_0000,//-     Dot_C		27
	  B0000_0000,B1000_0000,//-     Dot_D		28
	  B0100_0000,B0000_0000,//-     Dot_E		29
	  B0001_0000,B0000_0000,//-     Dot_F		30
	  B0010_0000,B0000_0000,//-     Dot_G		31
	};

	uchar	code	Char_Byte_Tab[]=
	{
	  /*Bdcba_xegf*/
	    B1111_0101,//0		LCD_0		0
	    B0110_0000,//1      LCD_1		1
	    B1011_0110,//2      LCD_2		2
	    B1111_0010,//3      LCD_3		3
	    B0110_0011,//4      LCD_4		4
	    B1101_0011,//5      LCD_5		5
	    B1101_0111,//6      LCD_6		6
	    B0111_0000,//7      LCD_7		7
	    B1111_0111,//8      LCD_8		8
	    B1111_0011,//9      LCD_9		9
	    B0111_0111,//A      LCD_A		10
	    B1100_0111,//b      LCD_B		11
	    B1001_0101,//C      LCD_C		12
	    B1110_0110,//d      LCD_d		13
	    B1001_0111,//e      LCD_E		14
	    B0001_0111,//f      LCD_F		15
	  /*Bdcba_xegf*/
	    B0000_0000,//space  LCD_Space	16
	    B1110_0101,//U/V    LCD_V		17
	    B0111_0101,//-      LCD_n		18
	    B1100_0110,//b      LCD_b		19
	    B0000_0010,//-      LCD_T		20
	    B0000_0010,//-      LCD_M		21
		B0011_0111,//P      LCD_P		22
		B1000_0101,//u      LCD_L		23
	    B1000_0110,//c      LCD_c		24
	  /*Bdcba_xegf*/
	    B0001_0000,//-      Dot_A		25
	    B0010_0000,//-      Dot_B		26
	    B0100_0000,//-      Dot_C		27
	    B1000_0000,//-      Dot_D		28
	    B0000_0100,//-      Dot_E		29
	    B0000_0001,//-      Dot_F		30
	    B0000_0010,//-      Dot_G		31
	};

	uchar	code	Lcd_Flag_Tab[][2]=
	{//	Buf(n),dot
		0,	B0000_0001,	//	LCD_Flag_X1		0
		0,	B0000_0010,	//	LCD_Flag_X2		1
		0,	B0000_0100,	//	LCD_Flag_Bal	2
		0,	B0000_1000,	//	LCD_Flag_FAD	3
		0,	B1000_0000,	//	LCD_Flag_A		4
		1,	B0000_0001,	//	LCD_Flag_MP		5
		1,	B0000_0010,	//	LCD_Flag_X		6
		1,	B0000_0100,	//	LCD_Flag_AM		7
		1,	B0000_1000,	//	LCD_Flag_FM		8
		3,	B0000_1000,	//	LCD_Flag_P1		9
		4,	B0000_1000,	//	LCD_Flag_T		10
		5,	B0000_0001,	//	LCD_Flag_X3		11
		5,	B0000_0010,	//	LCD_Flag_X4		12
		5,	B0000_0100,	//	LCD_Flag_MHZ	13
		5,	B0000_1000,	//	LCD_Flag_KHZ	14
		6,	B0001_0000,	//	LCD_Flag_AUX	15
		6,	B0010_0000,	//	LCD_Flag_COL	16
		6,	B0100_0000,	//	LCD_Flag_PC		17
	};

	/************************************************
			Ht1621驱动程序(24C128/PTC2323/Pt2314)
	************************************************/
	void	Lcd_Command( uint	Command )
	{
		uchar	i;

		P_Cs1621 = Low	;
		for	( i=0; i<12; i++ )
		{
			P_Clk1621 = Low	;
			if	(Command&0x8000)
			{
				P_Dat1621 = High	;
			}
			else
			{
				P_Dat1621 = Low	;
			}
			P_Clk1621 = High	;
			Command		<<=	1;
		}
		P_Cs1621 = High	;
	}

	/************************************************/
	void	Lcd_Write_Head(void)
	{
		P_Dat1621 = High	;
		nop	;
		P_Clk1621 = Low		;
		nop	;
		P_Clk1621 = High	;
		nop	;
		P_Dat1621 = Low		;
		nop	;
		P_Clk1621 = Low		;
		nop	;
		P_Clk1621 = High	;
		nop	;
		P_Dat1621 = High	;
		nop	;
		P_Clk1621 = Low		;
		nop	;
		P_Clk1621 = High	;
	}

	/************************************************/
	void	WriteHt1621( uchar	Addr_Tmp,uchar Data_Tmp )
	{
		uchar	i	;
		P_Cs1621 = Low	;
		Lcd_Write_Head()	;
		for (i=0;i<6;i++)
		{	//	set offset address
		    P_Clk1621 = Low	;
		    if (Addr_Tmp&0x20)
		    {
		    	P_Dat1621 = High	;
		    }
		    else
		    {
		    	P_Dat1621 = Low;
		    }
		    P_Clk1621 = High;
		    Addr_Tmp	<<= 1	;
		}

		for (i=0;i<8;i++)
		{	//	data output
		    P_Clk1621 = Low	;
		    if ( Data_Tmp&0x01 )
		    {
		    	P_Dat1621 = High	;
		    }
		    else
		    {
		    	P_Dat1621 = Low	;
		    }
		    P_Clk1621 = High	;
		    Data_Tmp	>>= 1	;
		}
		P_Cs1621 = High	;
	}

	/************************************************/
	void	Update_Disp( void )
	{
		uchar	i;
		for	( i=0;i<8;i++ )
		{
			WriteHt1621( (15+i*2),Disp_Buf0[i] );
			Disp_Buf0[i] = 0	;
		}
	}

	/************************************************/
	void	Lcd_Initial( void)
	{
		Lcd_Command( Lcd_On )	;
		Lcd_Command( Sys_En )	;
		Lcd_Command( Bais_4 )	;
		Update_Disp()			;
	}

	/************************************************/
	void	Make_Flag_Data( uchar LCD_Flag )
	{
		Disp_Buf0[ Lcd_Flag_Tab[(LCD_Flag)][0] ]	|=	Lcd_Flag_Tab[(LCD_Flag)][1]	;
	}

	/************************************************/
	void	Make_Char_Data( void )
	{
		uchar	i,Tmp;
		for	( i = 0; i < 4; i++ )
		{
			Tmp	=	Disp_Char_Buf[i];
			if	( i )
			{
				Disp_Buf0[i+1]	=	Char_Byte_Tab[Tmp]	;
			}
			else
			{
				Tmp	<<=	1;
				Disp_Buf0[0]	=	Char_Word_Tab[Tmp]	;
				Disp_Buf0[1]	=	Char_Word_Tab[Tmp+1];
			}
		}
	}

	/************************************************/
	void	send_one_byte( uchar send_data )
	{
		TI	=False;
		SBUF	=	send_data;
		while( TI==0 );
		TI	=False;
	}

	/*************************************
				9600bps
	**************************************/
	void	Uart_Initial( void )
	{
		TMOD	=	0x22;	//	定时器工作方式2
		SCON	=	0x50;	//	串口工作方式1
		TL1		=	243	;	//	波特率=(1/32)*(12M*/12)*(1/(256-TL)==> TL=256-(1M/(波特率*32))
		TH1		=	243	;	//	波特率=2400bps
		TR1		=	1	;	//	启动定时器记数
		EA		=	1	;	//	允许中断
	}

	/************************************************/
	void	CharDisplay( void )
	{
		if	(F_Key_In)
		{
			P_Buzz	=	Low	;
			Delay_ms(100)	;
			P_Buzz	=	High;

			F_Key_In	= OFF	;
			switch(Key_Code)
			{
				case	Key_In:
						Disp_Char_Buf[0]	=	Rem_Buf[0]/16	;
						Disp_Char_Buf[1]	=	Rem_Buf[0]&0x0f	;
						Disp_Char_Buf[2]	=	Rem_Buf[1]/16	;
						Disp_Char_Buf[3]	=	Rem_Buf[1]&0x0f	;
						send_one_byte(Rem_Buf[0])	;
						send_one_byte(Rem_Buf[1])	;
				break	;
				default:
						Disp_Char_Buf[0]	=	Rem_Buf[2]/16	;
						Disp_Char_Buf[1]	=	Rem_Buf[2]&0x0f	;
						Disp_Char_Buf[2]	=	Rem_Buf[3]/16	;
						Disp_Char_Buf[3]	=	Rem_Buf[3]&0x0f	;
						send_one_byte(Rem_Buf[2])	;
						send_one_byte(Rem_Buf[3])	;
				break	;
			}
		}
		Make_Char_Data();
	}

	/************************************************
			I2C驱动程序(24Cxx/Pt2314...)
	************************************************/
	void	Start_I2C(void)
	{	//	启动条件是P_SCK为高电平,P_SDA下降触发
    	P_SCK	=	False	;
	  	Delay_10us()		;
		P_SDA	=	True	;
		Delay_10us()		;
		P_SCK	=	True	;
		Delay_10us()		;
		P_SDA	=	False	;	//	下降触发
		Delay_10us()		;
   		P_SCK	=	False	;
	}

	//-----------------------------------------
	void	Stop_I2C(void)
	{	//	停止条件是P_SCK为高电平,P_SDA上升触发
    	P_SCK	=	False	;
		Delay_10us()		;
		P_SDA	=	False	;
		Delay_10us()		;
    	P_SCK	=	True	;
		Delay_10us()		;
		P_SDA	=	True	;	//	上升触发
		Delay_10us()		;
    	P_SCK	=	False	;
	}

	//-----------------------------------------
	void	WByte_I2C(uchar value)
	{
		uchar	i	;
		for	(i=0;i!=8;i++)
		{
			if	( value&0x80 )
			{
				P_SDA	= True	;
			}
			else
			{
				P_SDA	= False	;
			}
			value	<<=1		;
			Delay_10us()		;
    		P_SCK	=	True	;
			Delay_10us()		;
    		P_SCK	=	False	;
			Delay_10us()		;
		}
		P_SDA	= True			;	//	读数据之前,预置P_SDA
   		P_SCK	=	True		;
		do
		{
			i++	;
		}	while(P_SDA&&i!=255)	;
   		P_SCK	=	False			;
	}

//-----------------------------------------
	BYTE	I2C_RByte(bit Byte_F)
	{
		BYTE	i		;
		BYTE	value=0	;

		P_SDA	= HIGH			;	//	读数据之前,预置P_SDA
		for	(i=0;i!=8;i++)
		{
    		P_SCK	=	HIGH	;
			Delay_10us()			;
			value	<<=1			;
			if	(P_SDA)
			{
				value ++			;
			}
    		P_SCK	=	LOW		;
			Delay_10us()			;
		}
		P_SDA	= 	Byte_F		;
		Delay_10us()				;
   		P_SCK	=	HIGH		;
		Delay_10us()				;
   		P_SCK	=	LOW			;
   		return	value				;
	}

	/*--------------------------------------
				24C驱动程序
	--------------------------------------*/
	void	Write_24C02_Byte(BYTE * Eep_Buf )
	{
		Delay_MS(10)			;
		Start_I2C()				;
		WByte_I2C(0xA0)			;	//	IC_ADDR & write command
		WByte_I2C(Eep_Buf)		;
		WByte_I2C(*Eep_Buf)		;
		Stop_I2C()				;
	}

	//-----------------------------------------
	void	Wrt_24C02_Page(BYTE * Eep_Buf )
	{
		BYTE	i				;
		Delay_MS(10)			;
		Start_I2C()				;
		WByte_I2C(0xA0)			;	//	IC_ADDR & write command
		WByte_I2C(Eep_Buf)		;
		for	(i=0;i!=8;i++)
		{
			WByte_I2C(*Eep_Buf)	;
			Eep_Buf++			;
		}
		Stop_I2C()				;
	}


	//-----------------------------------------
	void	Read_24C02_Byte(BYTE * Eep_Buf)
	{
		Start_I2C()				;
		WByte_I2C(0xA0)			;	//	IC_ADDR & write command
		WByte_I2C(Eep_Buf)		;
		Start_I2C()				;
		WByte_I2C(0xA1)			;	//	IC_ADDR & read command
		* Eep_Buf=I2C_RByte(1)	;	//	read command over
		Stop_I2C()				;
	}

⌨️ 快捷键说明

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