📄 hptv._c
字号:
{
while(!(UCSRA&(1<<UDRE)));
UDR=0x69;
if(fac_state==FAC_OPEN)
{
fac_state=FAC_CLOSE; //非工厂状态
PORTB|=(1<<EDID_RWEN); //关闭i2c参数读写使能
EEPROMwrite(0x80,fac_state); //擦除工厂状态
}
//power_on_close_enable=1; //按键关机 //借用power_on关机
Powerdown_signal=1;
}
else
{
key|=0x80;
while(!(UCSRA&(1<<UDRE)));
UDR=0x70;
}
}
}
if((s8_state==1)&&(key_open==1))
{
power_num++;
}
else
{
power_num=0;
}
if((power_num==10)&&(s8_state))// 连续按键5s之后打开工厂状态
{
fac_state=FAC_OPEN; //打开工厂状态
while(!(UCSRA&(1<<UDRE)));
UDR=0xAA;
s8_state=0; //0为工厂状态,芯片出厂默认为非工场状态
EEPROMwrite(0x80,fac_state); //写入工厂状态
power_on_close_enable=1; //之后关机
}
}
/*####################按键处理函数,预留7个按键请在此写入功能
void key_menu(void) //menu键处理函数
{
}
void key_volh(void) //volh
{
}
void key_voll(void) //voll
{
}
void key_chh(void) //chh
{
}
void key_chl(void) //chl
{
}
void key_source(void) //source
{
}
void key_enter(void) //enter
{
}**/
//###############################################################
//-------------键码范围识别-------------------------
void key_cl(uchar i)
{
unsigned int key_8;
if((i>KEYPOWER_MIN)&&(i<KEYPOWER_MAX))
{
KeyResult=KEY_POWER;
// UDR=i;
//UDR=key; //测试
key_powercl();
goto keycl;
}
if((i>KEYMENU_MIN)&&(i<KEYMENU_MAX))
{
KeyResult=KEY_MENU;
// UDR=i;
//UDR=key;
//key_menu();
goto keycl;
}
if((i>KEYVOLH_MIN)&&(i<KEYVOLH_MAX))
{
// key_volh();
KeyResult=KEY_VOLH;
// UDR=i;
goto keycl;
}
if((i>KEYVOLL_MIN)&&(i<KEYVOLL_MAX))
{
// key_volh();
KeyResult=KEY_VOLL;
// UDR=i;
goto keycl;
}
if((i>KEYCHH_MIN)&&(i<KEYCHH_MAX))
{
// key_chh();
KeyResult=KEY_CHH;
// UDR=i;
goto keycl;
}
if((i>KEYCHL_MIN)&&(i<KEYCHL_MAX))
{
// key_chl();
KeyResult=KEY_CHL;
// UDR=i;
goto keycl;
}
if((i>KEYSOURCE_MIN)&&(i<KEYSOURCE_MAX))
{
// key_source();
KeyResult=KEY_SOURCE;
// UDR=i;
goto keycl;
}
KeyResult=0;
keycl:;
if(System_State==working)
{
if(KeyResult!=0)
{
key_8=(key&(0x80));
KeyResult|=key_8;
key=KeyResult;
i2c_public|=(1<<6); //准备i2c发送
}
}
}
void adc_cl(void)
{
uchar i,j,adc_maxmin;
uint adc_sun;
j=adc_jg[0];
//----------------键值稳定性处理----------------
for(i=1;i<5;i++) //去掉最大值
{
if(j<adc_jg[i])
{
adc_maxmin=adc_jg[i];
adc_jg[i]=j;
j=adc_maxmin;
}
}
j=adc_jg[1];
for(i=2;i<5;i++) //去掉最小值
{
if(j>adc_jg[i])
{
adc_maxmin=adc_jg[i];
adc_jg[i]=j;
j=adc_maxmin;
}
}
adc_sun=(adc_jg[2]+adc_jg[3]+adc_jg[4])/3;
i=adc_sun; //得到键码
//############消抖处理
key_jg[key_num]=adc_sun;
key_num++;
if(key_num<=2) //计满3次开始键码分析
{
goto tt;
}
if(key_jg[1]!=adc_sun)//消抖处理,键值不对则退出
{
key_num=0;
key_open=0;
s8_state=0;
power_num=0;
goto tt;
}
if(key_open==0) //识别键码后进行键码处理,第一次按键处理
{
//UDR=key_jg[1];
if(System_State==standby||System_State==working)
{
key_cl(key_jg[1]);
keycl_num=0;
}
}
key_open=1; //进入连续按键状态
if(keycl_num>=KEY_TIME) //连续按键时间达500ms时调用下一次按键处理
{
key_cl(key_jg[1]);//按键处理
keycl_num=0;
goto tt;
}
key_num=0;
//##############键码分析
if(adc_sun>0xfc)//一次按键已结束,一些计数值,状态初始化
{
key_open=0; //按键状态结束
power_key_open_enable=0; //电源按键结束
power_num=0; //电源计时清零
}
tt:;
}
//ADC initialize
// Conversion time: 3uS
void adc_init(void)
{
ADCSRA = 0x00; //disable adc bit 7启动 停止adc
ADMUX = (1<<REFS0)|(1<<ADLAR)|(ADC_2 & 0x0f);//0x42 //选择AVCC,结果左对齐,select adc input 2
ACSR = (1<<ACD); //模拟比较器关闭
ADCSRA = (1<<ADEN)|(1<<ADIE)|(1<<ADPS2);//|(1<<ADPS1); //中断使能,分频为16
adc_num=0;
}
#pragma interrupt_handler adc_isr:15
void adc_isr(void)
{
//conversion complete, read value (int) using...
// value=ADCL; //Read 8 low bits first (important)
// value|=(int)ADCH << 8; //read 2 high bits and shift into top byte
adc_rel=ADCH;
if((key_open==0)&&(adc_rel>0xfc))//有键按下后则处理ff值,将ff值视为退出标志
{
goto keynull; //无键按下时如果adc值为ff则快速退出
}
adc_num++;
adc_jg[adc_num]=adc_rel;
if(adc_num>=5)
{
adc_num=0;
key_b=1;
//UDR=adc_rel; //发送ad值
}
else
{
ADCSRA|=(1<<ADSC);//启动ad
}
keynull:; //标号不能加下划线
}
//call this routine to initialize all peripherals
/*
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x00; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}*/
/*########################################################*/
/****************************************
//UART0 initialize
// desired baud rate: 9600
// actual: baud rate:9600 (0.0%)
// char size: 8 bit
// parity: Disabled
*****************************************/
void uart0_init(void)
{
UCSRB = 0x00; //disable while setting baud rate
UCSRA = 0x00;
UCSRC = (1<<URSEL) |0x06;
UBRRL = 0x2F; //set baud rate lo
UBRRH = 0x00; //set baud rate hi
UCSRB = 0xD8;
}
void uart0_cl(void)
{uchar i;
// UDR=uart_command[0];
for(i=0;i<4;i++)
{
if(uart0_buffer[i]!=uart_command[i])
{return;
}
}
// UDR=uart0_buffer[4];
if(uart0_buffer[4]=='1') //开机
{
power_key_open_enable=1;
}
if(uart0_buffer[4]=='0')
{
// UDR=0x11;
power_on_close_enable=1; //关机
}
uart0_num=0;
u0check_num=0;
uart0_b=0;
}
#pragma interrupt_handler uart0_rx_isr:12
void uart0_rx_isr(void)
{
//uart has received a character in UDR
uart0_b=1; //启动超时检测
uart0_buffer[uart0_num]=UDR;
//UDR=uart0_buffer[uart0_num]; //
//UDR=uart_command[uart0_num];
uart0_num++;
}
#pragma interrupt_handler uart0_tx_isr:14
void uart0_tx_isr(void)
{
//character has been transmitted
// UDR=0x00;
// UDR=I2cReceiveData[];
}
/**************************************************
//call this routine to initialize all peripherals
**************************************************/
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
watchdog_init();
timer0_init();
timer1_init();
timer2_init();
adc_init();
i2cInit();
uart0_init();
//下面语句可以同时使用
//设置从接收函数句柄(此函数在被选中为从接收时执行)
// i2cSetSlaveReceiveHandler( i2cSlaveReceiveService );
//设置从发送函数句柄(此函数在被选中为从发送时执行)
// i2cSetSlaveTransmitHandler( i2cSlaveTransmitService );
MCUCR = 0x02;
GICR = 0x00;
TIMSK = 0x45; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
/**************************************************
//call this routine to initialize all variable
**************************************************/
void init_var(void)
{
unsigned char i;
close_to_open_count=0;
open_to_close_count=0;
pwrbt_count=0;
reset_open_count=0;
reset_close_count=0;
rly_on_count=0;
vs_on_open_count=0;
vs_on_close_count=0;
power_key_down_count=0;
power_key_on_count=0;
power_on_on_count=0;
power_on_down_count=0;
close_to_open_station=0;
open_to_close_station=0;
machine_open_start=0;
machine_close_start=0;
close_machine_enable=1;
open_machine_enable=1; //上电时保证开关机都可以容许
power_key_open_enable=0;
power_on_close_enable=0;
closetime_min=0;
opentime_min=0;
set_time=0xff;
closetime_min=0;
CloseTime_b=0;
CloseTimeMin_b=0;
Powerdown_time=0;
Panel_Open_delay_Signal=0;
Panel_Open_delay_Time=0;
System_State=standby;
KeyResult=0;
Open_Panel_time=0;
Open_Panel_flag=0;
// rc5_data_init();
/*
for(i=0;i<28;i++)
{
rc5_data[i]=0;
}
*/
}
void ys(void)
{
uchar j;
uint i;
for(j=0;j<5;j++)
{
for(i=0;i<60000;i++)
{
}
}
}
void IR_ys(void)
{
unsigned char b;
unsigned int a;
for(b=0;b<6;b++)
{
for(a=0;a<60000;a++)
{
}
}
}
//###################I2C接收命令处理函数###############################
void i2c_command1(void)
{
if(Panel_Open_delay_Signal==0)
{
if(i2c_command&0x01) //Mute处理
{
PORTA|=(1<<A_MUTE); //置1 静音
}
else
{
PORTA&=~(1<<A_MUTE); //置0 解除静音
}
}
if(i2c_command&0x02) //Hotplug处理
{
PORTA|=(1<<HPD123); //1
}
else
{
PORTA&=~(1<<HPD123); //置0
}
if(i2c_command&0x04) //SPDIF_SW处理
{
PORTA|=(1<<SPDIF_SW); //置1
}
else
{
PORTA&=~(1<<SPDIF_SW); //置0
}
if(i2c_command&0x10) //RS232_SW1处理
{
PORTC|=(1<<RS232_SW1); //置1
}
else
{
PORTC&=~(1<<RS232_SW1); //置0
}
if(i2c_command&0x08) //RS232_SW2处理
{
PORTC|=(1<<RS232_SW2); //置1
}
else
{
PORTC&=~(1<<RS232_SW2); //置0
}
if(i2c_command&0x20) //WATCHDOG处理--空函数
{
}
else
{
}
if(i2c_command&0x40) //关机处理
{
power_on_close_enable=1; //关机
}
if(i2c_command&0x80) //读取实时时间命令
{
i2creadtime_b=1;
I2cSendData[0]=0xfe;
AddTime(timer_s); //加上余数
ReadTime(&Time.CBit[0],6); //读取数据
while(!(UCSRA&(1<<UDRE)));
UDR=I2cSendData[0];
while(!(UCSRA&(1<<UDRE)));
UDR=I2cSendData[1];
while(!(UCSRA&(1<<UDRE)));
UDR=I2cSendData[2];
while(!(UCSRA&(1<<UDRE)));
UDR=I2cSendData[3];
while(!(UCSRA&(1<<UDRE)));
UDR=I2cSendData[4];
while(!(UCSRA&(1<<UDRE)));
UDR=I2cSendData[5];
while(!(UCSRA&(1<<UDRE)));
UDR=I2cSendData[6];
// UDR=I2cReceiveData[1];
/* I2cSendData[0]=0xFE;
I2cSendData[1]=0x45;
I2cSendData[2]=0x67;
I2cSendData[3]=0x89;
I2cSendData[4]=0xAB;
I2cSendData[5]=0xCD;
I2cSendData[6]=0xEF;
*/
DDRA|=(1<<7); // 改变为输出状态
PORTA&=0x7F; // PA7置0 申请发送数据
// UDR=0xa5;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -