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

📄 no3a1.asm

📁 AVR-AT90S8535,HD8279,等开发的洁净空调专用DDC系统,包括AD/DA,PID计算等.
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;************* 宏方科技  HFKJAVR.asm  ************************
;*
;* 标题:AT90S8535 集散式洁净空调自动控制系统
;* 版本:	        1.0
;* 最后更新日期:	2002.11.01
;* 支援                 TEL: 8102124 & 8106097
;*
;*************************************************************

.include"8535def.inc"

.def    temp   = r19			;十六进制转换暂存器
.def    count  = r8			;十六进制转换计数器
.def    res1   = r4			;存放结果的十六进制低位
.def    res2   = r5			;存放结果的十六进制高位
.def    cnt1d  = r6			;存放结果的十进制低位
.def    cnt2d  = r7			;存放结果的十进制高位

.org	0x00
.equ	label=$0400
rjmp	RESET		  

.org	INT0addr		;外部中断服务子程序
rjmp	EXT_INT0		

.org	URXCaddr		;UART接收结束
rjmp	UART_RXC

;.org	UDREaddr		;UART数据空		
;rjmp	UART_DRE
      
.org  	UTXCaddr		;UART发送结束
;rjmp	UART_TXC

;.org	0x06			;timerl
;INTTT:	RJMP	TINT 		;
reti

	
.org	0x0020			;
;*****************************
;************中断*************
;*****************************
UART_RXC:			;通讯中断子程序

	push	r16		;压栈
	push	r17
	push	r18
	push	r19
	push	r23
	push	r24
	push	r28
	push	r29
	in	r18,SREG	;保存状态寄存器
loop:	sbic	usr,4		;低电平跳行,高电平帧错误
	rjmp	loop
loop1:	in	r17,udr		;读串口数据到r17
	ldi	r29,$01
	ldi	r28,$4c		;SRAM中站号地址
	ld	r16,y
	cpse	r17,r16		;是本站则跳行
	rjmp	qt		;非本站,退出
	
	
	
	
	mov	r16,r1
	cpi	r16,$00		;本机是否为第一次接收到数据	
	breq	EERead1		;是第一次需验证站号
	rjmp	datapd		;第二次则处理命令
EERead1:sbic	EECR,EEWE	;if EEWE not clear
	rjmp	EERead1
	ldi	r16,$01
	out 	EEARH,r16	;output address high for 8515
	ldi	r16,$c
	out	EEARL,r16	;output address low for 8515
	sbi	EECR,EERE	;set EEPROM Read strobe
	in	r16,EEDR	;get data
	cpse	r17,r16		;比较相等跳行.
	rjmp	qt		;非本站,退出
loop3:	sbis	usr,5		;测试USR第5位发送寄存器是否空
	rjmp	loop3
	out	udr,r16		;是本站,请求发送第二次指令数据
	inc	r1
	
qt:	out	sreg,r18	;退出通讯中断
	
	pop	r29
	pop	r28
	pop	r24
	pop	r23
	pop	r19
	pop	r18
	pop	r17
	pop	r16
	reti

datapd:				;第二次指令数据处理
	cpi	r17,$ff
	brne	tzxml			
	rcall	txdata		;FF指令为上传数据
	clr	r1
	rjmp	qt
tzxml:	cpi	r17,$fe
	brne	tzxml1
	rcall	zxml		;FE指令为执行命令
	clr	r1
	rjmp	qt
tzxml1:	cpi	r17,$fd
	brne	qt
	rcall	xgml		;FD指令为修改参数
	clr	r1
	rjmp	qt	

txdata:				;发送数据
	rcall	txdt		;上传数据
	rcall	txdt
	ret	
zxml:				;执行命令
loop6:	sbis	usr,7		;测试接收寄存器是否为空
	rjmp	loop6		;低电平为空
loop7:	sbic	usr,4		;测试帧是否正确
	rjmp	loop7		;帧错误为高电平
	in	r17,udr	
	
	
	ret	
	
xgml:	ldi	r29,$01		;修改参数子程序
	ldi	r28,$50
xgml0:	sbis	usr,7		;测试接收寄存器是否为空
	rjmp	xgml0		;低电平为空
	in	r17,udr
	st	y+,r17
	cpi	r28,$6e
	brne	xgml0

	ldi	r28,$50
xgml1:	ldd	r17,y+15
	ld	r16,y+
	cpse	r17,r16
	rjmp	xgml2
	cpi	r28,$5f
	brne	xgml1
	ldi	r16,$fd
	sbis	usr,5		;测试USR第5位发送寄存器是否空
	rjmp	xgml2
	out	udr,r16		;接收数据成功,可以修改参数,返回FD
	
	ldi	r28,$40
xgml3:	ldd	r17,y+10
	ld	r16,y+
	cpse	r17,r16
	rjmp	xgml4
xgml5:	cpi	r28,$4f
	brne	xgml3
	;rcall	cansujs		;^^^^^^^^^^^^^^^^^^^^
	ret
xgml4:	mov	r24,r28
	subi	r24,$41		;对应EEP地址为0x0100开始
	mov	r23,r17
	rcall	EEWrite
	dec	r28
	st	y+,r17		;更新SRAM中的EEP参数
	rjmp	xgml5
	
xgml2:	ldi	r16,$fc
	sbis	usr,5		;测试USR第5位发送寄存器是否空
	rjmp	xgml2
	out	udr,r16		;修改参数失败,返回FC	
	ret
	
txdt:	ldi	r29,$01
	ldi	r28,$00
loop5:	ld	r16,y+
loop4:	sbis	usr,5		;测试USR第5位发送寄存器是否空
	rjmp	loop4
	out	udr,r16		;发送数据
	cpi	r28,$4F
	brne	loop5
loep:	sbis	usr,5		;测试USR第5位发送寄存器是否空
	rjmp	loep
	ldi	r16,$ff		;
	out	udr,r16	
loep1:	sbis	usr,5		;测试USR第5位发送寄存器是否空
	rjmp	loep1
	ldi	r16,$ff		;
	out	udr,r16			
	ret		
	
EXT_INT0:			;键盘中断子程序
	push	r3
	push	r4
	push	r5
	push	r6
	push	r7
	push	r16		;压栈
	push	r17
	push	r18
	push	r19
	push	r20
	push	r21
	push	r22
	push	r23
	push	r24
	push	r25
	push	r28
	push	r29
	clr	r25
	clr	r24
	in	r19,portd	;保存D口状态
	in	r20,portb	;保存B口状态
	in	r21,ddrb	;保存B口方向
	in	r18,SREG
	
	ldi	r16,$00		;INT0可用,INT1屏蔽 0b01000000
	out	GIMSK,R16
	
read:	rcall	readkey		;读按键值
	cpi	r17,$c0		;启动编码
	breq	startsystem
	cpi	r17,$c8		;停止编码
	breq	stopsystem	
	cpi	r17,$d0		;设定编码
	breq	setup1
	cpi	r17,$d8		;退出编码
	breq	quit1
	cpi	r17,$e0		;加编码
	breq	keyup1
	cpi	r17,$e8		;减编码
	breq	keydown1
	cpi	r17,$c1		;消音
	breq	mute
	
kqt:	
	ldi	r16,$40		;INT0可用,INT1屏蔽 0b01000000
	out	GIMSK,R16
	out	GIFR,r16
	out	portd,r19	;恢复D口状态
	sbi	portd,6
	out	portb,r20	;恢复B口状态
	out	ddrb,r21	;恢复B口方向
	out	SREG,r18
	pop	r29		;弹出
	pop	r28
	pop	r25		;弹出
	pop	r24
	pop	r23
	pop	r22
	pop	r21
	pop	r20
	pop	r19
	pop	r18
	pop	r17
	pop	r16
	pop	r7
	pop	r6
	pop	r5
	pop	r4
	pop	r3
	reti			;中断返回
setup1:	rjmp	setup	
quit1:	rjmp	quit		;转退出子程序
keyup1:	rjmp	keyup		;转向左子程序
keydown1:rjmp	keydown		;转向右子程序
	
intr:	sbis	pind,2		;8279的中断信号有则跳行
	rjmp	intr		
	rjmp	read		;读8279中断信息
	
startsystem:
	rcall	beep		;BEEP
	ldi	r16,01		;启动风机输出
	out	portc,r16
	sbi	portd,7
	nop
	nop
	cbi	portd,7
	cpi	r25,$00
	brne	intr
	rjmp	kqt
	
stopsystem:
	rcall	beep
	ldi	r16,00		;停止风机输出
	out	portc,r16
	sbi	portd,7
	nop
	nop
	cbi	portd,7	
	cpi	r25,$00
	brne	intr
	rjmp	kqt
	
mute:	rcall	beep
	sbi	portd,6		;消音报警
	cpi	r25,$00
	brne	intr
	rjmp	kqt
	
setup:	rcall	beep		;设定按钮
	inc	r25
	cpi	r25,$01
	brne	jmkz1
	rcall	setupxs		;setup键按了1次
	rjmp	intr		;再去读中断口
jmkz1:	cpi	r25,$02
	breq	jmkz2		;读出EEP值,以便修改
	cpi	r25,$03
	breq	jmkz3		;修改完毕,保存EEP值
	rjmp	kqt
jmkz2:	rcall	EERead		;读出EEP值
	mov	r23,r16
	rcall	xsgy
	rjmp	intr
jmkz3:	rcall	EEWrite		;保存EEP值
	ldi	r29,$01
	ldi	r28,$40
	add	r28,r24
	st	y,r23
	;rcall	cansujs		;^^^^^^^^^^^^^^^^^^^^
	dec	r25
	dec	r25
	rcall	showcs
	rjmp	intr
	
quit:	rcall	beep
	cpi	r25,$02
	brne	kqt4		;退出按钮
	rcall	showcs	
	dec	r25
	rjmp	intr
kqt4:	rjmp	kqt
	
keyup:	rcall	beep		;键盘LEFT
	cpi	r25,$00
	brne	kqt3
	rjmp	kqt
kqt3:	cpi	r25,$01
	brne	to
	dec	r24
	brmi	lp1		;r24为负转移
lp2:	rcall	showcs
	rjmp	intr		
to:	cpi	r25,$02
	brne	tczgc
	dec	r23
	rcall	xsgy
	rjmp	intr
lp1:	ldi	r24,$e
	rjmp	lp2	
tczgc:	rjmp	intr

keydown:rcall	beep		;键盘RIGHT
	cpi	r25,$00
	brne	kqt2
	rjmp	kqt
kqt2:	cpi	r25,$01
	brne	to1	
	inc	r24
	cpi	r24,$f
	brge	lp3		;r24>=$c 跳转
lp4:	rcall	showcs
	rjmp	intr		
to1:	cpi	r25,$02
	brne	tczgc
	inc	r23
	rcall	xsgy
	rjmp	intr
lp3:	ldi	r24,$00
	rjmp	lp4
	
xsgy:	mov	res1,r23
	ldi	r16,$00
	mov	res2,r16
	rcall	htd3
	sbi	portd,5		;初始化8279控制字
	cbi	portd,4
	sbi	portd,3
	ldi	r16,$91
	out	portb,r16
	nop
	sbi	portd,4
	cbi	portd,5	
	mov	r16,cnt2d
	rcall	outpd
	mov	r16,cnt1d
	swap	r16
	rcall	outpd
	mov	r16,cnt1d
	rcall	outpd
	sbi	portd,5	
	ret	

EERead: 
	sbic	EECR,EEWE	;if EEWE not clear
	rjmp	EERead
	ldi	r16,$01
	mov	r4,r16
	mov     r3,r24		;    wait more
	out 	EEARH,r4	;output address high for 8515
	out	EEARL,r3	;output address low for 8515
	sbi	EECR,EERE	;set EEPROM Read strobe
				;This instruction takes 4 clock cycles since
				;it halts the CPU for two clock cycles
	in	r16,EEDR	;get data
	ret
EEWrite:
	sbic	EECR,EEWE	;if EEWE not clear
	rjmp	EEWrite		;    wait more
	ldi	r16,$01
	mov	r4,r16
	mov	r3,r24
	out 	EEARH,r4	;output address high for 8515
	out	EEARL,r3	;output address low for 8515
	out	EEDR,r23        ;output data
	sbi 	EECR,EEMWE	;set master write enable, remove if 1200 is used	
	sbi	EECR,EEWE	;set EEPROM Write strobe
	nop			;This instruction takes 4 clock cycles since
	nop			;it halts the CPU for two clock cycles
	nop
	nop	
	ret 		         	

readkey:
	ser	r16
	out	ddrb,r16
	sbi	portd,5		;初始化8279控制字
	cbi	portd,4
	ldi	r16,$40
	out	portb,r16
	sbi	portd,4
	cbi	portd,5
	clr	r16
	out	ddrb,r16
	out	portb,r16
	cbi	portd,3
	nop
	in	r17,pinb
	sbi	portd,5	
	sbi	portd,3
	ser	r16
	out	ddrb,r16
kqt1:	ret
	
setupxs:rcall	cs8279		;显示字符

	ldi	r16,$6d		;'S'
	rcall	outxs	
	ldi	r16,$79		;'E'
	rcall	outxs
	ldi	r16,$78		;'t'
	rcall	outxs
	ldi	r16,$3e		;'u'
	rcall	outxs
	ldi	r16,$73		;'p'
	rcall	outxs
	sbi	portd,5	
	ldi	r20,$56		;调用延时
	rcall	delay
	rcall	cs8279		;显示温度设定
	ldi	r16,$78		;'t'
	rcall	outxs
	ldi	r16,$06		;'-'
	rcall	outxs
	rcall	jy
	ret
	
cs8279:	sbi	portd,5		;初始化8279控制字
	cbi	portd,4
	sbi	portd,3
	ldi	r16,$90
	out	portb,r16
	nop
	sbi	portd,4
	cbi	portd,5	
	ret
			
outxs:				;显示输出
	cbi	portd,4
	out	portb,r16
	sbi	portd,4	
	ret

beep:	
	cbi	portd,6	
	ldi	r20,$19		;调用延时
	rcall	delay
	sbi	portd,6	
	ret
	
jy:	ldi	r16,$40		;'-'
	rcall	outxs	
	ldi	r16,$40		;'-'
	rcall	outxs	
	ldi	r16,$40		;'-'
	rcall	outxs	
	sbi	portd,5	
	ret	

showcs:	rcall	cs8279
	cpi	r24,$00		;显示温度设定
	brne	csbsf1
	ldi	r16,$78		;'t'
	rcall	outxs	
	ldi	r16,$06		;'1'
	rcall	outxs	
	rcall	jy
	ret
csbsf1:	cpi	r24,$01		;显示温度周期
	brne	csbsf2
	ldi	r16,$6d		;'s'
	rcall	outxs	
	ldi	r16,$06		;'1'
	rcall	outxs	
	rcall	jy
	ret
csbsf2:	cpi	r24,$02		;显示湿度设定
	brne	csbsf3
	ldi	r16,$76		;'h'
	rcall	outxs	
	ldi	r16,$06		;'1'
	rcall	outxs	
	rcall	jy
	ret
csbsf3:	cpi	r24,$03		;显示湿度周期
	brne	csbsf4
	ldi	r16,$6d		;'s'
	rcall	outxs	

⌨️ 快捷键说明

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