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

📄 t10a2_main.c

📁 AVR单片机基础程序实例! 十个程序源代码。
💻 C
📖 第 1 页 / 共 5 页
字号:
{
	PORTD|=BIT(0);   // i2c SCL on ATmega128,64
	PORTD|=BIT(1);   // i2c SDA on ATmega128,64
	TWCR|=1<<TWEN;// I2C总线使能
	TWCR|=1<<TWIE;
	TWCR|=1<<TWEA;
	TWCR= 0x00; //disable twi
	TWBR= 0x20; //set bit rate
	TWSR= 0x00; //set prescale
	TWAR= 0xB0; //set slave address 要更改
	TWCR= 0x45; //enable twi
}
void i2cReceiveByte(unsigned char ackFlag)
{
	//开始通过 i2c 接收
	if( ackFlag )
	{
		// ackFlag = TRUE: 数据接收后回应ACK
		TWCR=TWCR&TWCR_CMD_MASK|(1<<TWINT)|(1<<TWEA);
	}
	else
	{
		// ackFlag = FALSE: 数据接收后无回应
		TWCR=TWCR&TWCR_CMD_MASK|(1<<TWINT);
	}
}
#pragma vector= TWI_vect//:34
__interrupt void twi_isr(void)
{
	unsigned char status;
	//SEI();
	status = TWSR & 0xf8;
	switch(status)
	{
		// 从接收状态码
		case TW_SR_SLA_ACK:              // 0x60: 自己的SLA+W 已经被接收,ACK 已返回
		case TW_SR_ARB_LOST_SLA_ACK:     // 0x68: SLA+R/W 作为主机的仲裁失败;自己的SLA+W 已经被接收,ACK 已返回
		case TW_SR_GCALL_ACK:            // 0x70: 接收到广播地址,ACK 已返回
		case TW_SR_ARB_LOST_GCALL_ACK:   // 0x78: SLA+R/W 作为主机的仲裁失败;接收到广播地址,ACK 已返回
		line=0;
		TWCR=TWCR&TWCR_CMD_MASK|(1<<TWINT)|(1<<TWEA);
		break;
		case TW_SR_DATA_ACK:            // 0x80: 以前以自己的 SLA+W 被寻址;数据已经被接收,ACK 已返回
		case TW_SR_GCALL_DATA_ACK:   // 0x90: 以前以广播方式被寻址;数据已经被接收,ACK 已返回
		receive_data[line]=TWDR;/*保存数据*/
		line++;
		TWCR=TWCR&TWCR_CMD_MASK|(1<<TWINT)|(1<<TWEA);

		break;
		case TW_SR_DATA_NACK:            // 0x88: 以前以自己的 SLA+W 被寻址;数据已经被接收,NOT ACK 已返回
		case TW_SR_GCALL_DATA_NACK:   // 0x98: 以前以广播方式被寻址;数据已经被接收,NOT ACK 已返回
		// 接收数据,回应 NACK
		i2cReceiveByte(FALSE);
		break;
		case TW_SR_STOP:               // 0xA0: 在以从机工作时接收到STOP或重复START
		TWCR=TWCR&TWCR_CMD_MASK|(1<<TWINT)|(1<<TWEA);
		// i2c 接收完成
		//if(i2cSlaveReceive)
		//   i2cSlaveReceive(I2cReceiveDataIndex, I2cReceiveData);
		// 设置状态
		//I2cState = I2C_IDLE;
		bdata3_flag|=BIT(TWI_RECEIVED_F);
		if(receive_data[0]==0)
		{
			if(receive_data[1]==0x01)
			{
				cd_input_f|=BIT(USB_INSERT_F);
				//USB接入
				state_counter=6;
				VFD_Variable = 0;
				Display_Proc(USB_CARD_Connect_DisMode);
			}
			else	
			{
				cd_input_f|=BIT(CARD_INSERT_F);
				receive_data_card4=receive_data[1];
				//CARD接入
				state_counter=6;
				VFD_Variable = 2;
				Display_Proc(USB_CARD_Connect_DisMode);
			}
		}
		else if(receive_data[0]==1)
		{
			if(receive_data[1]==0x01)
			{
				cd_input_f&=~BIT(USB_INSERT_F);
				//USB拔出
				state_counter=6;
				VFD_Variable = 1;
				Display_Proc(USB_CARD_Connect_DisMode);
			}
			else
			{
				cd_input_f&=~BIT(CARD_INSERT_F);
				receive_data_card4=receive_data[1];
				//CARD拔出
				state_counter=6;
				VFD_Variable = 3;
				Display_Proc(USB_CARD_Connect_DisMode);
			}
		}
		else if(receive_data[0]==0x20)
		{
			bdata4_flag|=BIT(NUMBER_SINGLE_F);
			bdata3_flag&=~BIT(DIGITAL_SIGNAL_ON);
		}
		else if((receive_data[0]&0xf0)==0x30)
		{
			bdata4_flag|=BIT(NUMBER_SINGLE_F);
			bdata3_flag|=BIT(DIGITAL_SIGNAL_ON);
			receive_number_single[0]=receive_data[0];
			receive_number_single[1]=receive_data[1];
		}
		else if((receive_data[0]&0xf0)==0x80)
		{
			bdata4_flag|=BIT(RECEIVE_8X_DATA_F);
			receive_data_8x[0]=receive_data[0];
			receive_data_8x[1]=receive_data[1];
		}
		else	asm("nop");
		break;
		// 从发?
		case TW_ST_SLA_ACK:               // 0xA8: 自己的SLA+R 已经被接收,ACK 已返回
		case TW_ST_ARB_LOST_SLA_ACK:// 0xB0: SLA+R/W 作为主机的仲裁失败;自己的SLA+R 已经被接收,ACK 已返回

		TWDR=osd_byte[0];
		TWCR=TWCR&TWCR_CMD_MASK|(1<<TWINT)|(1<<TWEA);
		break;
		case TW_ST_DATA_ACK:            // 0xB8: TWDR 里数据已经发送,接收到ACK
		TWDR=osd_byte[1];
		TWCR=TWCR&TWCR_CMD_MASK|(1<<TWINT);
		PORTC&=~BIT(TWI_TRANS_F);//附加,数据传送完成,标志位置1

		break;
		case TW_ST_DATA_NACK:            // 0xC0: TWDR 里数据已经发送接收到NOT ACK
		case TW_ST_LAST_DATA:            // 0xC8: TWDR 的一字节数据已经发送(TWAE = “0”);接收到ACK
		// 全部完成
		// 从方式开放
		TWCR=TWCR&TWCR_CMD_MASK|(1<<TWINT)|(1<<TWEA);
		// 设置状态
		//I2cState = I2C_IDLE;
		break;
		case TW_NO_INFO:                 // 0xF8: 没有相关的状态信息;TWINT = “0”
		// 无操作
		break;
		case TW_BUS_ERROR:                   // 0x00: 由于非法的START 或STOP 引起的总线错误
		TWCR=TWCR&TWCR_CMD_MASK|(1<<TWINT)|(1<<TWSTO)|(1<<TWEA);// 设置状态
		//I2cState = I2C_IDLE;
		break;
		default:
		break;
	}
}
void init_devices(void)
{
	//stop errant interrupts until set up
	CLI(); //disable all interrupts
	XDIV  = 0x00; //xtal divider
	XMCRA = 0x00; //external memory
	port_init();
	//watchdog_init();
	timer0_init();
	timer1_init();
	timer2_init();//新加
	timer3_init();
	twi_init();
	adc_init();  //AD初始化
	MCUCR = 0x00;
	EICRA = 0x00; //extended ext ints
	EICRB = 0x02; //extended ext ints
	EIMSK = 0x10;
	TIMSK = 0x00; //timer interrupt sources
	ETIMSK = 0x04; //extended timer interrupt sources
	//SEI(); //re-enable interrupts
	//all peripherals are now initialized	
}
void auto_search_channel_theatre(void)
{
	if(vol_down_time!=0)return;	//为0时才切换通道.

	if((bdata4_flag&BIT(AUTO_SEARCH_F))&&(!(bdata0_flag&BIT(INPUT_FLAG))))//自动搜之前
	{	
		//if(	Detect_Signal_Timer > 150)
		//{	
			switch(input_select)//
			{
				case 0:
				case 1:
				case 4:
				if(!(PING&BIT(SPDIF_DET)))single_counter++;
				break;
				case 2:
				case 3:
				case 5:
				case 6:
				if(!(PINC&BIT(CHECK_SINGLE)))single_counter++;
				break;

				default:
				single_counter=0;
				break;
			}
			switch(theatre_mode)
			{
				case 0:
				counter1_10ms++;
				if((input_select != 4 && (counter1_10ms<50))||(input_select ==4 && (counter1_10ms<50)))
				{
					if((input_select != 4 && (single_counter>35))||(input_select == 4 && (single_counter>35)))
					//if(single_counter>360)//自动搜之后,没有启动解码板
					{bdata4_flag&=~BIT(AUTO_SEARCH_F);
						tv_input_select=input_select;
						single_counter=0;
						state_reg=0x01;
						display_init();
						if(touch_flag&BIT(fai_autosearch_tv))
						{
					   	touch_flag&=~BIT(fai_autosearch_tv);
						}
	//					write_data_display(0,13,allinput_select_disp[input_select]);
						
						//王明文添加
						VFD_Variable = input_select;
						Display_Proc(Detect_Source_DisMode);	
					}
				}
				else
				{
					counter1_10ms=0;
					single_counter=0;
					input_select_autojia();
					//if((input_select>6)||(input_select<4))input_select=4;
					if((input_select>6)||(input_select<4))//2007/5/17
							{
								if(touch_flag&BIT(fai_autosearch_tv))
									{
				 				  	touch_flag&=~BIT(fai_autosearch_tv);
									}
								if(tv_input_f&BIT(TV_COAXIAL_ON))
								input_select=4;
								else if(tv_input_f&BIT(TV_5CH1_ON))
								input_select=5;
								else
								input_select=6;
							}
					input_select_disposal();
				}
				break;
				case 1:
				counter1_10ms++;
				if(((input_select == 2 || input_select == 3) && (counter1_10ms<50))||((input_select == 0 || input_select == 1) && (counter1_10ms<50)))
				{
					if(((input_select == 2 || input_select == 3) && (single_counter>35))||((input_select == 0 || input_select == 1) && (single_counter>35)))
					{bdata4_flag&=~BIT(AUTO_SEARCH_F);
						ht_input_select=input_select;
						single_counter=0;
						state_reg=0x02;
						display_init();
						if(bdata7_flag&BIT(ai_autosearch))
						{
							bdata7_flag&=~BIT(ai_autosearch);
						}	
	//					write_data_display(0,13,allinput_select_disp[input_select]);
						//王明文添加
						VFD_Variable = input_select;
						Display_Proc(Source_DisMode);	
					}
				}
				else
				{
					counter1_10ms=0;
					single_counter=0;
					input_select_autojia();
					if(input_select>3)
					{
						if(bdata7_flag&BIT(ai_autosearch))
						{
							bdata7_flag&=~BIT(ai_autosearch);
							touch_flag|=BIT(fai_autosearch_tv);
						}
						input_select=0;
					}
					input_select_disposal();
				}
				break;
				default:break;
			}	
		//}				
		//else
		//{
		//	Detect_Signal_Timer++;
		//}
	}
}

ai_autosearch_tv()
{
	output_state_tv=ram_cd[9];
	if(theatre_mode==1)
	{
		output_state_tv=output_state_ht;		
		Detect_Signal_Timer = 0;
	}
	theatre_mode=0;
	state_reg=0x32;//新加
	//input_select=4;
	if(tv_input_f&BIT(TV_COAXIAL_ON))//2007/5/17
	input_select=4;
	else if(tv_input_f&BIT(TV_5CH1_ON))
	input_select=5;
	else    input_select=6;
						
	input_select_init();
	single_counter=0;
	auto_search_counter=Switch_Channel_Timer;//暂用
	bdata4_flag|=BIT(AUTO_SEARCH_F);
//	write_data_display(0,13,tv_theatre);//显示电视影院,并自动搜台
	//王明文添加
	VFD_Variable = TV_Mode;
	Display_Proc(Input_DisMode);		
}

ai_autosearch_ht()
{
	output_state_ht=ram_cd[9];
	if(theatre_mode==0)
	{
		output_state_ht=output_state_tv;
		Detect_Signal_Timer = 0;
	}
	theatre_mode=1;
	state_reg=0x32;//新加
	input_select=0;
	input_select_init();
	single_counter=0;
	auto_search_counter=Switch_Channel_Timer;//暂用
	bdata4_flag|=BIT(AUTO_SEARCH_F);
//	write_data_display(0,13,home_theatre);//显示家庭影院,并自动搜台
						
	//王明文添加
	VFD_Variable = HT_Mode;
	Display_Proc(Input_DisMode);	
}

void Initial_Channel(void)
{	
	remote_disp_init_1();
	menu_address=0;/*按此键跳出菜单*/
	if(bdata3_flag&BIT(MENU_OPEN_F))
	{bdata3_flag&=~BIT(MENU_OPEN_F);
		bdata4_flag|=BIT(MENU_INIT_F);//新附加, 以后要删
	}
	if(bdata4_flag&BIT(TUICHU_ANJIAN_F))//新加,发0x01,0xXX初始化(播放无文件)
	{bdata4_flag&=~BIT(TUICHU_ANJIAN_F);//改,跳出菜单
		osd_byte[0]=0;
		osd_byte[1]=0;
		remote_usbcard_on_disposal_1();
		delay_ms(10);
	}
	if(bdata3_flag&BIT(USB_CARD_PLAYER_F))//停止解码USB,卡
	{bdata3_flag&=~BIT(USB_CARD_PLAYER_F);
		//bdata4_flag|=BIT(MENU_INIT_F);
		osd_byte[0]=0xb0;
		osd_byte[1]=0x09;
		remote_usbcard_on_disposal_1();
	}

}
void Menu_Return(void)
{
	if(bdata3_flag&BIT(MENU_OPEN_F))
	{
        menu_address=0;
		bdata3_flag&=~BIT(MENU_OPEN_F);
        osd_byte[0]=0;
		osd_byte[1]=0;
		remote_usbcard_on_disposal_1();		
		if(theatre_mode==0)
		  video_select=3;//新加视频切换
		else if(theatre_mode==1)
		  video_select=1;
		else
		  video_select=2;
		  video_disposal();
     }
}



main()
{
	uchar i,j;	

	init_devices();

	
	PORTD&=~BIT(STANDBY_SWITCH);
	PORTC|=BIT(STANDBY);
	
   	Initial_VFD();
	
	bdata1_flag&=~BIT(WIRELESS_F);

//	data_4094&=~BIT(led_green);
//	data_4094&=~BIT(led_blue);
//	data_4094&=~BIT(BT_Sel);	
//	data_4094|=BIT(W2_4_Sel);
	//data_4094&=~BIT(coder);
//	data_4094&=~BIT(fan_con);
//	data_4094&=~BIT(MUTE_ALL);
//	data_4094&=~BIT(MUTE_SURROUND);
	write4094(0x24);
	
	Cn_En_Mode = 0;	//中文显示,次变量需要保存	
	
	vol_dec=0x00;
	touch_flag&=~BIT(autofit);
	counter_1s_poweroff=0x00;

	counter1_10ms=0;
    single_counter=0;
	Detect_Signal_Timer = 0;

	Signal_Detect_Time = 0;
	Signal_Detect_Time1 = 0;
	Signal_Detect_Time2 = 0;
	Signal_Detect_OK = 0;
	
	for(i=0;i<120;i++)//先清零内存变量;
	{ram[i]=0x00;}
	for(i=0;i<46;i++)
	{ram_ht[i]=0x00;}
	for(i=0;i<13;i++)
	{ram_cd[i]=0x00;}
	//for(i=0;i<65;i++)
	//{disp_reg[i]=0;}
	//for(i=0;i<65;i++)
	//{disp_reg_copy[i]=0;}//清0

	
	j=SREG;
	CLI();
	
	for(i=1;i<114;i++)
	{
		__EEGET(ram[i-1],i);
	}
	for(i=114;i<118;i++)
	{
		__EEGET(ram_2[i-114],i);
	}
	for(i=121;i<176;i++)
	{
		__EEGET(ram_ht[i-121],i);
	}
	for(i=176;i<189;i++)
	{
		__EEGET(ram_cd[i-176],i);
	}
	__EEGET(kalaok_mode,189);
	__EEGET(Speaker_Mode,190);
	__EEGET(Cn_En_Mode,191);
        if(Cn_En_Mode>1)Cn_En_Mode=0;
	
	SEI();
	SREG=j;	

	if (Speaker_Mode == 1)
	{		
		bdata6_flag|=BIT(SPEAKER_BIG_FLAG);
	}
	else
	{	
		bdata6_flag&=~BIT(SPEAKER_BIG_FLAG);
	}	
	bdata6_flag|=BIT(CHANGE_SPEAKER);

	AutoFit_Volume = 0;
	fcounter1=0x00;
	fcounter2=0x00;
	scounter1=0x00;
	scounter2=0x00;
	fvol = 0;
	svol = 0;

⌨️ 快捷键说明

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