📄 hp.lst
字号:
__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 + -