?? 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 + -