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

📄 no3.asm

📁 AVR-AT90S8535,HD8279,等开发的洁净空调专用DDC系统,包括AD/DA,PID计算等.
💻 ASM
字号:
;************* 宏方科技  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			;res1、res2存放结果的十六进制
.def    cnt1d  = r6
.def    cnt2d  = r7			;cnt1、dcnt2d存放结果的十进制

.org	0x00
.equ	label=$0200
	rjmp	RESET	; 

;.org	0x01		;通用中断
;INTT0:	RJMP	GINT	;

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

	
.org	0x020			;

RESET:
SYS:	ldi	R16,low(RAMEND)	;设置堆栈
	out	SPL,R16
	ldi	R16,high(RAMEND)
	out	SPH,R16
	
	ldi	r16,$28	 	;8279写控制寄存器
	out	portd,r16
	ldi	r16,$d1
	out	portb,r16
	sbi	portd,4
	
;	ldi	r20,0X30	
;	rcall	Delay
	
	;wdr			;看门狗复位
	;ldi	R16,$0F		;0b00001111
	;out	WDTCR,R16	;狗周期2048MS

	ldi	R16,$F8		;0B11111000
	out	DDRA,R16	;A口0~2输入,3~7输出
	sbi	porta,2
	ldi	R16,$FA		;0B11111110
	out	DDRD,R16	;D口0/2输入,1/3~7输出
	ldi	R16,$FF		;0B11111111
	out	DDRC,R16	;C口输出
	out	DDRB,R16	;B口输出

	ldi	R16,$85		;设置ADC转换,中断触发,ADC为单次模式且32M分频
	out	adcsr,R16
	clr	R16
	out	admux,R16	;ADC  0通道
	sbi	adcsr,6		;启动ADC

	ldi	r16,$98		;初始化COM
        out	ucr,r16		;设置UART控制寄存器---UCR
	ldi	r16,25
	out	ubrr,r16	;设置UART波特率

	;ldi	r16,$40		;INT0可用,INT1屏蔽
	;out	GIMSK,R16
	;ldi	r16,$3		;INT0上升沿触发   
	;out	mcucr,r16
	
	cbi	portd,4
	ldi	r16,$00		;8279键盘显示方式初始
	out	portb,r16
	sbi	portd,4
	nop
	cbi	portd,4
	ldi	r16,$22		;8279时钟分频=2
	out	portb,r16
	sbi	portd,4	
	
	clr	r17		;ADIN 4051地址计数

main:	rcall	ADC1
	mov	res1,r2
	mov	res2,r3
	rcall	htd3		;16进制转10进制
	rcall	display		;调用显示子程序
	
	cpi	r17,$07	
	brne	addre1		;不等于7则跳转
	clr	r17		;等于7
	sbic	admux,0		;内地址
  	rjmp	addre2		;如果admux=1则置0
  	sbi	admux,0		;如果admux=0则置1
  	rjmp	addre3
addre2:	cbi	admux,0
	rjmp	addre3
addre1:	inc	r17
addre3:	mov	r18,r17
	andi	r18,$01
	cpi	r18,$01
	brne	addre4
	sbi	porta,3
	rjmp	addre5
addre4:	cbi	porta,3
addre5:	mov	r18,r17
	andi	r18,$02
	cpi	r18,$02
	brne	addre6
	sbi	porta,4
	rjmp	addre7
addre6:	cbi	porta,4
addre7:	mov	r18,r17
	andi	r18,$04
	cpi	r18,$04
	brne	addre8
	sbi	porta,5
	rjmp	addre9
addre8:	cbi	porta,5
addre9:	ldi	r20,0X56	;延时1秒
	rcall	Delay
	sbi	adcsr,6		;启动ADC
	rjmp	main		;
	

;**** 子程序
ADC1:	sbic	adcsr,adsc	;转换结束跳行否则等待
	rjmp	ADC1
	in	r2,adcl		;把转换结果送r2,r3
	in	r3,adch
	sbic	pina,2		;读开关量
	ldi	r18,$0		;开关量关
	ldi	r18,$1		;开关量开
 			
	ldi	r27,$01		;传数据到SRAM 0100 处
 	mov	r26,r17
	st	x,r18		;传开关量到 0100
	sbic	admux,0
  	rjmp	admux1
  	adiw	r26,$10		;传A0数据到SRAM 0110 处
	rjmp	chuan
admux1:	adiw	r26,$20		;传A1数据到SRAM 0120 处
chuan:	st	x+,r2		;传低位数据 
	st	x,r3		;传高位数据 
	ret	

;**** 16位无符号乘法
.def	mc16uL	=r9		;被乘数低字节
.def	mc16uH	=r10		;被乘数高字节
.def	mp16uL	=r11		;乘数低字节
.def	mp16uH	=r12		;乘数高字节
.def	m16ua	=r11		;结果 字节 0 (LSB)
.def	m16ub	=r12		;结果 字节 1
.def	m16u2	=r13		;结果 字节 2
.def	m16u3	=r14		;结果 字节 3 (MSB)
.def	mcnt16u	=r21		;循环计数

mpy16u:	clr	m16u3		;清2.3
	clr	m16u2
	ldi	mcnt16u,16	;
	lsr	mp16uH
	ror	mp16uL
m16u_1:	brcc	noad8		;C清零转
	add	m16u2,mc16uL	;加被乘数到2
	adc	m16u3,mc16uH	;加被乘数到3
noad8:	ror	m16u3		;带进位右循环
	ror	m16u2		;带进位右循环
	ror	m16ub		;带进位右循环
	ror	m16ua		;带进位右循环
	dec	mcnt16u		;计数减1
	brne	m16u_1		;不为零转
	ret
;***** 16位无符号除法
.def	drem16uL=r13		;余数  低位
.def	drem16uH=r14		;余数  高位
.def	dres16uL=r11		;  商  低位
.def	dres16uH=r12		;  商  高位
.def	dd16uL	=r11		;被除数 低位
.def	dd16uH	=r12		;被除数 高位
.def	dv16uL	=r9		;除数   低位
.def	dv16uH	=r10		;除数   高位
.def	dcnt16u	=r21		

div16u:	clr	drem16uL		;清除余数低位
	sub	drem16uH,drem16uH	;清除余数高位
	ldi	dcnt16u,17		;循环计数
d16u_1:	rol	dd16uL			;带进位左移
	rol	dd16uH
	dec	dcnt16u			;decrement counter
	brne	d16u_2			;不为0转
	ret				;return
d16u_2:	rol	drem16uL		;shift dividend into remainder
	rol	drem16uH
	sub	drem16uL,dv16uL		;remainder = remainder - divisor
	sbc	drem16uH,dv16uH	;
	brcc	d16u_3			;if result negative
	add	drem16uL,dv16uL		;restore remainder
	adc	drem16uH,dv16uH
	clc				;clear carry to be shifted into result
	rjmp	d16u_1			;else
d16u_3:	sec				;set carry to be shifted into result
	rjmp	d16u_1



htd3:					;16转10子程序
	ldi	temp,16
	mov	count,temp
	clr	temp
	clr	cnt1d
	clr	cnt2d
	clc
loopd:
	rol	res1
	rol	res2
	rol	cnt1d
	rol	cnt2d
	dec	count
	brne	c	
	ret
c:	rcall	adjn
	rjmp	loopd

adjn:
	push	count
	mov	count,cnt1d
	rcall	adjd1
	mov	cnt1d,count
	mov	count,cnt2d
	rcall	adjd1
	mov	cnt2d,count
	pop	count
	ret
adjd1:
	ldi	temp,3
	add	temp,count
	sbrc	temp,3
	mov	count,temp
	ldi	temp,$30
	add	temp,count
	sbrc	temp,7
	mov	count,temp
	ret

display:sbi	portd,5		;初始化8279控制字
	cbi	portd,4
	ldi	r23,$90
	out	portb,r23
	sbi	portd,4
	cbi	portd,5

	ldi	zh,high(label*2) 	;0~15通道号切换
	mov	zl,r17
	sbic	admux,0
  	rjmp	dis1
  	rjmp	dis0
dis1:  	adiw	zl,$08		
dis0:	lpm
	out	portb,r0
	cbi	portd,4	
	nop
	sbi	portd,4		

	mov	r16,cnt2d
	swap	r16
	rcall	outpd
	mov	r16,cnt2d
	rcall	outpd
	mov	r16,cnt1d
	swap	r16
	rcall	outpd
	mov	r16,cnt1d
	rcall	outpd
	sbi	portd,5		;向8279传送数据结束
	ret	

outpd:	ldi	zl,low(label*2)
	andi	r16,$0f
	add	zl,r16
	lpm
	out	portb,r0
	cbi	portd,4
	nop
	sbi	portd,4	
	ret
	

	
delay:  push	r20		;2t延时子程序
l0:     push	r20		;2t
l1:     push	r20		;2t
l2:     push	r20		;2t
l3:     dec	r20		;1t
        brne	l3		;1t/2t
        pop	r20		;2t
        dec	r20		;1t 
        brne	l2		;1t/2t
        pop	r20		;2t
        dec	r20		;1t 
        brne	l1		;1t/2t
        pop	r20		;2t
        dec	r20		;1t 
        brne	l0		;1T/2T
        pop	r20		;2t
        ret			;4t


.cseg
.org	$0200
.dw	0x063f,0x4f5b,0x6d66,0x077d	
.dw	0x6f7f,0x7c77,0x5e39,0x7179

⌨️ 快捷键说明

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