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

📄 hp.lst

📁 MCU控制程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
__start:
__text_start:
    00B9 E5CF      LDI	R28,0x5F
    00BA E0D4      LDI	R29,4
    00BB BFCD      OUT	0x3D,R28
    00BC BFDE      OUT	0x3E,R29
    00BD 51C0      SUBI	R28,0x10
    00BE 40D0      SBCI	R29,0
    00BF EA0A      LDI	R16,0xAA
    00C0 8308      STD	Y+0,R16
    00C1 2400      CLR	R0
    00C2 E6E9      LDI	R30,0x69
    00C3 E0F0      LDI	R31,0
    00C4 E011      LDI	R17,1
    00C5 31E5      CPI	R30,0x15
    00C6 07F1      CPC	R31,R17
    00C7 F011      BEQ	0x00CA
    00C8 9201      ST	R0,Z+
    00C9 CFFB      RJMP	0x00C5
    00CA 8300      STD	Z+0,R16
    00CB E6E8      LDI	R30,0x68
    00CC E0F1      LDI	R31,1
    00CD E6A0      LDI	R26,0x60
    00CE E0B0      LDI	R27,0
    00CF E011      LDI	R17,1
    00D0 37E1      CPI	R30,0x71
    00D1 07F1      CPC	R31,R17
    00D2 F021      BEQ	0x00D7
    00D3 95C8      LPM
    00D4 9631      ADIW	R30,1
    00D5 920D      ST	R0,X+
    00D6 CFF9      RJMP	0x00D0
    00D7 940E08A5  CALL	_main
_exit:
    00D9 CFFF      RJMP	_exit
_Clear_Timer_Close_Machine:
    00DA 940E116B  CALL	push_gset2
FILE: G:\McuControl\hptv.c
(0001) //ICC-AVR application builder : 2006-8-5 21:56:00
(0002) // Target : M16
(0003) // Crystal: 7.3728Mhz
(0004) 
(0005) #include <iom16v.h>
(0006) #include <macros.h>
(0007) #include <eeprom.h>
(0008) //#include "necdecode.h"
(0009) //#include "rc5.c"
(0010) #include "i2c.h" 
(0011) #include "hptvstruct.h"
(0012) typedef unsigned char uchar;
(0013) typedef unsigned int uint;
(0014) /********************************************
(0015) //定义宏
(0016) //设置计数器各种功能时间值
(0017) //关机后,2s 后响应开机信号        0.05*40=2s
(0018) //开机后,20s 后响应关机信号       0.05*400=20s
(0019) //设置pwrbt=1 / 0 时间值           1ms*10=10ms 10+5=15ms
(0020) //设置rest and rest_l 开机时间值   0.05s*24=1.2s 0.05s*28=1.4s
(0021) //设置rest and rest_l 关机时间值   1ms*50=50ms 1ms*80=80s
(0022) //设置rly_on 关机时间值            1ms*200=200ms 
(0023) //设置vs_on  开机时间值            1ms*20=20ms 
(0024) //设置vs_on  关机时间值            1ms*220=220ms 
(0025) //设置开机后pa0从低到高延迟时间值  0.05s*40=2s 
(0026) //设置开机后poer重置延迟时间值     0.05s*12=0.6s 
(0027) //设置power_key donwn时间值        1ms*20=20ms 
(0028) //设置power_on时间值               1ms*200=200s 
(0029) //设置rc5码全部bit长度以及第一、二开始位bit结束位置          
(0030) *********************************************/
(0031) #define   close_to_open_time   40
(0032) #define   open_to_close_time   60      //3s
(0033) #define   pwrbt_high_time      10
(0034) #define   pwrbt_low_time       15
(0035) #define   reset_open_time      28                
(0036) #define   reset_l_open_time    28
(0037) #define   reset_close_time     50
(0038) #define   reset_l_close_time   80
(0039) #define   rly_on_time          200
(0040) #define   vs_on_open_time      20
(0041) #define   vs_on_close_time     220
(0042) #define   pa0_l_open_delay     40
(0043) #define   port_open_machine_delaytime  12
(0044) #define   power_key_down_time  50
(0045) #define   power_on_down_time   50
(0046) 
(0047) #define   ADC_2                2  //ad通道号
(0048) //按键状态
(0049) #define   KEY_POWER            0x40  
(0050) //#define   KEY_ENTER            1
(0051) #define   KEY_SOURCE           0x20
(0052) #define   KEY_CHL              0x10
(0053) #define   KEY_CHH              0x08
(0054) #define   KEY_VOLL             0x04
(0055) #define   KEY_VOLH             0x02
(0056) #define   KEY_MENU             0x01
(0057) 
(0058) 
(0059) #define   KEY_TIME             200  //连续按键处理时间间隔500ms,可更改
(0060)                                     //  联动power_num     
(0061) 
(0062)    
(0063) #define   KEYMENU_MIN          0x80     
(0064) #define   KEYMENU_MAX          0xa2     
(0065) #define   KEYPOWER_MIN         0x00     
(0066) #define   KEYPOWER_MAX         0x20
(0067)   
(0068) //#define   KEYENTER_MIN         ((256/3.3)*2.29)-5     
(0069) //#define   KEYENTER_MAX         ((256/3.3)*2.29)+5     
(0070) #define   KEYCHL_MIN           0x28
(0071) #define   KEYCHL_MAX           0x42
(0072) 
(0073) #define   KEYCHH_MIN           0x4a
(0074) #define   KEYCHH_MAX           0x62
(0075) 
(0076) #define   KEYVOLL_MIN          0x68
(0077) #define   KEYVOLL_MAX          0x80
(0078) 
(0079) #define   KEYVOLH_MIN          0xc3
(0080) #define   KEYVOLH_MAX          0xdb
(0081) 
(0082) #define   KEYSOURCE_MIN        0xa8
(0083) #define   KEYSOURCE_MAX        0xbf
(0084) 
(0085) #define   FAC_OPEN             0x00
(0086) #define   FAC_CLOSE            0xff
(0087) 
(0088) 
(0089) 
(0090) #define   IRDA_WAIT            250  //红外按键第一次击键后关闭时长(单位ms)
(0091) 
(0092) #define   I2C_SEQ              100  //I2C脉宽申请宽度
(0093) 
(0094) #define   HPD123               6
(0095) #define   SPDIF_SW             4
(0096) #define   A_MUTE               0
(0097) #define   RS232_SW1            6
(0098) #define   RS232_SW2            7
(0099) 
(0100) #define   EDID_RWEN            7
(0101) 
(0102) //#define   rc5_bit_length       215
(0103) //#define   rc5_startbit_1_length  8
(0104) //#define   rc5_startbit_2_length  24
(0105) /*********************************************
(0106) //定义变量(按行归类解释)
(0107) //定义计数器计数值,初始值为0,意义对应宏定义   (第1--7行)
(0108) //定义关机到开机和开机到关机状态,当值为1时,表示处于20s和2s计数过程,不可进行相应的关机和开机(8行)
(0109) //定义开关机动作开始,可以告诉计数器计数开始   (第9行)
(0110) //定义开机和关机使能状态(10行)
(0111) //定义开机和关机控制信号使能状态(11--12行)
(0112) //rc5码各对应变量(13--18行)
(0113) *********************************************/
(0114) unsigned char close_to_open_count;
(0115) unsigned int  open_to_close_count;
(0116) unsigned char pwrbt_count;
(0117) unsigned char reset_open_count,reset_close_count;
(0118) unsigned char rly_on_count;
(0119) unsigned char vs_on_open_count,vs_on_close_count;
(0120) unsigned char power_key_down_count,power_key_on_count;
(0121) unsigned char power_on_on_count,power_on_down_count;
(0122) unsigned char close_to_open_station,open_to_close_station;      //用于开关机转换等待时间计数
(0123) unsigned char machine_open_start,machine_close_start;           //开关机开始时给计数器开始使能
(0124) unsigned char close_machine_enable,open_machine_enable;
(0125) 
(0126) uchar   power_down_count;   //掉电检测时间计数器
(0127) uchar   power_check_up;     //掉电检测关机后重新开机标志
(0128) unsigned char adc_jg[5]={0,0,0,0,0};
(0129) unsigned char adc_rel;      //ad转换结果
(0130) unsigned char adc_num;      //累计5次ad次数后算转换平均值
(0131) uchar  key_jg[3];           //累计3次结果相同则按键值有效
(0132) uchar  key_num;             //按键累计
(0133) uchar  key,key_open;        //键值,按键打开标志
(0134) uchar  time0_num,time1_num; //
(0135) uchar  time0_b,time1_b;     //time0标志
(0136) uchar  timer1_b;             //time1标志
(0137) uchar  time1s_num,time1s_b; //1s计数
(0138) uchar  timer_s;             //当前9s内的s数
(0139) uchar  OpenTime_b;          //开机时间判断
(0140) uchar  CloseTime_b;         //关机时间判断
(0141) uchar  opentime_min;
(0142) uchar  closetime_min;
(0143) uchar  key_b;               //按键处理标志
(0144) uint   keycl_num;           //按键处理时间间隔
(0145) uchar  command_2d;          //2d命令判断
(0146) 
(0147) uchar  fac_state;           //工厂状态,需在e2prom中保存
(0148) uchar  power_num;           //power键8s计时   KEY_TIME*16 (500*16)次
(0149) uchar  s8_state;            //8s工厂状态检测
(0150) uchar  pb_state;            //b口状态
(0151) uchar  pb_num,pbcheck_num;  //pb检测时间计时,状态变化确认计时 
(0152) uchar  iocheck_num;         //
(0153) uchar  u0check_num;         //串口0数据超时检测计时
(0154) uchar  uart0_b,uart0_num;             //启动超时检测
(0155) const  uchar  uart_command[4]={'P','O','W','R'};
(0156) uchar  uart0_buffer[5];
(0157) uchar  i2cexint_num,i2c_b;        //
(0158) uchar  i2c_command;
(0159) //uchar  irda_num;             //
(0160) uchar  set_time;            //设置时间标志
(0161) uchar  STATE;
(0162) 
(0163) unsigned char CloseTimeMin_b;
(0164) 
(0165) struct T
(0166) {
(0167)   unsigned long TL;
(0168)   unsigned int  TH;
(0169) };
(0170) union OTime
(0171) {
(0172)   unsigned long Ontime;  //开机时间
(0173)   char   OBit[4];
(0174) }OpenTime;
(0175) union CTime              //关机时间
(0176) {
(0177)   unsigned long Cstime;
(0178)   char   CBit[4];
(0179) }CloseTime;
(0180) union TimeValume         //时间参数
(0181) {
(0182)   struct T VS;
(0183)   char    CBit[6];
(0184) }Time;
(0185) //TimeValume Time;
(0186) //外部函数声明
(0187) extern void i2cSetSlaveReceiveHandler(void (*i2cSlaveRx_func)(unsigned char receiveDataLength, unsigned char* recieveData));
(0188) extern void i2cSetSlaveTransmitHandler(unsigned char (*i2cSlaveTx_func)(unsigned char transmitDataLengthMax, unsigned char* transmitData));
(0189) //从函数声明
(0190) extern void i2cSlaveReceiveService(unsigned char receiveDataLength, unsigned char* receiveData);
(0191) //从函数声明
(0192) extern unsigned char i2cSlaveTransmitService(unsigned char transmitDataLengthMax, unsigned char* transmitData);
(0193) extern void i2cInit(void);
(0194) //extern void i2cSetLocalDeviceAddr(unsigned char deviceAddr);
(0195) 
(0196) //################################################
(0197) 
(0198) //NEC码解码部分变量声明-从此开始
(0199) extern unsigned char  BTheFirstFallEdge; //为0时说明为接收到第一个下降沿或接受到第一个;为1时认为已接收到了第一个或大于1个下降沿;做为起始时间基准
(0200) extern unsigned char  BReceiveStart;    //开始接收数据标志
(0201) extern unsigned char  BNecFallEdge;     //是否有下降边沿
(0202) extern unsigned char  TimeNecFallEdge;  //下降边沿时间长度
(0203) extern unsigned char  RTimeNecFallEdge; //下降边沿时间长度结果保存
(0204) extern unsigned char  BNecStartBit;	 //是否有起始位
(0205) extern unsigned char  NecData[4];		 //红外数据
(0206) extern unsigned int   NecDecodeNum;	 //红外数据位个数指针
(0207) extern unsigned int   i;
(0208) extern unsigned char  BHasReceiveNec;   //已收到一个NEC码 为进行接收重复码做准备
(0209) extern unsigned char  BPowerButton;     //有开机按键
(0210) extern unsigned int   NecRepeatCodeNum; //重复码与上一个NEC码时间间隔计数变量和重复码本身长度计数变量
(0211) extern unsigned int   RNecRepeatCodeNum;//重复码计数结果保存
(0212) 
(0213) extern unsigned char  BNecRepeat;       //重复码标志,置1为收到重复码
(0214) extern unsigned char  ResultNec;
(0215) extern unsigned char  RepeatCountFlag;  //为0时为还已收到了一个NEC码还未收到一次重复码,为1时为收到至少一个重复码
(0216) extern unsigned char  BRepeatStar;      //Repeat开始标志 
(0217) extern unsigned char tv_state;           //机器状态位
(0218) extern unsigned char irda_num,irda_b;
(0219) extern unsigned char  i2c_public;           //i2c使用权检测 
(0220) extern unsigned char irda_data;          //预发送数据
(0221) 
(0222) extern unsigned char power_key_open_enable;//
(0223) extern unsigned char power_on_close_enable;//  
(0224) 
(0225) //NEC码解码部分变量声明-到此结束
(0226) //NEC码解码部分外部函数声明-从此开始
(0227) //extern void Head_Reset_Nec_receive();
(0228) //extern void Nec_data_deal_fun(void);
(0229) //extern void Deal_Repeat();
(0230) //extern void Nec_Decode();
(0231) extern void RepeatReceive(void);
(0232) extern void Nec_Receive(void);
(0233) extern void IR_var_init(void);
(0234) //NEC码解码部分外部函数声明-到此结束
(0235) 
(0236) extern unsigned char I2cSendData[I2C_SEND_DATA_BUFFER_SIZE]; 
(0237) extern unsigned char I2cSendDataIndex; 
(0238) extern unsigned char I2cSendDataLength;
(0239) 
(0240) extern unsigned char I2cReceiveData[I2C_RECEIVE_DATA_BUFFER_SIZE]; 
(0241) extern unsigned char I2cReceiveDataIndex; 
(0242) extern unsigned char I2cReceiveDataLength;
(0243) 
(0244) extern unsigned char i2creceive_b;  //接收到命令
(0245) extern unsigned char i2creadtime_b; //
(0246) 
(0247) 
(0248) extern volatile unsigned char Powerdown_signal;
(0249) unsigned char Powerdown_time;
(0250) unsigned char Panel_Open_delay_Signal;
(0251) unsigned char Panel_Open_delay_Time;
(0252) unsigned char KeyResult;
(0253) unsigned char Open_Panel_time;
(0254) unsigned char Open_Panel_flag;
(0255) 
(0256) 
(0257) 
(0258) /*
(0259) typedef enum _TVstate
(0260) {
(0261)    standby,
(0262)    booting,
(0263)    delaying,
(0264)    working,
(0265)    halting
(0266) }TVstate_t;
(0267) */
(0268) 
(0269) volatile TVstate_t System_State;
(0270)    
(0271)    
(0272)    
(0273) 
(0274) 
(0275) 
(0276) 
(0277) 
(0278) void Clear_Timer_Close_Machine()
(0279) {
(0280)  CloseTime_b=0;
    00DC 2422      CLR	R2
    00DD 92200099  STS	_CloseTime_b,R2
(0281)  CloseTime.Cstime=0;
    00DF E040      LDI	R20,0
    00E0 E050      LDI	R21,0
    00E1 E060      LDI	R22,0
    00E2 E070      LDI	R23,0
    00E3 93500077  STS	_CloseTime+1,R21
    00E5 93400076  STS	_CloseTime,R20
    00E7 93700079  STS	_CloseTime+3,R23
    00E9 93600078  STS	_CloseTime+2,R22
(0282)  closetime_min=0;
    00EB 92200097  STS	_closetime_min,R2
(0283)  CloseTimeMin_b=0;
    00ED 9220007E  STS	_CloseTimeMin_b,R2
    00EF 940E114B  CALL	pop_gset2
    00F1 9508      RET
_start_iocheck:
  i                    --> R20
    00F2 940E1154  CALL	push_gset1
(0284) }
(0285) 
(0286) void start_iocheck(void)  //上电检测io,为0则需要发送状态
(0287) {
(0288)    uchar i;
(0289)     pb_state=PINB&0x7f;   //保存上电后io状态
    00F4 B386      IN	R24,0x16
    00F5 778F      ANDI	R24,0x7F
    00F6 9380008F  STS	_pb_state,R24
(0290) 	if(pb_state!=0x7f)  //第一次检测io
    00F8 378F      CPI	R24,0x7F
    00F9 F0F9      BEQ	0x0119
(0291) 	{
(0292) 	
(0293) 	   for(i=0;i<6;i++)
    00FA 2744      CLR	R20
    00FB C012      RJMP	0x010E
(0294) 	   {
(0295) 	     if((pb_state&(1<<i))==0)
    00FC E001      LDI	R16,1
    00FD 2F14      MOV	R17,R20
    00FE 940E11AC  CALL	lsl8
    0100 9020008F  LDS	R2,_pb_state
    0102 2220      AND	R2,R16
    0103 F449      BNE	0x010D
(0296) 		 {
(0297) 		   i2c_public|=1<<i;  //相应位置位
    0104 E001      LDI	R16,1
    0105 2F14      MOV	R17,R20
    0106 940E11AC  CALL	lsl8
    0108 902000F6  LDS	R2,_i2c_public
    010A 2A20      OR	R2,R16
    010B 922000F6  STS	_i2c_public,R2

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -