📄 hptv._c
字号:
//ICC-AVR application builder : 2006-8-5 21:56:00
// Target : M16
// Crystal: 7.3728Mhz
#include <iom16v.h>
#include <macros.h>
#include <eeprom.h>
//#include "necdecode.h"
//#include "rc5.c"
#include "i2c.h"
#include "hptvstruct.h"
typedef unsigned char uchar;
typedef unsigned int uint;
/********************************************
//定义宏
//设置计数器各种功能时间值
//关机后,2s 后响应开机信号 0.05*40=2s
//开机后,20s 后响应关机信号 0.05*400=20s
//设置pwrbt=1 / 0 时间值 1ms*10=10ms 10+5=15ms
//设置rest and rest_l 开机时间值 0.05s*24=1.2s 0.05s*28=1.4s
//设置rest and rest_l 关机时间值 1ms*50=50ms 1ms*80=80s
//设置rly_on 关机时间值 1ms*200=200ms
//设置vs_on 开机时间值 1ms*20=20ms
//设置vs_on 关机时间值 1ms*220=220ms
//设置开机后pa0从低到高延迟时间值 0.05s*40=2s
//设置开机后poer重置延迟时间值 0.05s*12=0.6s
//设置power_key donwn时间值 1ms*20=20ms
//设置power_on时间值 1ms*200=200s
//设置rc5码全部bit长度以及第一、二开始位bit结束位置
*********************************************/
#define close_to_open_time 40
#define open_to_close_time 60 //3s
#define pwrbt_high_time 10
#define pwrbt_low_time 15
#define reset_open_time 28
#define reset_l_open_time 28
#define reset_close_time 50
#define reset_l_close_time 80
#define rly_on_time 200
#define vs_on_open_time 20
#define vs_on_close_time 220
#define pa0_l_open_delay 40
#define port_open_machine_delaytime 12
#define power_key_down_time 50
#define power_on_down_time 50
#define ADC_2 2 //ad通道号
//按键状态
#define KEY_POWER 0x40
//#define KEY_ENTER 1
#define KEY_SOURCE 0x20
#define KEY_CHL 0x10
#define KEY_CHH 0x08
#define KEY_VOLL 0x04
#define KEY_VOLH 0x02
#define KEY_MENU 0x01
#define KEY_TIME 200 //连续按键处理时间间隔500ms,可更改
// 联动power_num
#define KEYMENU_MIN 0x80
#define KEYMENU_MAX 0xa2
#define KEYPOWER_MIN 0x00
#define KEYPOWER_MAX 0x20
//#define KEYENTER_MIN ((256/3.3)*2.29)-5
//#define KEYENTER_MAX ((256/3.3)*2.29)+5
#define KEYCHL_MIN 0x28
#define KEYCHL_MAX 0x42
#define KEYCHH_MIN 0x4a
#define KEYCHH_MAX 0x62
#define KEYVOLL_MIN 0x68
#define KEYVOLL_MAX 0x80
#define KEYVOLH_MIN 0xc3
#define KEYVOLH_MAX 0xdb
#define KEYSOURCE_MIN 0xa8
#define KEYSOURCE_MAX 0xbf
#define FAC_OPEN 0x00
#define FAC_CLOSE 0xff
#define IRDA_WAIT 250 //红外按键第一次击键后关闭时长(单位ms)
#define I2C_SEQ 100 //I2C脉宽申请宽度
#define HPD123 6
#define SPDIF_SW 4
#define A_MUTE 0
#define RS232_SW1 6
#define RS232_SW2 7
#define EDID_RWEN 7
//#define rc5_bit_length 215
//#define rc5_startbit_1_length 8
//#define rc5_startbit_2_length 24
/*********************************************
//定义变量(按行归类解释)
//定义计数器计数值,初始值为0,意义对应宏定义 (第1--7行)
//定义关机到开机和开机到关机状态,当值为1时,表示处于20s和2s计数过程,不可进行相应的关机和开机(8行)
//定义开关机动作开始,可以告诉计数器计数开始 (第9行)
//定义开机和关机使能状态(10行)
//定义开机和关机控制信号使能状态(11--12行)
//rc5码各对应变量(13--18行)
*********************************************/
unsigned char close_to_open_count;
unsigned int open_to_close_count;
unsigned char pwrbt_count;
unsigned char reset_open_count,reset_close_count;
unsigned char rly_on_count;
unsigned char vs_on_open_count,vs_on_close_count;
unsigned char power_key_down_count,power_key_on_count;
unsigned char power_on_on_count,power_on_down_count;
unsigned char close_to_open_station,open_to_close_station; //用于开关机转换等待时间计数
unsigned char machine_open_start,machine_close_start; //开关机开始时给计数器开始使能
unsigned char close_machine_enable,open_machine_enable;
uchar power_down_count; //掉电检测时间计数器
uchar power_check_up; //掉电检测关机后重新开机标志
unsigned char adc_jg[5]={0,0,0,0,0};
unsigned char adc_rel; //ad转换结果
unsigned char adc_num; //累计5次ad次数后算转换平均值
uchar key_jg[3]; //累计3次结果相同则按键值有效
uchar key_num; //按键累计
uchar key,key_open; //键值,按键打开标志
uchar time0_num,time1_num; //
uchar time0_b,time1_b; //time0标志
uchar timer1_b; //time1标志
uchar time1s_num,time1s_b; //1s计数
uchar timer_s; //当前9s内的s数
uchar OpenTime_b; //开机时间判断
uchar CloseTime_b; //关机时间判断
uchar opentime_min;
uchar closetime_min;
uchar key_b; //按键处理标志
uint keycl_num; //按键处理时间间隔
uchar command_2d; //2d命令判断
uchar fac_state; //工厂状态,需在e2prom中保存
uchar power_num; //power键8s计时 KEY_TIME*16 (500*16)次
uchar s8_state; //8s工厂状态检测
uchar pb_state; //b口状态
uchar pb_num,pbcheck_num; //pb检测时间计时,状态变化确认计时
uchar iocheck_num; //
uchar u0check_num; //串口0数据超时检测计时
uchar uart0_b,uart0_num; //启动超时检测
const uchar uart_command[4]={'P','O','W','R'};
uchar uart0_buffer[5];
uchar i2cexint_num,i2c_b; //
uchar i2c_command;
//uchar irda_num; //
uchar set_time; //设置时间标志
uchar STATE;
unsigned char CloseTimeMin_b;
struct T
{
unsigned long TL;
unsigned int TH;
};
union OTime
{
unsigned long Ontime; //开机时间
char OBit[4];
}OpenTime;
union CTime //关机时间
{
unsigned long Cstime;
char CBit[4];
}CloseTime;
union TimeValume //时间参数
{
struct T VS;
char CBit[6];
}Time;
//TimeValume Time;
//外部函数声明
extern void i2cSetSlaveReceiveHandler(void (*i2cSlaveRx_func)(unsigned char receiveDataLength, unsigned char* recieveData));
extern void i2cSetSlaveTransmitHandler(unsigned char (*i2cSlaveTx_func)(unsigned char transmitDataLengthMax, unsigned char* transmitData));
//从函数声明
extern void i2cSlaveReceiveService(unsigned char receiveDataLength, unsigned char* receiveData);
//从函数声明
extern unsigned char i2cSlaveTransmitService(unsigned char transmitDataLengthMax, unsigned char* transmitData);
extern void i2cInit(void);
//extern void i2cSetLocalDeviceAddr(unsigned char deviceAddr);
//################################################
//NEC码解码部分变量声明-从此开始
extern unsigned char BTheFirstFallEdge; //为0时说明为接收到第一个下降沿或接受到第一个;为1时认为已接收到了第一个或大于1个下降沿;做为起始时间基准
extern unsigned char BReceiveStart; //开始接收数据标志
extern unsigned char BNecFallEdge; //是否有下降边沿
extern unsigned char TimeNecFallEdge; //下降边沿时间长度
extern unsigned char RTimeNecFallEdge; //下降边沿时间长度结果保存
extern unsigned char BNecStartBit; //是否有起始位
extern unsigned char NecData[4]; //红外数据
extern unsigned int NecDecodeNum; //红外数据位个数指针
extern unsigned int i;
extern unsigned char BHasReceiveNec; //已收到一个NEC码 为进行接收重复码做准备
extern unsigned char BPowerButton; //有开机按键
extern unsigned int NecRepeatCodeNum; //重复码与上一个NEC码时间间隔计数变量和重复码本身长度计数变量
extern unsigned int RNecRepeatCodeNum;//重复码计数结果保存
extern unsigned char BNecRepeat; //重复码标志,置1为收到重复码
extern unsigned char ResultNec;
extern unsigned char RepeatCountFlag; //为0时为还已收到了一个NEC码还未收到一次重复码,为1时为收到至少一个重复码
extern unsigned char BRepeatStar; //Repeat开始标志
extern unsigned char tv_state; //机器状态位
extern unsigned char irda_num,irda_b;
extern unsigned char i2c_public; //i2c使用权检测
extern unsigned char irda_data; //预发送数据
extern unsigned char power_key_open_enable;//
extern unsigned char power_on_close_enable;//
//NEC码解码部分变量声明-到此结束
//NEC码解码部分外部函数声明-从此开始
//extern void Head_Reset_Nec_receive();
//extern void Nec_data_deal_fun(void);
//extern void Deal_Repeat();
//extern void Nec_Decode();
extern void RepeatReceive(void);
extern void Nec_Receive(void);
extern void IR_var_init(void);
//NEC码解码部分外部函数声明-到此结束
extern unsigned char I2cSendData[I2C_SEND_DATA_BUFFER_SIZE];
extern unsigned char I2cSendDataIndex;
extern unsigned char I2cSendDataLength;
extern unsigned char I2cReceiveData[I2C_RECEIVE_DATA_BUFFER_SIZE];
extern unsigned char I2cReceiveDataIndex;
extern unsigned char I2cReceiveDataLength;
extern unsigned char i2creceive_b; //接收到命令
extern unsigned char i2creadtime_b; //
extern volatile unsigned char Powerdown_signal;
unsigned char Powerdown_time;
unsigned char Panel_Open_delay_Signal;
unsigned char Panel_Open_delay_Time;
unsigned char KeyResult;
unsigned char Open_Panel_time;
unsigned char Open_Panel_flag;
/*
typedef enum _TVstate
{
standby,
booting,
delaying,
working,
halting
}TVstate_t;
*/
volatile TVstate_t System_State;
void Clear_Timer_Close_Machine()
{
CloseTime_b=0;
CloseTime.Cstime=0;
closetime_min=0;
CloseTimeMin_b=0;
}
void start_iocheck(void) //上电检测io,为0则需要发送状态
{
uchar i;
pb_state=PINB&0x7f; //保存上电后io状态
if(pb_state!=0x7f) //第一次检测io
{
for(i=0;i<6;i++)
{
if((pb_state&(1<<i))==0)
{
i2c_public|=1<<i; //相应位置位
}
}
if((pb_state&(1<<6))==0)
{
i2c_public|=1<<5;
}
}
//UDR=pb_state;
}
void io_check(void) //io状态变化检测函数 0.5s检测一次
{
uchar i;
if(pb_state!=(PINB&0x7f))
{
pbcheck_num++;
}
if(pbcheck_num>1) //确认有变化
{
for(i=0;i<6;i++)
{
if((pb_state&(1<<i))!=((PINB&(1<<i))))//位比较,相同则调用函数
{
i2c_public|=(1<<i); //相应位置位
pb_state=PINB&0x7f; //保存新的状态位
STATE=(~pb_state)&0x7f;
}
}
if((pb_state&(1<<6))!=(PINB&(1<<6))) //由于i2c_public只有8位第7位单独处理
{ //第5位第6位用相同申请项
i2c_public|=(1<<5); //相应位置位
pb_state=PINB&0x7f; //保存新的状态位
STATE=(~pb_state)&0x7f; //
}
pbcheck_num=0;
}
//UDR=pb_state;
}
/*********************************************
//开机函数
//此函数用于设置开机时序
*********************************************/
void open_machine(void)
{
WDR();
//PORTC|=0x38; //pwrbt=1,reset=1,eset_l=1
pwrbt_count=0;
reset_open_count=0;
vs_on_open_count=0;
machine_open_start=1;
open_to_close_station=0;
open_to_close_count=0;
close_machine_enable=0;
open_machine_enable=0;
tv_state=1;
WDR();
command_2d=0;
PORTA|=(1<<7);
System_State=booting;
}
/*********************************************
//关机函数
//此函数用于设置关机时序
*********************************************/
void close_machine(void)
{
WDR();
//PORTC|=0x38; //pwrbt=1
reset_close_count=0;
rly_on_count=0;
vs_on_close_count=0;
close_to_open_count=0;
machine_close_start=1;
close_to_open_station=0;
close_machine_enable=0;
open_machine_enable=0;
tv_state=0;
PORTA|=(1<<7);
System_State=halting;
WDR();
}
/*********************************************
// port initialize
*********************************************/
void port_init(void)
{
PORTA = 0xcc; //将PA4 PA5,SPDIF_SW 输出为0 PA6 HOTPLUG保持为高
DDRA = 0xf3; // PA4,PA5 置为输出态
// PORTB = 0x7f;
PORTB = 0xff; //内部上拉使能
DDRB = 0x80;
// PORTC = 0x4c; //m103 output only
PORTC = 0x0c;
PORTC|=(1<<RS232_SW1); //1
PORTC&=~(1<<RS232_SW2); //0 --串口初始化
// PORTC = 0x0c; //m103 output only
DDRC = 0xf4; //pwrbt 去掉更改为备用的实时的中断输入引脚;
PORTD = 0x60;
DDRD = 0xF3;
}
/********************************************/
void init_time()
{
Time.VS.TL=0;
Time.VS.TH=0;
}
void WriteTime(char * RTime,char Num)
{
unsigned char i;
for(i=0;i<Num;i++)
{
*(RTime+i)=I2cReceiveData[i+1];
}
}
/*
void WriteTime() //写设定时间
{
unsigned char i;
for(i=1;i<6;i++)
{
Time.CBit[i]=I2cReceiveData[i];
}
}
void WriteOpenTime() //写开机时间
{
unsigned char i;
for(i=1;i<4;i++)
{
OpenTime.OBit[i]=I2cReceiveData[i];
}
}
void WriteCloseTime() //写关机时间
{
unsigned char i;
for(i=1;i<4;i++)
{
CloseTime.CBit[i]=I2cReceiveData[i];
}
}*/
void ReadTime(char *Rtime,char Num)
{
unsigned char i;
for(i=0;i<Num;i++)
{
I2cSendData[i+1]=*(Rtime+i);
}
}
void AddTime(char ATime)
{
unsigned long i;
i=0xFFFFFFFF-Time.VS.TL;
if(i<=ATime)
{
Time.VS.TH++;
Time.VS.TL=ATime-i;
}
else
{
Time.VS.TL+=ATime;
}
}
void DecTime(char Atime)
{
unsigned long i;
if(Time.VS.TL>8)
{
Time.VS.TL=Time.VS.TL-Atime;
}
else
{
Time.VS.TH--;
Time.VS.TL=0xffffffff-Atime+Time.VS.TL;
}
}
/*********************************************
// port initialize when you open and close the machine
//port_open_machine_set 主要实现MCU收到开机指令后的端口设置
//port_close_machine_set 主要实现MCU收到关机指令后的端口设置,与上电后一致
//可以将十六进制改成二进制,表示和更改更直观
*********************************************/
void port_open_machine_set(void)
{
WDR();
PORTA&= 0xfd; //pin37 pa0=0 pin37 PA0=1在定时器中delay 2s 实现
// PORTA|= 0x02; //pin36 pa1=1
// PORTB|= 0x80; //pin3 pb7=1
// PORTC|= 0x80; //pin26 pc7=1
// PORTC&= 0xbf; //pin25 pc6=0
PORTD&= 0x7f; //pin16 pd7=0
// PORTC = 0x0c;
PORTC&=~(1<<RS232_SW1); //0
PORTC|=(1<<RS232_SW2); //1
// PORTD|= 0x20; //pin14 pd5=1
// PORTD&= 0xef; //pin13 pd4=0
WDR();
}
void port_close_machine_set(void)
{
WDR();
PORTA = 0x4c; //将PA4 SPDIF_SW 暂时定义在高阻态 PA6 HOTPLUG保持为高 pa0=0 A_MUTE为低
DDRA = 0xE3; //未使能 PA4 SPDIF_SW
PORTB = 0xff; //内部上拉使能
DDRB = 0x80;
// PORTC = 0x4c; //m103 output only
PORTC = 0x0c;
PORTC|=(1<<RS232_SW1); //1
PORTC&=~(1<<RS232_SW2); //0 --串口初始化
// PORTC = 0x0c; //m103 output only 串口切换为00---mcu通道
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -