📄 ir.asm
字号:
include "HT1621.inc"
include "chip.inc"
public ir_init,ir_rec01
extern delayX5ms, mcu_iic_send
tmp == 0x30
HEAD_LMAX == 0x5d
HEAD_LMIN == 0x55
HEAD_HMAX == 0x2f
HEAD_HMIN == 0x20
HEAD_RMIN == 0x10 /*重复码高电位的最小值*/
REAP_LOW_MAX == 0x8 /*重复码的结束部分低电位宽度*/
LOG0_MIN == 0x3
LOG0_MAX == 0xa
LOG1_MAX == 0x40
LONG_PRESS_CNT == 0x90 /*遥控器收到LONG_PRESS_CNT次重复码后产生长按键键值,其中最高位为标志位*/
LONG_STEP == 0x20 /*遥控器长按后原键值+LONG_STEP产生新键值*/
org 370
;函数 ir_ini初始化ir接收及发送
ir_init: PROC
clr rec_is ;清除接收成功标志
clr ir_flag
mov a, @0x7 ;TCC选择内部指令时钟
contw
;set p60外部中断引脚
ior ioc6
or a, @0x1;0xdf
iow IOC6
mov a, @0x40 ;set p60 extern interrupt pin
iow ioce
;允许外部中断,屏蔽tcc中断和P6变化中断
mov a, @0x4
iow iocf
;禁止p60内部下拉,设置p60内部上拉
ior iocb
or a, @0x10 ;禁止p60内部下拉
iow iocb
ior iocd
and a, @0b11111110 ;p60内部上拉
iow iocd
nop
ret
ENDP
;--------- tcc interrupt -----------
;外部中断接收ir,下降沿触发中断,定时器记数低电位脉宽
;ir_cnt
ir_rec01: PROC
;ret
inc randomval
jbs rf, 0x2
jmp end_rec ;非外部(ir)中断,退出
jbc rec_is,0x7
jmp end_rec ;等待处理前次接收按键,拒绝接收新键
;bc COMM_PORT,comm_pin ;12.20
clr counter
rec_head_low:
call delayX5ms
inc counter
jbs ir_port,ir_pin
jmp rec_head_low
;bs COMM_PORT,comm_pin ;12.20
mov a,@HEAD_LMAX
sub a,counter
jbc status,c ;if @TIME_IR_HEAD<counter skip
jmp end_rec ;
mov a,@HEAD_LMIN
sub a,counter
jbs status,c
jmp end_rec
clr counter
rec_head_high:
call delayX5ms
inc counter
jbc ir_port,ir_pin
jmp rec_head_high
;bc COMM_PORT,comm_pin ;12.20
mov a,@HEAD_HMAX
sub a,counter
jbc status,c ;if @TIME_IR_HEAD<counter skip
jmp end_rec
mov a,@HEAD_HMIN
sub a,counter
jbs status,c
; jmp end_rec
jmp rep_irkey /*goto receive repeat key */
clr ir_data_high
clr ir_data_low
clr counter
jmp goon_rec
/*接收重复码*/
rep_irkey:
mov a,@HEAD_RMIN
sub a,counter
jbs status,c
jmp end_rec /*错误的重复码*/
clr counter
clr irend_cnt
rep_low:
call delayX5ms
inc counter
jbs ir_port,ir_pin
jmp rep_low
;bs COMM_PORT,comm_pin ;12.20
mov a,@REAP_LOW_MAX
sub a,counter
jbc status,c
jmp end_rec /*err*/
inc repkey_cnt
mov a,@LONG_PRESS_CNT
sub a,repkey_cnt
jbs status,c
jmp end_rec
/*产生重复码*/
mov a,@LONG_STEP
add ir_data_low,a
clr irend_cnt
clr repkey_cnt
jmp real_key
/**/
goon_rec:
mov a,@0x8
mov count8,a
mov a,@0x2
mov count2,a
; clr 0x1f
; clr 0x1e
wait_low:
jbs ir_port,ir_pin
jmp wait_low
;bs COMM_PORT,comm_pin ;12.20
clr counter
wait_high:
call delayX5ms
inc counter
jbc ir_port,ir_pin
jmp wait_high
;bc COMM_PORT,comm_pin ;12.20
mov a,@LOG0_MIN
sub a,counter
jbs status,c
jmp end_rec
mov a,@LOG0_MAX
sub a,counter
jbc status,c
jmp is_log1
is_data:
rrc ir_data_high
jmp a_log_data
is_log1:
mov a,@LOG1_MAX
sub a,counter
jbc status,c
jmp end_rec
bs status,c
jmp is_data
a_log_data:
djz count8 ;if complete a byte then skip
jmp wait_low
;go on receive next byte
mov a,@0x08
mov count8,a
djz count2
jmp mov_high
jbc ir_flag,0x02 ;if(irflag(3)==0) receiveing address else data is received
jmp rec_succ
jmp check_addr
mov_high:
mov a,ir_data_high
mov ir_data_low,a
jmp wait_low
;addr接收成功,比较addr与预定遥控器是否相同
;加入比较程序,比较如果相同,进入数据接收状态
check_addr:
mov a,@IR_ADDR_LOW
sub a,ir_data_low
jbs status,z ;if(ir_data_low==@IR_ADDR_LOW) skip else ir-low-address is err
jmp end_rec
mov a,@IR_ADDR_HIGH
sub a,ir_data_high
jbs status,z ;if(ir_data_high==@IR_ADDR_HIGH) skip else ir-high-address is err
jmp end_rec
;go on receive ir data and ndata
mov a,@rec_ir_data ;set receive irHead addr low byte
mov ir_flag,a
jmp goon_rec
rec_succ: /*接收完成一个irkey,判断是否有长按,如果没有则送出键值*/
mov a,ir_data_low
;add a,@0x1
;call convert_irkey
;mov TmpA,a
;jbc TmpA,0x0
;jmp cnt_long_press
real_key:
mov a,@rec_is_ok ;12.20 mark
mov rec_is,a ;12.20 mark
jmp end_rec
cnt_long_press:
clr repkey_cnt
bs repkey_cnt,0x7 ;设置长按计数标志位
clr irend_cnt
jmp end_rec
end_rec:
mov a,@0x0
mov ir_flag,a
mov a,rf
and a,@0x00
mov rf,a ;clear extern int flag
/*
jbs rec_is, 0x7
reti
mov a, @0x01
mov iic_sendcom, a
mov a, ir_data_low
mov iic_senddata, a
call mcu_iic_send
clr rec_is ;清除接收成功标志
*/
reti
ENDP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -