📄 hptv._c
字号:
}
void i2c_command5(void) //i2c5字节接收处理----实际数据未处理,可测试通讯协议
{uchar i;
i=I2cReceiveData[0];
switch(i)
{ //测试时可串口输出数据
case 0xff: //定时关机时间数据,数组I2cReceiveData[1-4]
// UDR=0xff;
CloseTime_b=1;
WriteTime(&CloseTime.CBit[0],4);//写入时间数据
/* UDR=CloseTime.CBit[0];
while(!(UCSRA&(1<<UDRE)));
UDR=CloseTime.CBit[1];
while(!(UCSRA&(1<<UDRE)));
UDR=CloseTime.CBit[2];
while(!(UCSRA&(1<<UDRE)));
UDR=CloseTime.CBit[3];
*/
CloseTime.Cstime=CloseTime.Cstime+timer_s;
//WriteCloseTime();
/* while(!(UCSRA&(1<<UDRE)));
UDR=I2cReceiveData[1];
while(!(UCSRA&(1<<UDRE)));
UDR=I2cReceiveData[2];
while(!(UCSRA&(1<<UDRE)));
UDR=I2cReceiveData[3];
while(!(UCSRA&(1<<UDRE)));
UDR=I2cReceiveData[4];*/
break;
case 0xfe: //定时开机时间数据,数组I2cReceiveData[1-4]
// UDR=0xfe;
OpenTime_b=1;
WriteTime(&OpenTime.OBit[0],4);//写入时间数据
// UDR=OpenTime.OBit[0];
// while(!(UCSRA&(1<<UDRE)));
// UDR=OpenTime.OBit[1];
// while(!(UCSRA&(1<<UDRE)));
// UDR=OpenTime.OBit[2];
// while(!(UCSRA&(1<<UDRE)));
// UDR=OpenTime.OBit[3];
OpenTime.Ontime=OpenTime.Ontime+timer_s;
//WriteTime();
/* while(!(UCSRA&(1<<UDRE)));
UDR=I2cReceiveData[1];
while(!(UCSRA&(1<<UDRE)));
UDR=I2cReceiveData[2];
while(!(UCSRA&(1<<UDRE)));
UDR=I2cReceiveData[3];
while(!(UCSRA&(1<<UDRE)));
UDR=I2cReceiveData[4];
break;*/
}
}
void i2c_command7(void) //i2c7字节接收处理
{uchar i;
i=I2cReceiveData[0];
if(i==0xfd)
{
set_time=EEPROMread(0xf0); //调点后重新启动时读取用户是否已设定时间标志
if(set_time!=0)
{
set_time=0x00; //写入时间
EEPROMwrite(0xf0,set_time);// 记录用户已设置过时间状态
// set_time=0xff;
}
/* while(!(UCSRA&(1<<UDRE)));
UDR=0x60;
while(!(UCSRA&(1<<UDRE)));
UDR=I2cReceiveData[1];
while(!(UCSRA&(1<<UDRE)));
UDR=I2cReceiveData[2];
while(!(UCSRA&(1<<UDRE)));
UDR=I2cReceiveData[3];
while(!(UCSRA&(1<<UDRE)));
UDR=I2cReceiveData[4];
while(!(UCSRA&(1<<UDRE)));
UDR=I2cReceiveData[5];
while(!(UCSRA&(1<<UDRE)));
UDR=I2cReceiveData[6];
*/
WriteTime(&Time.CBit[0],6);//写入时间数据
DecTime(timer_s); //减去当前定时器的9s内的s数
//WriteTime();
}
// TCCR1B = 0x00; //停止计时
// TCNT1H = 0x02; //reload counter high value
// TCNT1L = 0xE1; //reload counter low value
// TCCR1B = 0x05; //start Timer
// UDR= I2cReceiveData[0];
// UDR=i;
}
//#############################################################
void main(void)
{
init_var();
init_devices();
//Add for IR
IR_var_init();
init_time();
IR_ys();
GICR=0x40;
//Add end
WDR();
// EEPROMwrite(0x80,FAC_CLOSE);// 给初值,非工厂状态
// fac_state=FAC_CLOSE;
// UDR=fac_state;
set_time =EEPROMread(0xf0); //读取是否需要申请掉电后时间重设置
fac_state=EEPROMread(0x80);
UDR=0xEE;
while(!(UCSRA&(1<<UDRE)));
UDR=fac_state;
if(fac_state==FAC_OPEN) //是否为工厂状态,如是则开机
{
ys();
open_machine();
PORTB&=~(1<<EDID_RWEN); //打开i2c参数使能
}
///###################测试i2c
// start_iocheck(); //第一次启动io检测
while(1)
{
WDR();
// PORTC|=1<<6;
// PORTC&=~(1<<7);
if(time1_b)
{
time1_b=0;
time1_cl(); //定时器1代码移植到此
if(tv_state) //io口检测
{
iocheck_num++;
if(iocheck_num>10)//调用io状态检测 500ms检测一次
{
io_check();
iocheck_num=0;
// PORTA|=(1<<7); //置1,恢复数据
if(Open_Panel_flag==1)
{
Open_Panel_time++;
if(Open_Panel_time>=20)
{
PORTD&=0xbf;
Open_Panel_flag=0;
Open_Panel_time=0;
}
}
if(Panel_Open_delay_Signal==1)
{
Panel_Open_delay_Time++;
if(Panel_Open_delay_Time==3)
{
Panel_Open_delay_Signal=0;
Panel_Open_delay_Time=0;
System_State=working;
PORTD&=0xbf;
PORTA|=(1<<1);
PORTA|=(1<<A_MUTE);
}
}
if(Powerdown_signal==1)
{
if(System_State==working)
{
while(!(UCSRA&(1<<UDRE)));
UDR=0x92;
Powerdown_time++;
if(Powerdown_time==2)
{
Powerdown_time=0;
Powerdown_signal=0;
power_on_close_enable=1;
}
}
else
{
Powerdown_time=0;
Powerdown_signal=0;
}
}
if(command_2d==0) //时间范围设定
{
if((PIND&(1<<5))==0)
{
PORTD&=~(1<<4);
PORTD|=(1<<5);
//UDR=0X66;
}
else
{
PORTD|=(1<<4);
PORTD&=~(1<<5);
// UDR=0X77;
}
}
}
}
else
{
iocheck_num=0;
}
time1s_num++;
if(time1s_num>=20) //1s
{
// time1s_b=1;
time1s_num=0;
timer_s++;
// UDR=timer_s;
if(opentime_min)
{
opentime_min--;
OpenTime.Ontime=OpenTime.Ontime-1;
// UDR=OpenTime.OBit[0];
/* while(!(UCSRA&(1<<UDRE)));
UDR=OpenTime.OBit[1];
while(!(UCSRA&(1<<UDRE)));
UDR=OpenTime.OBit[2];
while(!(UCSRA&(1<<UDRE)));
UDR=OpenTime.OBit[3];*/
if((opentime_min==0)||(closetime_min>8))
{
OpenTime_b=0; //开机时间计数到停止更新
closetime_min=0;
if(tv_state==0) //如果为关机状态则
{
power_key_open_enable=1; //开机
}
}
}
if(CloseTimeMin_b)
{
closetime_min--;
CloseTime.Cstime=CloseTime.Cstime-1;
// UDR=CloseTime.CBit[0];
/* while(!(UCSRA&(1<<UDRE)));
UDR=CloseTime.CBit[1];
while(!(UCSRA&(1<<UDRE)));
UDR=CloseTime.CBit[2];
while(!(UCSRA&(1<<UDRE)));
UDR=CloseTime.CBit[3];*/
if((closetime_min==0)||(closetime_min>8))
{
CloseTime_b=0; //关机时间计数到停止更新
CloseTimeMin_b=0;
if(tv_state) //申请关机,请求发送i2c命令
{
STATE|=(1<<7); //最高位置1
I2cSendData[0]=irda_data;
I2cSendData[1]=key;
I2cSendData[2]=STATE;
PORTA&=0x7F; // PA7置0 申请发送数据
STATE&=0x7f;
Clear_Timer_Close_Machine();
}
}
}
}
}
if(time0_b) //time0处理代码移动到此
{
time0_b=0;
time0_cl();
if(time0_num>8)//启动按键采样 9ms一次
{
time0_num=0;
ADCSRA|=(1<<ADSC);//启动ad
}
if(uart0_b) // 串口数据分析
{
u0check_num++; //超时计数
if((u0check_num>100)&&(uart0_num!=5))//超时溢出,通讯错误
{
uart0_num=0; //恢复初状态
uart0_b=0;
u0check_num=0;
}
if(uart0_num>=5) //通讯正常
{
uart0_cl(); //调用通讯处理函数
//UDR=0x55;
}
}
}
if(key_b) //按键处理
{
key_b=0;
adc_cl(); //
}
if(power_key_open_enable==1&&open_machine_enable==1)//power_key open machine
{
UDR=0x86;
open_machine();
power_key_open_enable=0;
}
if(power_on_close_enable==1&&close_machine_enable==1)//power_on close machine
{
UDR=0x88;
Clear_Timer_Close_Machine();
close_machine();
power_on_close_enable=0;
}
/*----如果i2c被申请,则调用i2c处理函数-----------
其字符位结构如下
7 6 5 4 3 2 1 0
irda key io56 io4 io3 io2 io1 io0----*/
if((i2c_public!=0)&&(PINA&0x80)) //记录变化量, 看i2c是否被占用
// if((i2c_public!=0))
{
DDRA|=(1<<7); // 改变为输出状态
// PORTA&=0x7F; // PA7置0 申请发送数据
I2cSendData[0]=irda_data;
irda_data=0;
I2cSendData[1]=key;
key=0;
/* while(!(UCSRA&(1<<UDRE)));
UDR=I2cSendData[0];
while(!(UCSRA&(1<<UDRE)));
UDR=I2cSendData[1];
while(!(UCSRA&(1<<UDRE)));
UDR=STATE;
*/
I2cSendData[2]=STATE;
PORTA&=0x7F;
i2c_public=0;
// i2c_b=1;
}
if(i2creceive_b) //接收到i2c命令后处理
{
// UDR=I2cReceiveData[0];
i2creceive_b=0;
// UDR=I2cReceiveData[0];
if(I2cReceiveDataIndex==1) //处理i2c命令
{
i2c_command=I2cReceiveData[0];
// while(!(UCSRA&(1<<UDRE)));
// UDR=0x90;
// while(!(UCSRA&(1<<UDRE)));
// UDR=i2c_command;
if((command_2d==0)&&(i2c_command==0x2d)) //开机后第一次收到2d命令
{
command_2d=1;
PORTD|=(1<<4);
PORTD&=~(1<<5); //开机后灯的状态恢复
Panel_Open_delay_Signal=1;
System_State=delaying;
// PORTD&=0xbf; //打开VS_ON
// PORTA|=(1<<1); //打开显示
if((set_time==0)&&(Time.VS.TL==0)&&(Time.VS.TH==0)) //掉电后需要更新时间设置
{
// set_time=0xff; //通过set_time来判断是否需要更新
init_time();
key|=(1<<7); //申请time reset
}
I2cSendData[0]=irda_data;
I2cSendData[1]=key;
I2cSendData[2]=STATE; //数据进入发送缓冲区
DDRA|=(1<<7); // 改变为输出状态
PORTA&=0x7F; // PA7置0 申请发送数据
}
// UDR=i2c_command;
i2c_command1();
}
else if(I2cReceiveDataIndex==5) //处理5字节接收
{
i2c_command5();
}
else if(I2cReceiveDataIndex==7)
{
i2c_command7();
}
else
{
I2cReceiveDataIndex=0;
}
}
if(timer1_b)
{
//UDR=9;
// closetime_min=0;
// opentime_min=0;
timer1_b=0;
if(set_time==0)//已设置时间
{
AddTime(9); //时间更新9s累加
}
timer_s=0; //清除9s内计数
time1s_num=0;
// time1s_b=0;
if(OpenTime_b) //开机时间更新
{
OpenTime.Ontime=OpenTime.Ontime-9;
// UDR=OpenTime.OBit[0];
/* while(!(UCSRA&(1<<UDRE)));
UDR=OpenTime.OBit[1];
while(!(UCSRA&(1<<UDRE)));
UDR=OpenTime.OBit[2];
while(!(UCSRA&(1<<UDRE)));
UDR=OpenTime.OBit[3];*/
if(OpenTime.Ontime==0) //开机
{
OpenTime_b=0; //开机时间计数到停止更新
if(tv_state==0)
{
power_key_open_enable=1; //开机
}
}
else if(OpenTime.Ontime<9)
{
opentime_min=OpenTime.Ontime;//启动9秒内检测
}
else
{
opentime_min=0;
}
}
/*
if(CloseTime_b) //关机时间更新
{
CloseTime.Cstime=CloseTime.Cstime-9;
UDR=CloseTime.CBit[0];
while(!(UCSRA&(1<<UDRE)));
UDR=CloseTime.CBit[1];
while(!(UCSRA&(1<<UDRE)));
UDR=CloseTime.CBit[2];
while(!(UCSRA&(1<<UDRE)));
UDR=CloseTime.CBit[3];
if(CloseTime.Cstime==0) //关机
{
CloseTime_b=0; //关机时间计数到停止更新
if(tv_state) //申请关机,请求发送i2c命令
{
pb_state|=(1<<7); //最高位置1
PORTA&=0x7F; // PA7置0 申请发送数据
}
}
else if(CloseTime.Cstime<9)
{
closetime_min=CloseTime.Cstime;
}
else
{
closetime_min=0;
}
}
*/
if(CloseTime_b)
{
if(CloseTime.Cstime>9)
{
CloseTime.Cstime=CloseTime.Cstime-9;
if(CloseTime.Cstime<9)
{
closetime_min=CloseTime.Cstime;
CloseTime_b=0;
CloseTimeMin_b=1;
}
}
else
{
if(CloseTime.Cstime==9)
{
CloseTime_b=0;
if(tv_state) //申请关机,请求发送i2c命令
{
pb_state|=(1<<7); //最高位置1
if(tv_state) //申请关机,请求发送i2c命令
{
STATE|=(1<<7); //最高位置1
I2cSendData[0]=irda_data;
I2cSendData[1]=key;
I2cSendData[2]=STATE;
PORTA&=0x7F; // PA7置0 申请发送数据
STATE&=0x7f;
Clear_Timer_Close_Machine();
}
}
}
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -