📄 hptv.s
字号:
.module hptv.c
.area data(ram, con, rel)
_adc_jg::
.blkb 2
.area idata
.byte 0,0
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 0,0
.area data(ram, con, rel)
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile G:\McuControl\hptv.c
.dbsym e adc_jg _adc_jg A[5:5]c
.area lit(rom, con, rel)
_uart_command::
.byte 'P,'O
.byte 'W,'R
.dbsym e uart_command _uart_command A[4:4]kc
.area text(rom, con, rel)
.dbfile G:\McuControl\hptv.c
.dbfunc e Clear_Timer_Close_Machine _Clear_Timer_Close_Machine fV
.even
_Clear_Timer_Close_Machine::
xcall push_gset2
.dbline -1
.dbline 279
; //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()
; {
.dbline 280
; CloseTime_b=0;
clr R2
sts _CloseTime_b,R2
.dbline 281
; CloseTime.Cstime=0;
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
sts _CloseTime+1,R21
sts _CloseTime,R20
sts _CloseTime+2+1,R23
sts _CloseTime+2,R22
.dbline 282
; closetime_min=0;
sts _closetime_min,R2
.dbline 283
; CloseTimeMin_b=0;
sts _CloseTimeMin_b,R2
.dbline -2
L2:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbend
.dbfunc e start_iocheck _start_iocheck fV
; i -> R20
.even
_start_iocheck::
xcall push_gset1
.dbline -1
.dbline 287
; }
;
; void start_iocheck(void) //上电检测io,为0则需要发送状态
; {
.dbline 289
; uchar i;
; pb_state=PINB&0x7f; //保存上电后io状态
in R24,0x16
andi R24,127
sts _pb_state,R24
.dbline 290
; if(pb_state!=0x7f) //第一次检测io
cpi R24,127
breq L4
.dbline 291
; {
.dbline 293
;
; for(i=0;i<6;i++)
clr R20
xjmp L9
L6:
.dbline 294
; {
.dbline 295
; if((pb_state&(1<<i))==0)
ldi R16,1
mov R17,R20
xcall lsl8
lds R2,_pb_state
and R2,R16
brne L10
.dbline 296
; {
.dbline 297
; i2c_public|=1<<i; //相应位置位
ldi R16,1
mov R17,R20
xcall lsl8
lds R2,_i2c_public
or R2,R16
sts _i2c_public,R2
.dbline 298
; }
L10:
.dbline 299
L7:
.dbline 293
inc R20
L9:
.dbline 293
cpi R20,6
brlo L6
.dbline 300
; }
; if((pb_state&(1<<6))==0)
lds R2,_pb_state
sbrc R2,6
rjmp L12
.dbline 301
; {
.dbline 302
; i2c_public|=1<<5;
lds R24,_i2c_public
ori R24,32
sts _i2c_public,R24
.dbline 303
; }
L12:
.dbline 304
L4:
.dbline -2
L3:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbend
.dbfunc e io_check _io_check fV
; i -> R20
.even
_io_check::
xcall push_gset1
.dbline -1
.dbline 308
; }
; //UDR=pb_state;
; }
; void io_check(void) //io状态变化检测函数 0.5s检测一次
; {
.dbline 311
; uchar i;
;
; if(pb_state!=(PINB&0x7f))
in R24,0x16
andi R24,127
lds R2,_pb_state
cp R2,R24
breq L15
.dbline 312
; {
.dbline 313
; pbcheck_num++;
lds R24,_pbcheck_num
subi R24,255 ; addi 1
sts _pbcheck_num,R24
.dbline 314
; }
L15:
.dbline 316
;
; if(pbcheck_num>1) //确认有变化
ldi R24,1
lds R2,_pbcheck_num
cp R24,R2
brlo X0
xjmp L17
X0:
.dbline 317
; {
.dbline 318
; for(i=0;i<6;i++)
clr R20
xjmp L22
L19:
.dbline 319
; {
.dbline 320
; if((pb_state&(1<<i))!=((PINB&(1<<i))))//位比较,相同则调用函数
mov R18,R20
clr R19
ldi R16,1
ldi R17,0
xcall lsl16
in R2,0x16
clr R3
and R2,R16
and R3,R17
lds R4,_pb_state
clr R5
and R4,R16
and R5,R17
cp R4,R2
cpc R5,R3
breq L23
.dbline 321
; {
.dbline 323
;
; i2c_public|=(1<<i); //相应位置位
ldi R16,1
mov R17,R20
xcall lsl8
lds R2,_i2c_public
or R2,R16
sts _i2c_public,R2
.dbline 324
; pb_state=PINB&0x7f; //保存新的状态位
in R24,0x16
andi R24,127
sts _pb_state,R24
.dbline 325
; STATE=(~pb_state)&0x7f;
com R24
andi R24,127
sts _STATE,R24
.dbline 326
; }
L23:
.dbline 327
L20:
.dbline 318
inc R20
L22:
.dbline 318
cpi R20,6
brlo L19
.dbline 328
; }
; if((pb_state&(1<<6))!=(PINB&(1<<6))) //由于i2c_public只有8位第7位单独处理
in R24,0x16
andi R24,64
lds R25,_pb_state
andi R25,64
cp R25,R24
breq L25
.dbline 329
; { //第5位第6位用相同申请项
.dbline 330
; i2c_public|=(1<<5); //相应位置位
lds R24,_i2c_public
ori R24,32
sts _i2c_public,R24
.dbline 331
; pb_state=PINB&0x7f; //保存新的状态位
in R24,0x16
andi R24,127
sts _pb_state,R24
.dbline 332
; STATE=(~pb_state)&0x7f; //
com R24
andi R24,127
sts _STATE,R24
.dbline 333
; }
L25:
.dbline 334
clr R2
sts _pbcheck_num,R2
.dbline 335
L17:
.dbline -2
L14:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbend
.dbfunc e open_machine _open_machine fV
.even
_open_machine::
.dbline -1
.dbline 344
; pbcheck_num=0;
; }
; //UDR=pb_state;
; }
; /*********************************************
; //开机函数
; //此函数用于设置开机时序
;
; *********************************************/
; void open_machine(void)
; {
.dbline 345
; WDR();
wdr
.dbline 347
; //PORTC|=0x38; //pwrbt=1,reset=1,eset_l=1
; pwrbt_count=0;
clr R2
sts _pwrbt_count,R2
.dbline 348
; reset_open_count=0;
sts _reset_open_count,R2
.dbline 349
; vs_on_open_count=0;
sts _vs_on_open_count,R2
.dbline 350
; machine_open_start=1;
ldi R24,1
sts _machine_open_start,R24
.dbline 351
; open_to_close_station=0;
sts _open_to_close_station,R2
.dbline 352
; open_to_close_count=0;
clr R3
sts _open_to_close_count+1,R3
sts _open_to_close_count,R2
.dbline 353
; close_machine_enable=0;
sts _close_machine_enable,R2
.dbline 354
; open_machine_enable=0;
sts _open_machine_enable,R2
.dbline 355
; tv_state=1;
sts _tv_state,R24
.dbline 356
; WDR();
wdr
.dbline 357
; command_2d=0;
sts _command_2d,R2
.dbline 358
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -