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

📄 no3a.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	r3		;压栈
	push	r4
	push	r16
	push	r17
	push	r18
	push	r19
	push	r23
	push	r24
	push	r28
	push	r29
	in	r18,SREG	;保存状态寄存器
	clr	r19
lp00:	sbic	usr,4		;低电平跳行,高电平帧错误
	rjmp	lp01
	rjmp	lp02
lp01:	inc	r19
	cpi	r19,$ff
	breq	qt	
	rjmp	lp00
lp02:	in	r17,udr		;读串口数据到r17
	ldi	r29,$01
	ldi	r28,$58		;SRAM中站号地址
	ld	r16,y
	cpse	r17,r16		;是本站则跳行执行
	rjmp	qt		;非本站,退出通讯中断

lp03:	sbis	usr,5		;测试USR第5位发送寄存器是否空
	rjmp	lp03
	out	udr,r16		;是本站,请求发送第二次指令数据
	clr	r19
lp04:	sbic	usr,4		;低电平跳行,高电平帧错误
	rjmp	lp05
	rjmp	lp06
lp05:	inc	r19
	cpi	r19,$ff
	breq	qt
	rjmp	lp04
lp06:	in	r17,udr		;读串口数据到r17
	cpi	r17,$ff		;第二次指令数据处理
	brne	lp07			
	rcall	txdata		;FF指令为上传数据
	rcall	txdata
	rjmp	qt
lp07:	cpi	r17,$fe
	brne	lp08
	rcall	zxml		;FE指令为执行命令
	rjmp	qt
lp08:	cpi	r17,$fd
	brne	qt
	rcall	xgml		;FD指令为修改参数

qt:	out	sreg,r18	;退出通讯中断
	pop	r29
	pop	r28
	pop	r24
	pop	r23
	pop	r19
	pop	r18
	pop	r17
	pop	r16
	pop	r4
	pop	r3
	reti
		
txdata:	ldi	r29,$01		;发送数据
	ldi	r28,$00
lp09:	ld	r16,y+
lp10:	sbis	usr,5		;测试USR第5位发送寄存器是否空
	rjmp	lp10
	out	udr,r16		;发送数据
	cpi	r28,$5D
	brne	lp09
lp11:	sbis	usr,5		;测试USR第5位发送寄存器是否空
	rjmp	lp11
	ldi	r16,$ff		;上传数据结束符号FF
	out	udr,r16	
lp12:	sbis	usr,5		;测试USR第5位发送寄存器是否空
	rjmp	lp12
	ldi	r16,$ff		;上传数据结束符号FF
	out	udr,r16			
	ret	

zxml:	clr	r19		;执行命令
lp13:	sbis	usr,7		;测试接收寄存器是否为空
	rjmp	lp14
	rjmp	lp15
lp14:	inc	r19
	cpi	r19,$ff
	breq	qt
	rjmp	lp13		;低电平为空
lp15:	clr	r19
lp16:	sbic	usr,4		;测试帧是否正确
	rjmp	lp17
	rjmp	lp18
lp17:	inc	r19
	cpi	r19,$ff
	breq	qt
	rjmp	lp16		;帧错误为高电平
lp18:	in	r17,udr	
	
	
	ret	
	
xgml:	ldi	r29,$01		;修改参数子程序
	ldi	r28,$60
	clr	r19
lp19:	sbis	usr,7		;测试接收寄存器是否为空
	rjmp	lp20
	rjmp	lp21
lp20:	inc	r19
	cpi	r19,$ff
	breq	qt
	rjmp	lp19		;低电平为空
lp21:	in	r17,udr
	st	y+,r17
	cpi	r28,$9A		;接收参数29*2=58个
	brne	lp19

	ldi	r28,$60
lp22:	ldd	r17,y+29	;第一次参数
	ld	r16,y+		;第二次参数
	cpse	r17,r16
	rjmp	xgml2		;如果两次参数不一致
	cpi	r28,$7D
	brne	lp22		;如果未比较完
	ldi	r16,$fd
lp23:	sbis	usr,5		;测试USR第5位发送寄存器是否空
	rjmp	lp23
	out	udr,r16		;接收数据成功,可以修改参数,返回FD
	
	ldi	r28,$40
xgml3:	ldd	r17,y+32
	ld	r16,y+
	cpse	r17,r16
	rjmp	xgml4
xgml5:	cpi	r28,$5D
	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
	
		
	
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	r28
	push	r29
	clr	r25
	clr	r24
	;sei
	in	r19,portd	;保存D口状态
	in	r20,portb	;保存B口状态
	in	r21,ddrb	;保存B口方向
	in	r18,SREG

	rcall	readkey		;读按键值
	cpi	r17,$c0		;启动编码
	breq	startsystem
	cpi	r17,$c8		;停止编码
	breq	stopsystem	
	cpi	r17,$d0		;设定编码
	breq	setup1
	cpi	r17,$d8		;退出编码
	breq	quit
	cpi	r17,$e0		;加编码
	breq	keyup1
	cpi	r17,$e8		;减编码
	breq	keydown1
	cpi	r17,$c1		;消音
	breq	mute
	
kqt:	out	portd,r19	;恢复D口状态
	sbi	portd,6
	out	portb,r20	;恢复B口状态
	out	ddrb,r21	;恢复B口方向
	out	SREG,r18
	pop	r29		;弹出
	pop	r28
	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		;转向右子程序
startsystem:
	rcall	beep		;BEEP
	ldi	r16,01		;启动风机输出
	out	portc,r16
	sbi	portd,7
	nop
	nop
	cbi	portd,7
	rjmp	kqt
stopsystem:
	rcall	beep
	ldi	r16,00		;停止风机输出
	out	portc,r16
	sbi	portd,7
	nop
	nop
	cbi	portd,7	
	rjmp	kqt
	
quit:	rcall	beep
	cpi	r25,$02
	brne	quit0		;退出按钮
	rcall	showcs	
	dec	r25
	rjmp	kqt
quit0:	clr	r25		;0次或1次
	rjmp	kqt	
	
mute:	rcall	beep
	sbi	portd,6		;消音报警
	rjmp	kqt
	
setup:	rcall	beep		;设定按钮
	inc	r25
	cpi	r25,$01
	brne	jmkz1
	rcall	setupxs		;setup键按了1次
	ldi	r29,$01		;yh=$01
	ldi	r28,$9d		;yl=$9d
	ldi	r27,$01		;xh=$01
	ldi	r26,$40		;xl=$40
	clr	r16
	st	y+,r16		;初始0x019d为0
	ld	r16,x+
	st	y+,r16		;SRAM 0x019e中数=0x0140中数
	ld	r16,x+
	st	y+,r16		;SRAM 0x019f中数=0x0141中数	
	rjmp	kqt		;退出
jmkz1:	cpi	r25,$02
	breq	jmkz2		;读出EEP在SRAM中的映射值,以便修改
	cpi	r25,$03
	breq	jmkz3		;修改完毕,保存EEP值
	clr	r25
	rjmp	kqt
jmkz2:	ldi	r29,$01		;yh=$01
	ldi	r28,$9d		;yl=$9d
	ld	r26,y+
	inc	r26
	adiw	r26,63		;xl=$40+xl
	ldi	r27,$01		;xh=$01
	ld	r16,x+
	st	y+,r16		;SRAM 0x019e中数=0x0140中数
	ld	r16,x
	st	y,r16		;SRAM 0x019f中数=0x0141中数
;	rcall	xsgy
	rjmp	kqt
jmkz3:	ldi	r29,$01		;yh=$01
	ldi	r28,$9d		;yl=$9d
	ld	r26,y+
	mov	r3,r26
	inc	r26
	adiw	r26,63		;xl=$40+xl
	ldi	r27,$01		;xh=$01
	ld	r16,y+
	st	x+,r16		;SRAM 0x019e中数=0x0140中数
	mov	r23,r16
	rcall	EEWrite		;保存EEP值L
	ld	r16,y
	st	x,r16		;SRAM 0x019f中数=0x0141中数
	mov	r23,r16
	inc	r3
	rcall	EEWrite		;保存EEP值H
	;rcall	cansujs		;^^^^^^^^^^^^^^^^^^^^
	dec	r25
	dec	r25
	rcall	showcs
	rjmp	kqt
	
keyup:	rcall	beep		;键盘LEFT
	cpi	r25,$0
	breq	left5
	ldi	r29,$01		;yh=$01
	ldi	r28,$9d		;yl=$9d
	ld	r26,y		;通道号在r26
	cpi	r25,$01
	brne	left2
	subi	r26,$02
	brmi	left1		;负数转移
	rjmp	left6
left1:	ldi	r26,$1c
left6:	st	y+,r26		;保存通道号到0x019d
	rcall	showcs		;显示通道标示
	rjmp	kqt
left2:	cpi	r25,$02
	brne	left5
	inc	r26
	adiw	r26,63		;通道号+$40=xl
	ldi	r27,$01		;xh=$01	
	ld	r16,x+		;eep映射参数低字节
	ld	r17,x
	;rcall	tdhpd		;根据通道号判断是否需转换成BCD码
	cpi	r24,$01
	brne	left3		;r24<>1则需转换
	dec	r16		;单字节EEP参数
	rjmp	left4
left3:	ldi	r16,$0;1	;000000
	;rcall	subcd		;BCD码减法
	;rcall	tzbcd		;BCD码调整
left4:	rcall	display;1
	st	y+,r16
	st	y,r17
left5:	rjmp	kqt

keydown:rcall	beep		;键盘RIGHT
	cpi	r25,$0
	breq	right5
	ldi	r29,$01		;yh=$01
	ldi	r28,$9d		;yl=$9d
	ld	r26,y		;通道号在r26
	cpi	r25,$01
	brne	right2
	adiw	r26,$02
	cpi	r26,$1e
	brne	right1
	ldi	r26,$0
right1:	st	y+,r26		;保存通道号到0x019d
	rcall	showcs		;显示通道标示
	rjmp	kqt
right2:	cpi	r25,$02
	brne	right5
	inc	r26
	adiw	r26,63		;通道号+$40=xl
	ldi	r27,$01		;xh=$01	
	ld	r16,x+		;eep映射参数低字节
	ld	r17,x
	;rcall	tdhpd		;根据通道号判断是否需转换成BCD码
	cpi	r24,$01
	brne	right3		;r24<>1则需转换
	inc	r16		;单字节EEP参数
	rjmp	right4
right3:	ldi	r16,$0;1	;0000000
	;rcall	adbcd		;BCD码加法
	;rcall	tzbcd		;BCD码调整
right4:	rcall	display;1
	st	y+,r16
	st	y,r17
right5:	rjmp	kqt
	
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
	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:	
	sbi	portd,6	
	ldi	r20,$19		;调用延时
	rcall	delay
	cbi	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

⌨️ 快捷键说明

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