iic_slave.c

来自「8051单片机的LCDTV用户界面程序」· C语言 代码 · 共 164 行

C
164
字号
#include "mxREG52.H"
#include "i2cm.h"

sbit	data_ready = P2^7;
extern unsigned char power_down_status;
extern unsigned char volumn_left_status ;
extern unsigned char volumn_right_status;
extern unsigned char program_left_status;
extern unsigned char program_right_status;
extern unsigned char menu_status;
extern unsigned char source_in_status;
extern unsigned char Power_status;

unsigned char Power_off_1;
unsigned char PWM_status;
bit	PWM_flag;
unsigned char num = 0x00;
unsigned char idata DATA[2]={0x32};
unsigned char command;
extern unsigned char data keydata;
unsigned char keypad_received;
unsigned char	RTC_receied;
unsigned char data RTCDATA[4];
unsigned char trans_done;
unsigned char idata Slave_Adr;
unsigned char idata FReceive_Done;
unsigned char idata FTransmitted_Done;
extern unsigned char action_ready_to_handle;
extern unsigned char Power_off;

//------------------------------------------------------
//i2c interrupt service routine
//------------------------------------------------------

void i2c_isr(void) interrupt 5
{
    switch(S1STA)
	{
		case Bus_error:
        	transreg(Bus_error);
	    	break;

		//=====SLAVE RECEIVE mode===================
		case SR_SLAW_ACK:			//0x60
//		transreg(SR_SLAW_ACK);	
		num = 0;
		S1CON=RELEASE_BUS_ACK;
		break;

		case SR_DATA_ACK:			//0x80
//		transreg(SR_DATA_ACK);
		if(Power_off_1 == 0x01)
			{
			if(S1DAT == 0xF1)
				{
				Power_off = 0x01;
				}
				Power_off_1 = 0x00;
			}
		else
		{
		if(PWM_flag == 0)
			{
			if(S1DAT == 0x32)
				{
				keypad_received = 1;
				}
			else
				if(S1DAT == 0xF0)
					{
					Power_off_1 = 0x01;
					}
				else
					if(S1DAT == 0x37)
						{
						P2 = 0x55;
						PWM_flag = 1;
						}
			}
		else
			{
			PWM_status = S1DAT;
			P2 = 0x57;
			}
		}
		num++;
		S1CON=RELEASE_BUS_ACK;
		break;

		case SR_STOP_ACK:			//0xA0	receive has done
//		transreg(SR_STOP_ACK);
		S1CON=RELEASE_BUS_ACK;
		FReceive_Done = 1;
		break;
		//==========================================
		//=====SLAVE TRANSMITTER mode===============
		case ST_SLAR_ACK:			//0xA8
//		transreg(ST_SLAR_ACK);
		if(keypad_received)
			{S1DAT = 0x32;
//			transreg(S1DAT);
			}
		S1CON=RELEASE_BUS_ACK;
		break;

		case ST_DATA_ACK:			//0xB8
//		transreg(ST_DATA_ACK);
		if(power_down_status==0x01)
			{
			S1DAT = 0x51;
//			transreg(S1DAT);
			power_down_status = 0x00;
			}
		if(menu_status == 0x01)
			{
			S1DAT = 0X55;
//			transreg(S1DAT);
			menu_status = 0x00;
			}
		if(source_in_status == 0x01)
			{
			S1DAT = 0X56;
//			transreg(S1DAT);
			source_in_status = 0x00;
			}
		if(volumn_left_status == 0x01)
			{
			S1DAT = 0x57;
//			transreg(S1DAT);
			volumn_left_status = 0x00;
			}
		if(volumn_right_status == 0x01)
			{
			S1DAT = 0x58;
//			transreg(S1DAT);
			volumn_right_status = 0x00;
			}
		if(program_left_status == 0x01)
			{
			S1DAT = 0X59;
//			transreg(S1DAT);
			program_left_status = 0x00;
			}
		if(program_right_status == 0x01)
			{
			S1DAT = 0X54;
//			transreg(S1DAT);
			program_right_status = 0x00;
			}
		S1CON = RELEASE_BUS_ACK;
		break;

		case ST_STOP_NONACK	:		//0xC0
//		transreg(ST_STOP_NONACK);
		S1CON=RELEASE_BUS_ACK;
		FTransmitted_Done =1;
		data_ready = 0x01;
		break;
	

		//==========================================
	}
}

⌨️ 快捷键说明

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