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

📄 jsv1.0.asm

📁 avr单片机mega8 控制一体化调谐器fi1256实现宽频接收
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	ret
;************************************************************************
	
;************************************************************************
;       显示上一行
;************************************************************************	
lcd16:	push	r14
	push	r15
	push	r16
	push	r17
	push	r18
	push	r19
	push	r20
	ldi	r16,$2
	call	wcom
	ldi	r16,'C'
	call	wdata
	ldi	r16,'H'
	call	wdata
	lds	r17,ch
	call	b8td2
	ldi	r20,$30
	add	r16,r20
	call	wdata
	mov	r16,r17
	add	r16,r20
	call	wdata
	ldi	r16,$20
	call	wdata
	call	wdata
	call	wdata
	
	lds	r17,mhzh
	lds	r16,mhzl
	clr	r19
	ldi	r18,40
	call	div16u
	call	b16td5
	
	mov	r13,r16
	ldi	r20,$30
	cpi	r19,0
	brne	lcdp2
	ldi	r16,$20
	call	wdata
	cpi	r18,0
	brne	lcdp3
	ldi	r16,$20
	call	wdata
	cpi	r17,0
	brne	lcdp4
	ldi	r16,$20
	call	wdata
	rjmp	lcdp5
lcdp2:	add	r19,r20
	mov	r16,r19
	call	wdata
lcdp3:	add	r18,r20
	mov	r16,r18
	call	wdata	
lcdp4:	add	r17,r20
	mov	r16,r17
	call	wdata
lcdp5:	add	r13,r20
	mov	r16,r13
	call	wdata
	ldi	r16,'.'
	call	wdata

	;余数乘10除40取小数1
	mov	r16,r14
	ldi	r17,10
	call	mpy8u
	mov	r16,r17
	mov	r17,r18
	clr	r19
	ldi	r18,40
	call	div16u
	ldi	r17,$30
	add	r16,r17
	call	wdata	
	;余数乘10除40取小数2
	mov	r16,r14
	ldi	r17,10
	call	mpy8u
	mov	r16,r17
	mov	r17,r18
	clr	r19
	ldi	r18,40
	call	div16u
	ldi	r17,$30
	add	r16,r17
	call	wdata	
	;余数乘10除40取小数3
	mov	r16,r14
	ldi	r17,10
	call	mpy8u
	mov	r16,r17
	mov	r17,r18
	clr	r19
	ldi	r18,40
	call	div16u
	ldi	r17,$30
	add	r16,r17
	call	wdata	

	ldi	r16,$20
	call	wdata
	pop	r20
	pop	r19
	pop	r18
	pop	r17
	pop	r16
	pop	r15
	pop	r14
	ret
;***********************************************************************
;***********************************************************************
;       显示下一行                                                        
;***********************************************************************
lcd32:	push	r0
	push	r1
	push	r16
	push	r17
	push	r30
	push	r31
	ldi	r16,$c0
	call	wcom
	ldi	r31,high(lcddata*2)
	ldi	r30,low(lcddata*2)
	lds	r16,mode
	swap	r16	
	ldi	r17,3
	mul	r16,r17
	mov	r16,r0
	clr	r17
	add	r30,r16
	adc	r31,r17
	lds	r16,lcdadd
	add	r30,r16
	adc	r31,r17
	ldi	r17,$10
lcdpc1:	lpm	r16,z+
	call	wdata
	dec	r17
	brne	lcdpc1
	pop	r31
	pop	r30
	pop	r17
	pop	r16
	pop	r1
	pop	r0
	ret
;**********************************************************************

;***********************************************************************
;      送频率字到接收机
;***********************************************************************
	
i2cwr:	push	r21
	push	r16		;i2c指定地址写
	push	r17
	push	r18
	push	r19
	push	r20
	ldi	r21,$5		;设定写出错重试次数
i2cw3:	ldi	r17,start	;发起始信号
	out	twcr,r17
	call	wite		;读应答字
	cpi	r16,$08		;比较应答字
	brne	i2cw2		;出错转移
	ldi	r17,$c0		;发器件地址c0
	out	twdr,r17
	ldi	r17,nack	;发应答控制字
	out	twcr,r17
	call	wite		;读应答字
	cpi	r16,$18		;比较应答字
	brne	i2cw2		;出错转移
	lds	r17,mhzh	;发送数据
	andi	r17,$7f		;首位处理
	mov	r19,r17		;暂存
	out	twdr,r17	;发送频率高字节
	ldi	r17,nack	;发应答控制字
	out	twcr,r17
	call	wite		;读应答字
	cpi	r16,$28		;比较应答字
	brne	i2cw2		;出错转移
	lds	r17,mhzl	;发送频率低字节		
	mov	r18,r17		;暂存
	out	twdr,r17
	ldi	r17,nack	;发应答控制字
	out	twcr,r17
	call	wite		;读应答字
	cpi	r16,$28		;比较应答字
	brne	i2cw2		;出错转移
	ldi	r17,$8a		;发送控制字8a
	out	twdr,r17
	ldi	r17,nack	;发应答控制字
	out	twcr,r17
	call	wite		;读应答字
	cpi	r16,$28		;比较应答字
	brne	i2cw2		;出错转移
	ldi	r16,$1d		;根据频率值选择波段<r16,r20
	ldi	r20,$1a
	ldi	r17,$a0		;低波段控制字a0
	cp	r18,r16
	cpc	r19,r20
	brlo	i2cw1
	ldi	r16,$5c		;根据频率值选择波段>r16,r20
	ldi	r20,$3d
	ldi	r17,$30		;高波段控制字30
	cp	r18,r16
	cpc	r19,r20
	brsh	i2cw1
	ldi	r17,$90		;中波段控制字90
i2cw1:	out	twdr,r17
	ldi	r17,nack	;发应答控制字
	out	twcr,r17
	call	wite		;读应答字
	cpi	r16,$28		;比较应答字
	brne	i2cw2		;出错转移
	ldi	r21,$5		;设定读出错重试次数
	rjmp	i2cr1
i2cw4:	rjmp	i2cw3	
i2cw2:	ldi	r17,stop	;发停止信号
	out	twcr,r17
	dec	r21
	brne	i2cw4
	ldi	r17,$20
	sts	lcdadd,r17
	rjmp	i2cr2		;退出	

	
i2cr3:	ldi	r17,stop	;发停止信号
	out	twcr,r17
	dec	r21
	breq	i2cr1
	ldi	r17,$10
	sts	lcdadd,r17
	rjmp	i2cr2		;退出	


i2cr1:	ldi	r17,start	;发重起始信号
	out	twcr,r17
	call	wite		;读应答字
	cpi	r16,$10		;比较应答字
	brne	i2cr3		;出错转移
	ldi	r17,$c1		;发器件地址(读)c1
	out	twdr,r17
	ldi	r17,nack	;发应答控制字
	out	twcr,r17
	call	wite		;读应答字
	cpi	r16,$40
	brne	i2cr3		;出错转移
	ldi	r17,nack	;接收数据发NACK
	out	twcr,r17
	call	wite		;读应答字
	cpi	r16,$58		;比较应答字
	brne	i2cr3		;出错转移
	in	r16,twdr	;读控制字
	ldi	r17,stop	;发停止信号
	out	twcr,r17
	bst	r16,6
	brtc	i2cr3
	ldi	r17,$00
	sts	lcdadd,r17	
i2cr2:	pop	r20
	pop	r19
	pop	r18
	pop	r17
	pop	r16
	pop	r21
	ret
;**************************************************************	
;************************************************
;	检测I2C发送完毕
;************************************************
wite:	in	r17,twcr
	bst	r17,7
	brtc	wite		
	in	r16,twsr
	andi	r16,$f8
	ret
