📄 t10a2_main.c
字号:
{
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 + -