📄 main.asm
字号:
include "chip.inc"
include "HT1621.inc"
include "iic.inc"
include "Key.inc"
extern delay_4us, lcd_sendcomm, Panel_init, output_tone
extern ir_init,ir_rec01, mcu_iic_recv, lcd_wr_data
public delayX64us, delay_long, delayX5ms
extern set_lcd_light, clear_lcd_light, test_lcd_light
extern delay_10us
extern mcu_iic_send, chk_iic_send
org 0x00
jmp main
;定义中断处理程序
org 0x08
jmp ir_rec01
;防止意外出错,可删去
org 0x3ff
jmp main
;程序开始
org 0x09
;初始化
init_sys: PROC
;设置P5_0为输入(usb_det),P5的其他端口为输出
ior IOC5
and a, @0xf0
or a, @0x01 ;设置P5_0为输入
iow IOC5
;ior iocb
;and a, @0xde ;@0xf8
;iow iocb
;设置P5_0为下拉(usb_det),P5的其他端口为上拉
;设置P6_0~~P6_3为上拉
ior iocb
and a, @0xfe
iow iocb
;设置P6_0,P6_4,P_5为输入,P6的其他端口为输出
ior ioc6
and a, @0x31
iow ioc6
;设置P6_4,P6_5禁止内部上拉,P6的其他端口使能内部上拉
ior iocd
and a, @0x30
iow iocd
;初始化lcd控制的三线为高
bs PORT5, LCD_WT
bs PORT6, LCD_CS
bs PORT6, LCD_DATA
;初始化SPI三线为高
bs clk_port, iic_clk
bs data_port, IIC_DATA
bs cs_port, IIC_CS
;打开解码电源
bc ctrl_port, dmp_pin
;设置解码开关电源标志位打开
mov a, @0x01
mov pwr_on_off, a
;初始化usb复位电平为高
bs light_port, light_pin
;设置usb工作标志位为没工作
mov a, @0x00
mov usb_status, a
;初始化密码校验的随机变量
mov a, @0x00
mov randomval, a
;初始化密码接受正确,错误计数变量
mov a, @0x00
mov password_ok, a
mov password_err, a
mov a, @0x00
mov Tmpa, a
mov Tmpb, a
;
mov a, @0x00
mov curr_play_state, a
ret
ENDP
delayX64us: PROC
mov a, @DELAY_64MS
mov delay, a
do_delay:
djz delay
jmp do_delay
ret
ENDP
delayX10ms: PROC
mov a, @DELAY_10MS
mov delay_10, a
do_delay10ms:
call delayX64us
djz delay_10
jmp do_delay10ms
ret
ENDP
delay_long: PROC
mov a, @0xff;@0x20
mov tone_delay, a
tone_delay_cycle:
call delayX64us
djz tone_delay
jmp tone_delay_cycle
ret
ENDP
;轮循方式检测usb存在的函数
scan_usb_status:PROC
;监测usb_det脚上的电平,高为usb接通
jbs usb_port, usb_pin ;if usb plug in then skip
jmp usb_low_chk
usb_high_chk:
;去抖动,防止检测错误
call delayX10ms
jbs usb_port, usb_pin
jmp end_scan_usb_status
;当前usb接通,判断是否发生工作状态变化
jbc usb_status, 0x00
jmp end_scan_usb_status
;工作状态变化, 关解码电源,设置解码电源开关标志
bs ctrl_port, dmp_pin
call delayX10ms
mov a, @0x00
mov pwr_on_off, a
;禁止检查密码
mov a, @0x00
mov en_password_chk, a
;清密码校验变量
mov a, @0x00
mov password_ok, a
mov password_err, a
;输出复位信号,启动gl811
;call delayX10ms
;bs usb_rstport,usb_rstpin
;call delayX10ms
;bc usb_rstport,usb_rstpin
;call delayX10ms
;bs usb_rstport,usb_rstpin
;设置usb工作状态为工作
mov a, @0x01
mov usb_status, a
jmp end_scan_usb_status
usb_low_chk:
;去抖动,防止检测错误
call delayX10ms
jbc usb_port, usb_pin
jmp end_scan_usb_status
;当前无usb接入,检查是否变化工作状态
jbs usb_status, 0x00
jmp end_scan_usb_status
;打开解码电源,设置解码电源工作状态为开启
bc ctrl_port, dmp_pin
call delayX10ms
mov a, @0x01
mov pwr_on_off, a
;禁止检查密码
mov a, @0x00
mov en_password_chk, a
;清密码校验变量
mov a, @0x00
mov password_ok, a
mov password_err, a
;设置usb工作状态为停止
mov a, @0x00
mov usb_status, a
call delayX10ms
end_scan_usb_status:
ret
ENDP
;密码对照表
getpasswordval: PROC
add PC, a
retl @0x00 ;0x00
retl @0x01 ;0x01
retl @0x02 ;0x02
retl @0x03 ;0x03
retl @0x04 ;0x04
retl @0x05 ;0x05
retl @0x06 ;0x06
retl @0x07 ;0x07
retl @0x08 ;0x08
retl @0x09 ;0x09
retl @0x0a ;0x0a
retl @0x0b ;0x0b
retl @0x0c ;0x0c
retl @0x0d ;0x0d
retl @0x0e ;0x0e
retl @0x0f ;0x0f
retl @0x10 ;0x10
retl @0x11 ;0x11
retl @0x12 ;0x12
retl @0x13 ;0x13
retl @0x14 ;0x14
retl @0x15 ;0x15
retl @0x16 ;0x16
retl @0x17 ;0x17
retl @0x18 ;0x18
retl @0x19 ;0x19
retl @0x1a ;0x1a
retl @0x1b ;0x1b
retl @0x1c ;0x1c
retl @0x1d ;0x1d
retl @0x1e ;0x1e
retl @0x1f ;0x1f
retl @0x20 ;0x20
retl @0x21 ;0x21
ENDP
delayX5ms: PROC
mov a, @DELAY_64MS
mov key_delay, a
do_key_delay:
djz key_delay
jmp do_key_delay
ret
ENDP
read_key: PROC
jbc rec_is, 0x7
jmp end_read
call scan_keyboard
mov a, tmpb
sub a, tmpa
jbc status, z
jmp end_read
mov a, tmpa
mov tmpb, a
mov tmpa, tmpa
jbc status, z ;if(tmpa==0x0) skip
jmp end_read
mov a, @0x03
sub a, tmpa
jbc status, z
jmp end_read
;去抖动
call delayX64us
call delayX64us
call delayX64us
call delayX64us
call scan_keyboard
mov a, tmpa
sub a, tmpb
jbs status, z
jmp end_read
set_key:
mov a, tmpb
call key_convert
mov tmpa, a
mov ir_data_low, a
mov a, @rec_is_ok
mov rec_is, a
end_read:
nop
ret
ENDP
scan_keyboard: PROC
mov a, @SEED_KEY
xor a, key_port
and a, @SEED_KEY
mov TmpA, a
swap TmpA
ret
ENDP
Key_convert: PROC
add PC, a
retl @NO_KEY
retl @SEL_YES_KEY
retl @COPY_NO_KEY
retl @NO_KEY
ENDP
;主函数
main: PROC
call init_sys ;初始化mcu
call ir_init ;初始化ir
call delayX64us
call Panel_init ;初始化lcd屏
call set_lcd_light
call delayX64us
call output_tone
call clear_lcd_light ;清lcd屏
eni ;使能中断,接受ir
;主循环
loop:
call read_key
call chk_iic_send ;监测ir接受就绪,并发送
jbc rec_is, 0x6
call output_tone
;循环查询lcd各个点的状态,查询32个地址点的信息,
;该信息由6425保存,设置。
mov a, @0x20
mov comm_tmp, a
;循环查询lcd点状态开始
recv_send:
;is_iic_recved是正确接受标志,mcu发送8位接受地址后,6425在
;接下来的两个clk将发送10,mcu根据是否正确接受10来判断,6425
;是否在工作以及数据传输的正确性
clr is_iic_recved ;在接受地址信息前,清正确接受标志
;randomval: 变化为加密功能服务的变量
inc randomval
;判断当前解码电源的工作状态,如果当前的解码没有工作,则
;跳到清lcd屏的处理
jbs pwr_on_off, 0x00
jmp no_recved_data_proc
;接收地址点的信息
mov a, comm_tmp
mov iic_recvindex, a
dec iic_recvindex
call mcu_iic_recv
call delayX64us
;监测ir接受就绪,并发送,多次调用,避免按键延时
call read_key
call chk_iic_send
jbc rec_is, 0x6
call output_tone
;判断正确接受标志,与解码电源状态标志配合,影响lcd屏显示
jbs is_iic_recved, 0x00
jmp no_recved_data_proc
;如果可以正确接受,允许接受加密信息
mov a, @0x01
mov en_password_chk, a
;用接受的屏点信息,设置lcd屏的显示
mov a, comm_tmp
mov ht1621_wr_addr, a
dec ht1621_wr_addr
mov a, iic_recvdata
mov ht1621_wr_data, a
call lcd_wr_data
call delayX64us
;监测ir接受就绪,并发送,多次调用,避免按键延时
call read_key
call chk_iic_send
jbc rec_is, 0x6
call output_tone
call delayX64us
end_set_lcd_data:
djz comm_tmp
jmp recv_send ;循环查询lcd点状态结束
call scan_usb_status ;监测usb状态
;判断是否允许加密信息检测
jbs en_password_chk, 0x00
jmp go_next_loop
;判断当前解码电源标志,如果解码关闭,则不检测加密信息
jbs pwr_on_off, 0x00
jmp go_next_loop
;开始检测加密信息
;取随机数的低5位0~~31
;发给6425的信息应再加上32,从32~~63
;passwordval,保存随机数
;wwj_chk_temp, 保存要发送给6425的信息
mov a, randomval
and a, @0x1F
mov passwordval, a
mov wwj_chk_temp, a
mov a, @0x20
add a, passwordval
mov wwj_chk_temp, a
;从6425读取加密信息
call delayX64us
mov a, wwj_chk_temp
mov iic_recvindex, a
call mcu_iic_recv
call delayX64us
;得到加密对照表的信息
mov a, passwordval
call getpasswordval
mov passwordval, a
;对比加密信息,跳到错误或正确处理
mov a, iic_recvdata
sub a, passwordval
jbs status, z
jmp password_error_proc
jmp password_ok_proc
go_next_loop:
;播放检测开始
call delayX64us
mov a, @0x40
mov iic_recvindex, a
call mcu_iic_recv
call delayX64us
mov a, iic_recvdata
jbs iic_recvdata, 0x00
jmp proc_play_light
bc light_port, light_pin
mov a, @0x01
mov curr_play_state, a
end_play_light_chk:
;播放检测结束
nop
jmp loop ;主循环结束
proc_play_light:
bs light_port, light_pin
mov a, @0x00
mov curr_play_state, a
jmp end_play_light_chk
;lcd地址信息接收错误处理
no_recved_data_proc:
;如果接受lcd地址信息出错,禁止检查密码,用于解码断电情况
mov a, @0x00
mov en_password_chk, a
;如果接受lcd地址信息出错,清空密码出错计数变量,清空密码正
;确计数变量
mov a, 0x00
mov password_err, a
mov password_ok, a
mov a, comm_tmp
sub a, @0x1d
jbc status, z
jmp usb_flag_show
;清此地址信息对应的lcd屏上的点
error_clear_lcd_dot:
mov a, comm_tmp
mov ht1621_wr_addr, a
dec ht1621_wr_addr
mov a, @0x00
mov ht1621_wr_data, a
call lcd_wr_data
jmp end_set_lcd_data
usb_flag_show:
jbs usb_status, 0x00
jmp error_clear_lcd_dot
mov a, comm_tmp
mov ht1621_wr_addr, a
dec ht1621_wr_addr
mov a, @0x02
mov ht1621_wr_data, a
call lcd_wr_data
jmp end_set_lcd_data
;加密密码出错处理
password_error_proc:
;密码错误计数加一
inc password_err
;如果之前有10次正确的,则6次出错关机
;如果之前不到10此正确,则3次出错关机
mov a, password_ok
sub a, @0x0a
jbc status, z
jmp pass_word_time_5
;判断是否出错3次
pass_word_time_2:
mov a, password_err
sub a, @0x03
jbs status, z
jmp go_next_loop
;3次出错,清变量,关机,设置解码电源状态标志
mov a, @0x00
mov password_ok, a
mov password_err, a
bs ctrl_port, dmp_pin
mov a, @0x00
mov pwr_on_off, a
jmp go_next_loop
;判断是否出错6次
pass_word_time_5:
mov a, password_err
sub a, @0x6
jbs status, z
jmp go_next_loop
;6次出错,清变量,关机,设置解码电源状态标志
mov a, @0x00
mov password_ok, a
mov password_err, a
bs ctrl_port, dmp_pin
mov a, @0x00
mov pwr_on_off, a
jmp go_next_loop
;加密密码正确处理
password_ok_proc:
;清密码错误计数
mov a, 0x00
mov password_err, a
;如果正确数达到10返回,否则正确数加一
mov a, password_ok
sub a, @0x0a
jbc status, z
jmp go_next_loop
inc password_ok
jmp go_next_loop
ENDP ;主函数结束
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -