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

📄 main.asm

📁 ELAN IR接收
💻 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 + -