⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hptv._c

📁 MCU控制程序
💻 _C
📖 第 1 页 / 共 4 页
字号:
//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 + -