;************************************************


;******************************************************
;        廷时子程序
;*****************************************************
yss:	push	r0
	push	r20
	clr	r0
	ldi	r20,7
w1:	dec	r0
	brne	w1
	dec	r20
	brne	w1
	pop	r20
	pop	r0
	ret
;*****************************************************

;*****************************************************************
;	按键处理子程序
;*****************************************************************
key:	push	r16
	push	r17	
keya:	in	r16,pinb	
	ori	r16,$f1
	cpi	r16,$ff
	breq	keya		;无按键继续检测
	call	yss		;延时去抖动
	in	r16,pinb
	ori	r16,$f1
	cpi	r16,$ff
	breq	keya		;干扰继续检测
	clr	r16,
	sbis	pinb,2		;不是+键跳行
	rjmp	keyb
	ldi	r16,1		
	sbis	pinb,1		;不是-键跳行
	rjmp	keyb	
	ldi	r16,2
	sbic	pinb,3		;不是功能键跳行	
	rjmp	keya
keyb:	sts	keyda,r16
keyc:	in	r17,pinb	;等待按键放开
	ori	r17,$f1
	cpi	r17,$ff
	brne	keyc
	pop	r17
	pop	r16
	ret			;退出
;*****************************************************************



;**********************************************************************************
;		 数学运算子程序
;**********************************************************************************
	;4.2.1.1 mpy8u 8 位*8 位无符号乘法
	;1 程序功能r16 (被乘数)* r17(乘数) r18 r17(结果)
	;该子程序是将两个寄存器r16 和r17 相乘结果送至寄存器r18 和r17
;********************************************************************
mpy8u: 		;8 位*8 位无符号乘法
	clr 	r18 		;清结果高字节
	ldi 	r19,8 		;初始化循环计数器
	lsr 	r17 		;乘数循环
m8u_1:
	brcc 	m8u_2 		;进位置位
	add 	r18,r16 	;加被乘数到结果高字节
m8u_2:
	ror 	r18 		;结果高字节右循环
	ror 	r17 		;结果低字节和乘数右循环
	dec 	r19 		;循环计数器减1
	brne 	m8u_1 		;如没完成再循环
	ret


;**********************************************************************************
	;4.3.1 b16td5 16 位二进制转换成BCD 码
	;1 程序功能将r17 r16 中16 位二进制转换成BCD 码个十百千和分别
	;存放于r16 r17 r18 r19 中
	;程序思想r17 r16-1000  够减Y 次则千位为Y 差值100 够减Z 次则百位为Z 
	;差值10 够减U 次则十位为U 差值为个位
;***********************************************************************************
b16td5:	ser 	r19 		;r19 先送1
b16td5_2:
	inc 	r19 		;r19 增1
	subi 	r16,low(1000) 	; r17 r16 10000
	sbci 	r17,high(1000)
	brcc 	b16td5_2 	;够减则返回b16td5_2
	subi 	r16,low(-1000) 	;不够减+1000 恢复余数
	sbci 	r17,high(-1000)
	ser 	r18 		;r18 先送1
b16td5_3:
	inc 	r18 		;r18 增1
	subi 	r16,low(100) 	; r17 r16 100
	sbci 	r17,high(100)
	brcc 	b16td5_3 	;够减则返回b16td5_3
	subi 	r16,low(-100) 	;不够减+100 恢复余数
	sbci 	r17,high(-100)
	ser 	r17 		;r17 先送1
b16td5_4:
	inc 	r17 		;r17 增1
	subi 	r16,10 		; r17 r16 10
	brcc 	b16td5_4 	;够减则返回b16td5_4
	subi 	r16,-10 	;不够减+10 恢复余数
	ret
;***********************************************************************************	
	
;***********************************************************************************	
	; 8(r17) 位二进制转换成BCD 码(r16,r17)
	
	; 差值10 够减U 次则十位为U 差值为个位   
;************************************************************************************	
b8td2:	ser 	r16 		;r16 先送1                                            
b8td2_1:
	inc 	r16 		;r16 增1
	subi 	r17,10 		; r17-10
	brcc 	b8td2_1 	;够减则返回b8td2_1
	subi 	r17,-10 	;不够减+10 恢复余数
	ret	
;******************************************************************************
	; div16u 16 位/ 16 位无符号除法                                               
	; 程序功能r17 r16 / r19 r18 =r17 r16余 r15 r14
	; 该子程序是将寄存器r17 和r16 的值与寄存器r19 和r18 的值相除结果送至寄存器r17  
	; 和r16 余数送r15 和r14 结果为16 位                                                

;************************************************************************************


div16u: ;16 位/16 无符号除法
	clr 	r14 		;清除余数和进位
	sub 	r15,r15
	ldi 	r20,17 		;初始化循环计数器
d16u_1:
	rol 	r16 		;左移被除数
	rol	r17
	dec 	r20 		; 计数器减1
	brne 	d16u_2 		;不为0 跳至d16u_2
	ret 			;为0 返回
d16u_2:
	rol 	r14 		;左移余数被除数移到除数
	rol 	r15
	sub 	r14,r18 	;余数除数
	sbc 	r15,r19
	brcc 	d16u_3 		;够减跳至d16u_3
	add 	r14,r18 	;不够减再加除数
	adc 	r15,r19
	clc 			;清进位位
	rjmp 	d16u_1
d16u_3:
	sec 			;置进位位
	rjmp 	d16u_1
;************************************************************************************


;*********************************************************************************************
lcddata:
	
	.db	'Y', 'e', 's', ' ', 'L', 'o', 'c', 'k', ' ', ' ', 'C', 'H', ' ', '+', '/', '-'
	.db	'N', 'o', ' ', 'L', 'o', 'c', 'k', ' ', ' ', ' ', 'C', 'H', ' ', '+', '/', '-'
	.db	'B', 'a', 'd', ' ', 'n', 'o', ' ', 'a', 'n', 's', 'v', 'e', 'r', ' ', '.', '.'
	
	.db	'Y', 'e', 's', ' ', 'L', 'o', 'c', 'k', ' ', ' ', 'F', 'R', ' ', '+', '/', '-'
	.db	'N', 'o', ' ', 'L', 'o', 'c', 'k', ' ', ' ', ' ', 'F', 'R', ' ', '+', '/', '-'
	.db	'B', 'a', 'd', ' ', 'n', 'o', ' ', 'a', 'n', 's', 'v', 'e', 'r', ' ', '.', '.'
	
	.db	'Y', 'e', 's', ' ', ' ', 'S', 'c', 'a', 'n', '.', '.', 'P', 'U', '/', 'P', 'D'
	.db	'N', 'o', ' ', ' ', ' ', 'S', 'c', 'a', 'n', '.', '.', 'P', 'U', '/', 'P', 'D'
	.db	'B', 'a', 'd', ' ', 'n', 'o', ' ', 'a', 'n', 's', 'v', 'e', 'r', ' ', '.', '.'
	
	.db	'S', 'a', 'v', 'e', 'F', 'r', 'e', 'q', 'u', 'e', 'n', 'c', 'y', 'Y', '/', 'N'
	.db	'S', 'a', 'v', 'e', 'F', 'R', ' ', ' ', 'C', 'H', ' ', 'S', '/', '+', '/', '-'

	.db	'Y', 'e', 's', ' ', ' ', 'S', 'c', 'a', 'n', '.', '.', 'P', 'U', '/', 'P', 'D'
	
	.db	'S', 'a', 'v', 'e', 'F', 'r', 'e', 'q', 'u', 'e', 'n', 'c', 'y', 'Y', '/', 'N'
	.db	'S', 'a', 'v', 'e', 'F', 'R', ' ', ' ', 'C', 'H', ' ', 'S', '/', '+', '/', '-'








⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -