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

📄 no5.asm

📁 AVR-AT90S8535,HD8279,等开发的洁净空调专用DDC系统,包括AD/DA,PID计算等.
💻 ASM
📖 第 1 页 / 共 3 页
字号:
	std	z+6,r6
	std	z+7,r7
	ldi	xl,6
	rcall	eewrite
	mov	r16,r7
	ldi	xl,7
	rcall	eewrite
	rjmp	kqt	
setup34:cpi	r16,20		;FL
	brne	setup35
	ldd	r6,y+12
	ldd	r7,y+13
	rcall	btoh
	std	z+8,r4
	std	z+9,r5
	ldi	xl,8
	mov	r16,r4
	rcall	eewrite
	mov	r16,r5
	ldi	xl,9
	rcall	eewrite
	rjmp	kqt
setup35:cpi	r16,21		;S1
	brne	setup36
	ldd	r6,y+12
	clr	r7
	rcall	btoh
	std	z+10,r4
	ldi	xl,10
	mov	r16,r4
	rcall	eewrite
	rjmp	kqt	
setup36:cpi	r16,22		;S2
	brne	setup37
	ldd	r6,y+12
	clr	r7
	rcall	btoh
	std	z+11,r4
	ldi	xl,11
	mov	r16,r4
	rcall	eewrite
	rjmp	kqt	
setup37:cpi	r16,23		;P1
	brne	setup38
	ldd	r6,y+12
	clr	r7
	rcall	btoh
	std	z+12,r4
	ldi	xl,12
	mov	r16,r4
	rcall	eewrite
	rcall	cansujs1	;^^^^^^^^^^^^^^
	rjmp	kqt		
setup38:cpi	r16,24		;I1
	brne	setup39
	ldd	r6,y+12
	clr	r7
	rcall	btoh
	std	z+13,r4
	ldi	xl,13
	mov	r16,r4
	rcall	eewrite
	rcall	cansujs1	;^^^^^^^^^^^^^^	
	rjmp	kqt	
setup39:cpi	r16,25		;D1
	brne	setup40
	ldd	r6,y+12
	clr	r7
	rcall	btoh
	std	z+14,r4
	ldi	xl,14
	mov	r16,r4
	rcall	eewrite
	rcall	cansujs1	;^^^^^^^^^^^^^^	
	rjmp	kqt
setup40:cpi	r16,26		;P2
	brne	setup41
	ldd	r6,y+12
	clr	r7
	rcall	btoh
	std	z+15,r4
	ldi	xl,15
	mov	r16,r4
	rcall	eewrite
	rcall	cansujs2	;^^^^^^^^^^^^^^	
	rjmp	kqt	
setup41:cpi	r16,27		;I2
	brne	setup42
	ldd	r6,y+12
	clr	r7
	rcall	btoh
	std	z+16,r4
	ldi	xl,16
	mov	r16,r4
	rcall	eewrite
	rcall	cansujs2	;^^^^^^^^^^^^^^	
	rjmp	kqt	
setup42:cpi	r16,28		;D2
	brne	setup43
	ldd	r6,y+12
	clr	r7
	rcall	btoh
	std	z+17,r4
	ldi	xl,17
	mov	r16,r4
	rcall	eewrite
	rcall	cansujs2	;^^^^^^^^^^^^^^	
	rjmp	kqt	
setup43:cpi	r16,29		;MODLE
	brne	setup44
	ldd	r16,y+12
	ldi	r18,1
	sbrc	r16,0
	rjmp	setup44
	clr	r18
setup44:std	z+18,r18
	ldi	xl,18
	mov	r16,r18
	rcall	eewrite
	rjmp	kqt
setup45:cpi	r16,30		;SN
	brne	setup46
	ldd	r6,y+12
	clr	r7
	rcall	btoh
	std	z+19,r4
	ldi	xl,19
	mov	r16,r4
	rcall	eewrite
	rjmp	kqt	
setup46:cpi	r16,31		;UBR
;	brne	setup47
	ldd	r6,y+12
	clr	r7
	rcall	btoh
	std	z+20,r4
	ldi	xl,20
	mov	r16,r4
	rcall	eewrite
	rjmp	kqt	
setup47:cpi	r16,32		;t下限
	brne	setup48
	clr	r16
	std	y+13,r16
	rcall	wendubh
	std	z+21,r6
	ldi	xl,21
	rcall	eewrite
	rjmp	kqt	
setup48:cpi	r16,33		;t上限
	brne	setup49
	clr	r16
	std	y+13,r16
	rcall	wendubh
	std	z+22,r6
	ldi	xl,22
	rcall	eewrite
	rjmp	kqt	
setup49:cpi	r16,34		;h下限
	brne	setup50
	ldd	r6,y+12
	clr	r7
	rcall	shidubh
	std	z+23,r6
	ldi	xl,23
	rcall	eewrite
	rjmp	kqt	
setup50:ldd	r6,y+12		;h上限
	clr	r7
	rcall	shidubh
	std	z+24,r6
	ldi	xl,24
	rcall	eewrite
	rjmp	kqt				

LEFT:	rcall	beep		;键盘LEFT
	ldi	yh,$00		;y >>> $0060
	ldi	yl,$60
	ldd	r16,y+5		;参数设定计数器
	cpi	r16,0
	brne	LEFT1
	ldi	r16,1		;通道锁定
	st	y,r16
	rjmp	kqt
LEFT1:	cpi	r16,1
	breq	left01
	rjmp	LEFT22		;参数设定计数器=2
left01:	ldd	r16,y+1		;通道号
	dec	r16
	cpi	r16,15
	brne	left2
	ldi	r16,35
left2:	std	y+1,r16
	cpi	r16,16
	brne	left3
	ldi	r16,$78		;'t'
	ldi	r17,$06		;'1'
	ldi	r18,$40		;'-'
	rcall	XIANTD
	rjmp	kqt
left3:	cpi	r16,17
	brne	left4
	ldi	r16,$76		;'h'
	ldi	r17,$06		;'1'
	ldi	r18,$40		;'-'
	rcall	XIANTD
	rjmp	kqt
left4:	cpi	r16,18
	brne	left5
	ldi	r16,$78		;'t'
	ldi	r17,$5b		;'2'
	ldi	r18,$40		;'-'
	rcall	XIANTD
	rjmp	kqt	
left5:	cpi	r16,19
	brne	left6
	ldi	r16,$73		;'P'
	ldi	r17,$77		;'A'
	ldi	r18,$40		;'-'
	rcall	XIANTD
	rjmp	kqt
left6:	cpi	r16,20
	brne	left7
	ldi	r16,$71		;'F'
	ldi	r17,$38		;'L'
	ldi	r18,$40		;'-'
	rcall	XIANTD
	rjmp	kqt	
left7:	cpi	r16,21
	brne	left8
	ldi	r16,$6D		;'S'
	ldi	r17,$06		;'1'
	ldi	r18,$40		;'-'
	rcall	XIANTD
	rjmp	kqt	
left8:	cpi	r16,22
	brne	left9
	ldi	r16,$6D		;'S'
	ldi	r17,$5B		;'2'
	ldi	r18,$40		;'-'
	rcall	XIANTD
	rjmp	kqt	
left9:	cpi	r16,23
	brne	left10
	ldi	r16,$73		;'P'
	ldi	r17,$06		;'1'
	ldi	r18,$40		;'-'
	rcall	XIANTD
	rjmp	kqt	
left10:	cpi	r16,24
	brne	left11
	ldi	r16,$30		;'I'
	ldi	r17,$06		;'1'
	ldi	r18,$40		;'-'
	rcall	XIANTD
	rjmp	kqt	
left11:	cpi	r16,25
	brne	left12
	ldi	r16,$5E		;'D'
	ldi	r17,$06		;'1'
	ldi	r18,$40		;'-'
	rcall	XIANTD
	rjmp	kqt
left12:	cpi	r16,26
	brne	left13
	ldi	r16,$73		;'P'
	ldi	r17,$5B		;'2'
	ldi	r18,$40		;'-'
	rcall	XIANTD
	rjmp	kqt	
left13:	cpi	r16,27
	brne	left14
	ldi	r16,$30		;'I'
	ldi	r17,$5B		;'2'
	ldi	r18,$40		;'-'
	rcall	XIANTD
	rjmp	kqt	
left14:	cpi	r16,28
	brne	left15
	ldi	r16,$5E		;'D'
	ldi	r17,$5B		;'2'
	ldi	r18,$40		;'-'
	rcall	XIANTD
	rjmp	kqt	
left15:	cpi	r16,29
	brne	left16
	ldi	r16,$31		;'R'
	ldi	r17,$7E		;'U'
	ldi	r18,$37		;'N'
	rcall	XIANTD
	rjmp	kqt	
left16:	cpi	r16,30
	brne	left17
	ldi	r16,$6D		;'S'
	ldi	r17,$40		;'-'
	ldi	r18,$37		;'N'
	rcall	XIANTD
	rjmp	kqt	
left17:	cpi	r16,31
	brne	left18
	ldi	r16,$7E		;'U'
	ldi	r17,$7c		;'b'
	ldi	r18,$31		;'R'
	rcall	XIANTD
	rjmp	kqt
left18:	cpi	r16,32
	brne	left19
	ldi	r16,$78		;'t'
	ldi	r17,$40		;'-'
	ldi	r18,$38		;'L'
	rcall	XIANTD
	rjmp	kqt	
left19:	cpi	r16,33
	brne	left20
	ldi	r16,$78		;'t'
	ldi	r17,$40		;'-'
	ldi	r18,$76		;'H'
	rcall	XIANTD
	rjmp	kqt	
left20:	cpi	r16,34
	brne	left21
	ldi	r16,$76		;'H'
	ldi	r17,$40		;'-'
	ldi	r18,$38		;'L'
	rcall	XIANTD
	rjmp	kqt			
left21:	ldi	r16,$76		;'H'
	ldi	r17,$40		;'-'
	ldi	r18,$76		;'H'
	rcall	XIANTD
	rjmp	kqt
	
left22:	clr	r15
	clr	r14
	ldd	r13,y+13	;$006d
	ldd	r12,y+12	;$006c
	rcall	LRJIAN
	rcall	subcd
	std	y+13,r13	;$006d
	std	y+12,r12	;$006c
	rjmp	kqt
	
RIGHT:	rcall	beep		;键盘RIGHT
	ldi	yh,$00		;y >>> $0060
	ldi	yl,$60
	ldd	r16,y+5		;参数设定计数器
	cpi	r16,0
	brne	right1
	ldi	r16,0		;通道锁定解除
	st	y,r16
	rjmp	kqt
right1:	cpi	r16,1
	brne	right2		;参数设定计数器=2
	ldd	r16,y+1		;通道号
	inc	r16
	cpi	r16,36
	brne	right01	
	ldi	r16,16
right01:rjmp	left2
right2:	clr	r15
	clr	r14
	ldd	r13,y+13	;$006d
	ldd	r12,y+12	;$006c
	rcall	LRJIAN
	rcall	adbcd
	std	y+13,r13	;$006d
	std	y+12,r12	;$006c
	rjmp	kqt

;/////////////////////////////////////////////////

;/////////////////////////////////////////////////
SHIDU1:	mov	r6,r2
	mov	r7,r3
	ldi	r18,$03		;(r7,r6)*$30e
	mov	r5,r18
	ldi	r18,$0e
	mov	r4,r18
	rcall	mul16
	mov	r4,r6		;R8,R7,R6>>>BCD
	mov	r5,r7
	mov	r6,r8
	rcall	htd3
	ret
wendubh:ldd	r6,y+12
	ldd	r7,y+13
	rcall	btoh
	ldi	r18,$03
	ldi	r16,$ff
	mov	r6,r16
	mov	r7,r18
	rcall	mul16		;*1023
	ldi	r18,$0f
	ldi	r16,$a0
	mov	r4,r16
	mov	r5,r18
	rcall	div16		;/4000
	mov	r16,r6
	ret
	
shidubh:rcall	btoh
	ldi	r18,$03
	ldi	r16,$ff
	mov	r6,r16
	mov	r7,r18
	rcall	mul16		;*1023
	ldi	r18,$1f
	ldi	r16,$40
	mov	r4,r16
	mov	r5,r18
	rcall	div16		;/8000
	mov	r16,r6
	ret
tehpabh:ldd	r6,y+12
	ldd	r7,y+13
	rcall	btoh
	ldi	r18,$03
	ldi	r16,$ff
	mov	r6,r16
	mov	r7,r18
	rcall	mul16		;*1023
	ldi	r18,$03
	ldi	r16,$e8
	mov	r4,r16
	mov	r5,r18
	rcall	div16		;/1000
	mov	r16,r6
	ret
	
XIANTD:	std	y+7,r16		;$0067
	std	y+8,r17		;$0068
	std	y+9,r18		;$0069
	ldi	r19,$40		;'-'
	std	y+10,r19	;$006a
	std	y+11,r19	;$006b
	ret
	
LRJIAN:	clr	r11
	clr	r10
	clr	r9
	clr	r8
	ldd	r16,y+6		;参数位数选择
	cpi	r16,0
	brne	LRJIAN1
	inc	r8
	ret	
LRJIAN1:cpi	r16,1
	brne	LRJIAN2
	ldi	r16,$10
	mov	r8,r16
	ret	
LRJIAN2:cpi	r16,2
	brne	LRJIAN3
	inc	r9
	ret	
LRJIAN3:ldi	r16,$10
	mov	r9,r16
	ret	
			
EERead: 
	sbic	EECR,EEWE	;if EEWE not clear
	rjmp	EERead
	out 	EEARH,r27	;output address high for 8515
	out	EEARL,r26	;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	;数据传给R16
	ret
	
EEWrite:
	sbic	EECR,EEWE	;if EEWE not clear
	rjmp	EEWrite		;wait more
	out 	EEARH,r27	;output address high for 8515
	out	EEARL,r26	;output address low for 8515
	out	EEDR,r16        ;output data
	sbi 	EECR,EEMWE	;set master write enable, remove if 1200 is used	
	sbi	EECR,EEWE	;set EEPROM Write strobe
	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
	
beep:	sbi	portd,6	
	ldi	r20,$19		;调用延时
	rcall	delay
	cbi	portd,6	
	ret
	
valjs1:	ldi	yh,$00		;Y >>>0X00b0
	ldi	yl,$b0
	ldi	Zh,$00		;Z >>>0X0080
	ldi	Zl,$80
	rcall	mubc
	ldd	r4,Z+32		;E L
	ldd	r5,Z+33		;E H
	lds	r6,$0100	;Es L
	lds	r7,$0101	;Es H
	rcall	muabc
	clr	r7
	ldd	r6,y+12		;V0
	rcall	VAL0
	std	y+42,r17	;AO2 热水阀
	std	y+12,r16	;$00BC暂存冷水阀
	ldd	r17,y+28
	cp	r16,r17
	brsh	valbj1
	mov	r16,r17
valbj1:	std	y+41,r16	;AO1冷水阀
	ret
	
valjs2:	ldi	yh,$00		;Y >>>0X00c0
	ldi	yl,$c0
	ldi	Zh,$00		;Z >>>0X0090
	ldi	Zl,$90
	rcall	mubc
	ldd	r4,Z+18		;E L
	ldd	r5,Z+19		;E H
	lds	r6,$0102	;Es L
	lds	r7,$0103	;Es H
	rcall	muabc
	clr	r7
	ldd	r6,y+12		;V0
	rcall	VAL0
	std	y+27,r17	;AO3 加湿阀
	std	y+12,r16	;$00BC暂存冷水阀
	lds	r17,$00bc
	cp	r16,r17
	brsh	valbj2
	mov	r16,r17
valbj2:	std	y+25,r16	;AO1冷水阀
	ret	

AOOUT:	out	portc,r16	;out data
	sbi	porta,7		;打开DAC锁存
	nop
	cbi	porta,7
	out	portc,r17	;地址
	sbi	porta,6		;打开地址锁存
	nop
	cbi	porta,6
	ret
	
DOOUT:	out	portc,r16	;out data
	sbi	portD,7		;打开DO锁存
	nop
	cbi	portD,7
	ret	
	
;**********************	
;********主程序********
;**********************
;.cseg
;.org	0x01b6
RESET:
	ldi	R16,low(RAMEND)	;设置堆栈
	out	SPL,R16
	ldi	R16,high(RAMEND)
	out	SPH,R16
	
	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,$28	 	;8279写控制寄存器
	out	portd,r16	
	ldi	r16,$d1		;清8279寄存器
	out	portb,r16
	sbi	portd,4
	clr	r16
	out	ddrb,r16
	ldi	r16,$30
	out	portd,r16
wait:	sbis	portb,7		;等待清除结束
	rjmp	wait
	cbi	portd,4
	sbi	portd,3	
	ser	r16
	out	ddrb,r16	;B口方向输出
	
	clr	R16
	out	admux,R16	;ADC  0通道
	ldi	R16,$85		;设置ADC转换,中断触发,ADC为单次模式且32M分频
	out	adcsr,R16
	sbi	adcsr,adif	;写1复位中断为0
	sbi	adcsr,6		;启动ADC
	
	ldi	r27,$01		;把EEP中的参数映射到SRAM的0X0100~0X0118处
	ldi	r26,$00		;x >>> $0100
EEpRead:rcall	eeread
	st	x+,r16
	cpi	r26,$1a
	brne	EEpRead
	
	ldi	r16,$98		;初始化COM
        out	ucr,r16		;设置UART控制寄存器---UCR
        lds	r16,$0114	;SRAM 0X0114>>>R16
	out	ubrr,r16	;设置UART波特率
	rcall	cansujs1	;^^^^^^^^^^^^^^^^^^^^
	rcall	cansujs2	;^^^^^^^^^^^^^^^^^^^^	
	ldi	r16,$3		;INT0上升沿触发 0b00000011   
	out	mcucr,r16
	ldi	r16,$05		;Timer1设置为CK/1024分频
	out	tccr1b,r16
	ldi	r16,$e1
	ldi	r17,$7c
	out	tcnt1h,r16
	out	tcnt1l,r17
		
	ldi	r16,$4		;$80=0b00000100
	out	timsk,r16	;toie1=1允许timer中断

	ldi	r16,$40		
	out	GIMSK,R16	;INT0可用,INT1屏蔽 0b01000000
	out	GIFR,r16
	sei
	wdr			;看门狗复位	
	ldi	R16,$0f		;0b00001111
	out	WDTCR,R16	;狗周期2048MS	

	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
	ldi	r29,$00
	ldi	r28,$60
	clr	r16		;显示通道号
sys1:	st	Y+,r16		;$0060通道号锁定
	cpi	r28,$70
	brne	sys1
	ldi	r28,$b6
sys2:	st	Y+,r16		;温度偏差
	cpi	r28,$c0
	brne	sys2
	ldi	r28,$c6
sys3:	st	Y+,r16		;湿度偏差
	cpi	r28,$d0
	brne	sys3
	ldi	r28,$d8
sys4:	st	Y+,r16		;AO输出
	cpi	r28,$e0
	brne	sys4
	sts	$011a,r16	;DO OUT		
	sts	$011b,r16	;静音
	rcall	beep		;系统初始化成功

main:	wdr
	clr	r29		;Y >>>>> SRAM 00d0 处
 	ldi	r28,$d0
 	rcall	ADC1
	sbi	porta,3
	cbi	porta,4
	cbi	porta,5
	st	y,r16		;传开关量到 00d0
	sts	$00a0,r2	;传A0L >>>  00a0
	sts	$00a1,r3	;传A0H >>>  00a1
	rcall	wendu
	std	y+16,r8		;传A0L >>>  00e0
	std	y+17,r9		;传A0H >>>  00e1
	
	rcall	ADC1
	cbi	porta,3
	sbi	porta,4
	cbi	porta,5
	std	y+1,r16		;传开关量到 00d1
	sts	$00a2,r2	;传A1L >>>  00a2
	sts	$00a3,r3	;传A1H >>>  00a3
	rcall	shidu
	std	y+18,r8		;传A1L >>>  00e2
	std	y+19,r9		;传A1H >>>  00e3
	
	rcall	ADC1
	sbi	porta,3
	sbi	porta,4
	cbi	porta,5
	std	y+2,r16		;传开关量到 00d2
	rcall	wendu
	std	y+20,r8		;传A2L >>>  00e4
	std	y+21,r9		;传A2H >>>  00e5
	
	rcall	ADC1
	cbi	porta,3
	cbi	porta,4
	sbi	porta,5
	std	y+3,r16		;传开关量到 00d3
	rcall	shidu
	std	y+22,r8		;传A3L >>>  00e6
	std	y+23,r9		;传A3H >>>  00e7
	
	rcall	ADC1
	sbi	porta,3
	cbi	porta,4
	sbi	porta,5
	std	y+4,r16		;传开关量到 00d4
	rcall	wendu
	std	y+24,r8		;传A4L >>>  00e8
	std	y+25,r9		;传A4H >>>  00e9
	
	rcall	ADC1
	cbi	porta,3
	sbi	porta,4
	sbi	porta,5
	std	y+5,r16		;传开关量到 00d5
	rcall	shidu
	std	y+26,r8		;传A5L >>>  00ea
	std	y+27,r9		;传A5H >>>  00eb
	
	rcall	ADC1
	sbi	porta,3
	sbi	porta,4
	sbi	porta,5
	std	y+6,r16		;传开关量到 00d6
	rcall	wendu
	std	y+28,r8		;传A6L >>>  00ec
	std	y+29,r9		;传A6H >>>  00ed

⌨️ 快捷键说明

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