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

📄 jsv1.0.asm

📁 avr单片机mega8 控制一体化调谐器fi1256实现宽频接收
💻 ASM
📖 第 1 页 / 共 2 页
字号:

;2005.10.10
	.include "m8def.inc"
	.equ	start=$a4	;开始控制字
	.equ	stop=$94	;停止控制字
	.equ	ack=$c4		;应答控制字
	.equ	nack=$84	;无应答控制字
	
	
	.dseg

ch:	.byte	1		;频道号缓存
mhzh:	.byte	1		;接收频率字缓存H
mhzl:	.byte	1		;接收频率字缓存L
lcdadd:	.byte	1		;提示代码储存地址
mode:	.byte	1		;模式控制字		
keyno1:	.byte	1		;按键次数缓存
keyda:  .byte	1		;按键值
fradd: 	.byte	1		;频率扫描速度因子
	
	.cseg
	
	.org	$000
	rjmp	reset
	
	.org	$013
reset:	ldi	r31,high(RAMEND)
	out	sph,r31
	ldi	r31,low(RAMEND)
	out	spl,r31
	
	ldi	r16,$00
	out	ddrb,r16	;PB口设为输入
	ldi	r16,$ff
	out	portb,r16	;PB口打开上拉
	out	ddrd,r16	;PD口为输出(LCD数据)
	ldi	r16,$3f	
	out	ddrc,r16	;PC口为输出(I2C+LCD控制)
	ldi	r16,$30	
	out	portc,r16	;PC口5、4位上拉(I2C)
	ldi	r16,$04
	out	twcr,r16	;I2C使能
	ldi	r16,200
	out	twbr,r16	;I2C分频系数
	ldi	r16,$3c		;液晶显示器初始化
	call	wcom
	ldi	r16,$0e
	call	wcom
	ldi	r16,$06
	call	wcom
	ldi	r16,$01	
	call	wcom
;****************************************************************

s1:	clr	r16		;开机频道为0,模式为0
	sts	ch,r16		;频道号送入缓存
	sts	mode,r16	;模式号送入缓存
s4:	call	mhss		;根据频道号读频率字15H,14H
	sts	mhzl,r14	;将频率字低字节送入缓存
	ldi	r16,$7f
	and	r15,r16	
	sts	mhzh,r15	;将频率字高字节送入缓存
s6: 	call	lcd16		;显示频道信息
	call	i2cwr		;将频率字送入接收机
s5:	call	lcd32		;显示提示信息
s2:	call	key
	ldi	r31,high(S3)
	ldi	r30,low(S3)	
	lds	r16,mode
	ldi	r17,3
	cp	r16,r17
	brlo	s7
	clr	r18
	sts	mode,r18
s7:	mul	r16,r17
	lds	r16,keyda
	cp	r16,r17
	brsh	s2
	add	r16,r0
	clr	r17
	add	r30,r16
	adc	r31,r17
	ijmp
S3:	rjmp	K1
	rjmp	K2
	rjmp	K3
	
	rjmp	K4
	rjmp	K5
	rjmp	K6
 	
	rjmp	K7
	rjmp	k8
	rjmp	K9
	



;***********************************************
;       接收频道加1
;***********************************************
K1:	lds	r17,ch		;频道加1
	inc	r17
	cpi	r17,100
	brlo	k1a
	clr	r17
k1a:	sts	ch,r17
	rjmp	S4
;***************************************************
;       接收频道减1
;***************************************************
K2:	lds	r17,ch		;频道减1
	dec	r17
	cpi	r17,100
	brlo	k2a
	ldi	r17,99
k2a:	sts	ch,r17
	rjmp	S4
;****************************************************
;	切换为模式2
;****************************************************	
K3:	ldi	r17,1
	sts	mode,r17
	rjmp	S6

;****************************************************
;       接收频率加1
;****************************************************
K4:	lds	r19,mhzh	;频率值加1
	lds	r18,mhzl
	ldi	r16,$1
	clr	r17
	add	r18,r16
	adc	r19,r17
	cpi	r19,$80
	brlo	k4a
	ldi	r19,$0d
	clr	r18
k4a:	sts	mhzh,r19
	sts	mhzl,r18
	rjmp	S6
;*****************************************************
;	接收频率减1
;*****************************************************
K5:	lds	r19,mhzh	;频率值减1
	lds	r18,mhzl
	ldi	r16,$1
	clr	r17
	sub	r18,r16
	sbc	r19,r17
	cpi	r19,$0d
	brsh	k5a
	ldi	r19,$7f
	ser	r18
k5a:	sts	mhzh,r19
	sts	mhzl,r18
	rjmp	S6
;********************************************************
;	切换为模式3,如频率值有变可保存,可改变保存位置
;*********************************************************
k6y:	clr	r17
	sts	fradd,r17
	lds	r17,mode
	inc	r17
	cpi	r17,3
	brlo	k6y1
	clr	r17
k6y1:	sts	mode,r17
	rjmp	S6	

k6:	call	mhss		;根据频道号读频率字15h,14h
	lds	r19,mhzh
	lds	r18,mhzl
	cp	r14,r18
	cpc	r15,r19
	breq	k6y		;比较频率值是否变化,没有变化退出
	ldi	r16,$60
	sts	lcdadd,r16	
	call	lcd32		;提示是否保存新值
k6a:	call	key
	ldi	r31,high(k6b)
	ldi	r30,low(k6b)	
	lds	r16,keyda
	clr	r17
	add	r30,r16
	adc	r31,r17
	ijmp
k6b:	rjmp	k6c	
	rjmp	s4
	rjmp	s6

k6c:	ldi	r16,$70		;+键确认须保存并显示提示
	sts	lcdadd,r16
	call	lcd32

k6h:	call	key
	ldi	r31,high(k6d)
	ldi	r30,low(k6d)	
	lds	r16,keyda
	clr	r17
	add	r30,r16
	adc	r31,r17
	ijmp
k6d:	rjmp	k6f	
	rjmp	k6g
	rjmp	k6e

k6e:	sbic	eecr,eewe	;保存原频道号频率新值
	rjmp	k6e
	clr	r17
	out	eearh,r17
	lds	r17,ch
	lsl	r17
	out	eearl,r17	
	lds	r18,mhzl
	out	eedr,r18	;保存低字节
	sbi	eecr,eemwe
	sbi	eecr,eewe

k6e1:	sbic	eecr,eewe
	rjmp	k6e1
	inc	r17
	out	eearl,r17
	lds	r19,mhzh
	out	eedr,r19	;保存高字节
	sbi	eecr,eemwe
	sbi	eecr,eewe
	rjmp	s6

k6f:	lds	r17,ch		;+键 频道加1
	inc	r17
	cpi	r17,100
	brlo	k6f1
	clr	r17
k6f1:	sts	ch,r17
	call	lcd16
	rjmp	k6h		;返回键检测

k6g:	lds	r17,ch		;-键 频道-1
	dec	r17
	cpi	r17,100
	brlo	k6g1
	ldi	r17,99
k6g1:	sts	ch,r17
	call	lcd16		
	rjmp	k6h		;返回键检测



;**********************************************************
;	接收频率向上扫描,可停止,加速或减速扫描
;************************************************************
k7e:	in	r16,pinb
	ori	r16,$f1
	cpi	r16,$ff
	brne	k7e		;等待按键放开
k7:	lds	r17,fradd
	ldi	r16,125
	add	r17,r16
k7a:	in	r16,pinb	;检查是否有键按下
	ori	r16,$f1
	cpi	r16,$ff
	breq	k7c		;无键返回扫描
	call	yss		;廷时去抖动
	in	r16,pinb
	ori	r16,$f1
	cpi	r16,$ff
	breq	k7c		;干扰返回扫描
	sbis	pinb,3
	rjmp	s5		;确定键退出
	sbis	pinb,1
	rjmp	k7d		;-键 减速扫描
	sbic	pinb,2
	rjmp	k7c		;无效键返回扫描
	
	lds	r16,fradd	;+键 加速扫描
	subi	r16,12
	sts	fradd,r16
	rjmp	k7e

k7d:	lds	r16,fradd	;-键 减速扫描
	subi	r16,-12
	sts	fradd,r16
	rjmp	k7e

k7c:	call	yss
	dec	r17
	brne	k7a
	lds	r19,mhzh	;频率值加1
	lds	r18,mhzl
	ldi	r16,$1
	clr	r17
	add	r18,r16
	adc	r19,r17
	cpi	r19,$80
	brlo	k7b
	ldi	r19,$0d
	clr	r18
k7b:	sts	mhzh,r19
	sts	mhzl,r18
	call	lcd16
	call	i2cwr
	call	lcd32
	rjmp	k7



;**********************************************************
;	接收频率向下扫描,可停止,加速或减速扫描
;************************************************************
k8e:	in	r16,pinb
	ori	r16,$f1
	cpi	r16,$ff
	brne	k8e		;等待按键放开
k8:	lds	r17,fradd
	ldi	r16,125
	add	r17,r16
k8a:	in	r16,pinb	;检查是否有键按下
	ori	r16,$f1
	cpi	r16,$ff
	breq	k8c		;无键返回扫描
	call	yss		;廷时去抖动
	in	r16,pinb
	ori	r16,$f1
	cpi	r16,$ff
	breq	k8c		;干扰返回扫描

	sbis	pinb,3
	rjmp	s5		;确定键退出
	sbis	pinb,1
	rjmp	k8d		;-键 减速扫描
	sbic	pinb,2
	rjmp	k8c		;无效键返回扫描

	lds	r16,fradd	;+键 加速扫描
	subi	r16,12
	sts	fradd,r16
	rjmp	k8e

k8d:	lds	r16,fradd	;-键 减速扫描
	subi	r16,-12
	sts	fradd,r16
	rjmp	k8e

k8c:	call	yss
	dec	r17
	brne	k8a
	lds	r19,mhzh	;频率值减1
	lds	r18,mhzl
	ldi	r16,$1
	clr	r17
	sub	r18,r16
	sbc	r19,r17
	cpi	r19,$0d
	brlo	k8b
	ldi	r19,$0d
	clr	r18
k8b:	sts	mhzh,r19
	sts	mhzl,r18
	call	lcd16
	call	i2cwr
	call	lcd32
	rjmp	k8

	
	


;********************************************************
;	切换为模式1,如频率值有变可保存,可改变保存位置
;*********************************************************

k9:	rjmp	k6

;*********************************************************************
;
;*********************************************************************
;       根据频道号读频率字15h,14h
;*********************************************************************

mhss:	push	r17
	push	r18
mhss1:	sbic	eecr,eewe	;根据频道读已存频率低字节
	rjmp	mhss1
	clr	r17
	out	eearh,r17
	lds	r18,ch
	lsl	r18
	out	eearl,r18
	sbi	eecr,eere
	in	r14,eedr
	inc	r18
mhss2:	sbic	eecr,eewe	;根据频道读已存频率高字节
	rjmp	mhss2
	out	eearl,r18
	sbi	eecr,eere
	in	r15,eedr
	mov	r17,r15
	cpi	r17,$0d
	brsh	mhss3
mhss4:	sbic	eecr,eewe	;保存原频道号频率新值
	rjmp	mhss4
	ldi	r17,$0d		;保存高字节
	mov	r15,r17
	out	eedr,r17
	sbi	eecr,eemwe
	sbi	eecr,eewe
mhss5:	sbic	eecr,eewe
	rjmp	mhss5
	dec	r18		;保存低字节
	out	eearl,r18
	clr	r17
	mov	r14,r17
	out	eedr,r17
	sbi	eecr,eemwe
	sbi	eecr,eewe
mhss3:	pop	r18
	pop	r17
	ret	
;**********************************************************************


;**********************************************************************
;       写一个命令(r16)到LCD
;**********************************************************************	
wcom:	cbi	ddrd,7		;设为读命令状态
	sbi	portd,7
	cbi	portc,2
	sbi	portc,1
	sbi	portc,0
	nop
wcom1:	sbic	pind,7		;检查忙状态
	rjmp	wcom1
	cbi	portc,0		;设为写命令状态
	cbi	portd,7
	sbi	ddrd,7
	cbi	portc,1
	out	portd,r16
	sbi	portc,0
	nop
	nop
	nop
	cbi	portc,0
	ret
;***********************************************************************	


;***********************************************************************	
;       写一个数据(r16)到LCD
;***********************************************************************
wdata:	cbi	ddrd,7		;设为读命令状态
	sbi	portd,7
	cbi	portc,2
	sbi	portc,1
	sbi	portc,0
	nop
wdata1:	sbic	pind,7		;检查忙状态
	rjmp	wdata1
	cbi	portc,0		;设为写数据状态
	cbi	portd,7
	sbi	ddrd,7
	sbi	portc,2
	cbi	portc,1
	out	portd,r16
	sbi	portc,0
	nop
	nop
	nop
	cbi	portc,0

⌨️ 快捷键说明

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