欢迎来到虫虫下载站 | 资源下载 资源专辑 关于我们
虫虫下载站

he313sv1.asm

此程序为热水器控制板用,为我公司资深程序员开发.
ASM
第 1 页 / 共 4 页
字号:
	tst	r16
	breq	DecodeKey05
	
	tst	    ErrorByte
	brne	DecodeKey05    ;故障时按键无效
	
	sbrc	KeyByte , KeySameOn
	rjmp	DecodeKey100

;******************************************************
	lds	r16 , KeyReadByte
	cpi	r16 , KeyOnOff
	brne	DecodeKey20
	;-------开/关键--------
	mov	r16 , SetByte
	ldi	r17 , 0b00000001
	eor	r16 , r17
	andi	r16 , 0b11111101  ;syg debug 09.21
	mov	SetByte , r16
	clr	r16
	sts	SetDelay , r16
	sts	TimerDispDelay , r16
	sbrs   setbyte,setonoff
	rjmp	DecodeKey95
	sbrc   setbyte,settimerA
    rjmp    decodekey95
    set
	bld    askbyte,HeaterAsk
	clt
	bld    runbyte,keeprun
;	bld    SystemByte,beepover
	rjmp   decodekey95
;********************************************************
DecodeKey20:
	sbrs	SetByte , SetOnOff	
	rjmp	DecodeKey98

	cpi  	r16 , keyset
	brne	DecodeKey30

;------;设置键-------
SetKey10:
	ldi	r16 , SetDelayInit
	sts	SetDelay , r16
	lds	r16 , SetSP
	inc	r16
	cpi	r16 , 12 
	brcs    SetKey20	
	clr	r16
	sts	SetDelay , r16
SetKey20:
	sts	SetSP , r16
	lsl	r16
	ldi	r30 , low(SetTab*2)
	ldi	r31 , high(SetTab*2)	
	add	r30 , r16
	brcc	SetKey25
	inc	r31
SetKey25:
	lpm	r16 , Z+
	lpm	r17 , Z
	sts	SetLowLimite , r16
	sts	SetHighLimite, r17
	rjmp	SetKey90
SetKey40:
	;--------Ask to display timer time-------
	ldi	r16 , TimerDispInit
	sts	TimerDispDelay , r16
	rcall TimerDispLogic

SetKey90:
	rjmp	DecodeKey95
	
;********************************************************************************
DecodeKey30:
	cpi	r16 , keynow
	brne	DecodeKey40
	
	;-----即时键--------
   
	ldi		r16 , 0b00001100
	and		r16 , SetByte
	tst		r16
	breq	now_key20
now_key10:
	ldi	r16 , (1<<SetNow)
	eor	SetByte , r16

	ldi	r16 , NowDelayInit
	sts	NowDelay , r16

	set
    sbrs    setbyte,setnow
	clt
	bld    askbyte,HeaterAsk
    rjmp   decodekey95

now_key20:              ;没有设置定时模式
    sbrc   runbyte,keeprun
	rjmp   now_key10
	rjmp   decodekey95
 
;==============================================
DecodeKey40:
	cpi	r16 , KeyTime
	brne	DecodeKey50
    ;-------定时键------

    
	clr	r16
	sts	SetDelay , r16
	sts	TimerDispDelay , r16

	sbrc   SetByte , SetTADis
	sbrs   SetByte , SetTBDis
	rjmp   TimerKey10
    ;TA and TB both be disabled
	ldi    r16 , 0b01110011
	and	   SetByte  , r16
	set
	bld     setbyte,setnow
	rjmp	TimerKey50
TimerKey10:
	sbrs   SetByte , SetTADis
	sbrc   SetByte , SetTBDis
	rjmp   TimerKey20
    ;TA and TB both can be enable

	ldi		r16 , 4
	add	    SetByte , r16
	ldi		r16 , 0b01001101   ;clear SetNow
	and	    SetByte  , r16
	set
	sbrs    setbyte,settimerA
    sbrc    setbyte,settimerB
    rjmp	TimerKey50
	bld     setbyte,setnow
	bld     askbyte,heaterask
	rjmp	TimerKey50

TimerKey20:
	sbrs	SetByte , SetTADis
	rjmp	TimerKey30
	ldi	r16 , (1<<SetTimerB)
	eor SetByte , r16      ;cpl SetTimerB
	rjmp	TimerKey40

TimerKey30:
	sbrs	SetByte , SetTBDis
	rjmp	TimerKey40
	ldi	r16 , (1<<SetTimerA)
	eor SetByte , r16      ;cpl SetTimerA
TimerKey40:
	ldi		r16 , 0b01111101   ;clear SetNow
	and	    SetByte  , r16

    set    
    sbrc   setbyte,setsts
    sbrc   setbyte,settimera
    rjmp    decodekey95
	sbrs   setbyte,settimerb
	bld    setbyte,setnow

TimerKey50:
	rjmp	DecodeKey95
;==================================================
DecodeKey50:
	cpi	r16 , keystsmode
	brne	DecodeKey60
   
	;-------模式键--------

	ldi	r16 , (1<<SetSTS)
	eor	SetByte , r16

 	clr  r16
	sts  roomtempl,r16
	sts  roomtemph,r16

    clt
	bld    UserTrigger,time1h
;	bld    setbyte,setnow

    lds   r16,roomtempbuf
	sbrc  setbyte,setsts
    sts   roomtemp,r16

    set
	sbrc   setbyte,setsts
	bld    SystemByte,roomtempok

    sbrs   setbyte,setsts
    sbrc   setbyte,settimera
    rjmp    decodekey95
	sbrs   setbyte,settimerb
	bld    setbyte,setnow
	rjmp   DecodeKey95


;*******************************************************
DecodeKey60:
	cpi	r16 , KeyDown
	brne	DecodeKey70
	;;------下降键-----
	
    lds   r16, SetDelay
	tst   r16
	brne  DownKey10
	rjmp  Decodekey98
DownKey10:

    ldi	  r16 , SetDelayInit
	sts	  SetDelay , r16

	sbrc  SetByte , SetTimerA  ;
	sbrs  SetByte , SetTimerB  ;
	rjmp  DownKey15            ;
	lds   r16 , SetSP
	cpi   r16 , 4
	brcc  DownKey90
DownKey15:
    lds   r16 , SetSP
	ldi	  r30 , low(SetRamStar -1)
	ldi	  r31 , high(SetRamStar -1)
	add   r30 , r16
	brcc  DownKey20
	inc	  r31
DownKey20:
	ld	r16 , Z
	lds	r18 , SetLowLimite
	lds	r19 , SetHighLimite
	cp	r18 , r16
	brcc	DownKey50    ;setram<=lowlimite	
	lds	 r17 , SetSP
	cpi  r17, 1	
	brne DownKey40
    subi  r16,1
    rjmp  DownKey60
DownKey40:
	dec	r16
	rjmp	DownKey60
DownKey50:	
	mov	r16 , r19
DownKey60:
	st	Z , r16
	rjmp	UpKey90	
DownKey90:
	rjmp	DecodeKey99

;**********************************************************************************
DecodeKey70:
	cpi	r16 , KeyUp
	brne	DecodeKey80

    lds  r16, SetDelay
	tst  r16
	brne  UpKey10
	rjmp  Decodekey98


UpKey10:
	;;------上升-----
	ldi	r16 , SetDelayInit
	sts	SetDelay , r16

	sbrc  SetByte , SetTimerA  ;
	sbrs  SetByte , SetTimerB  ;
	rjmp  UpKey15            ;
	lds   r16 , SetSP
	cpi   r16 , 4
	brcc  UpKey90
UpKey15:
    lds   r16 , SetSP
	ldi	r30 , low(SetRamStar  -1)
	ldi	r31 , high(SetRamStar -1)
	add	r30 , r16
	brcc	UpKey20
	inc	r31
UpKey20:
	ld	r16 , Z
	lds	r18 , SetLowLimite
	lds	r19 , SetHighLimite
	cp	r16 , r19
	brcc	UpKey50    ;setram>=Highlimite
	lds	 r17 , SetSP
	cpi  r17, 1	
	brne UpKey40
	ldi  r17,1
	add  r16,r17
	rjmp UpKey60
UpKey40:
	inc	r16
	rjmp	UpKey60
UpKey50:	
	mov	r16 , r18
UpKey60:
	st	Z , r16

UpKey90:
    lds    r16,setsp
	cpi    r16,1
	brne   decodekey80
	set
	bld    setbyte,setnow
	bld    askbyte,heaterask
	clt
	bld    runbyte,keeprun
DecodeKey80:
	rjmp	DecodeKey99
	

Decodekey100:
	sbrs	SetByte , SetOnOff
	rjmp	DecodeKey99
	lds     r16,setdelay
	tst     r16
	breq    Decodekey99
	lds	    r16 , KeyReadByte
	rjmp	DecodeKey60


Decodekey90:
;	ldi	r16 , SetDelayInit
;	sts	SetDelay , r16

Decodekey95:	
Decodekey99:
Decodekey98:
	ret

;-------------------------------------------
Delay10us:
	nop
	nop
	nop
	nop
	nop
Delay5us:
	nop
	nop
	nop
	ret
;-------------------------------------------;Input:r16
CheckTemp1:	
	ldi		r30 , low(TempTab1*2)
	ldi		r31 , high(TempTab1*2)
CheckTemp10_1:
	lpm		r17 , Z+
	cp		r17 , r16
	brcc	CheckTemp10_1
	subi	r30 , Low(TempTab1*2)+1
	ret
;===========================================================
;Input:r16
CheckTemp:	
	ldi		r30 , low(TempTab*2)
	ldi		r31 , high(TempTab*2)
CheckTemp10:
	lpm		r17 , Z+
	cp		r17 , r16
	brcs	CheckTemp10
	subi	r30 , Low(TempTab*2)+1
	ret

;-------------------------------------------
ReadTemp:
;
	sbrs	UserTrigger , ADCTrigger
	rjmp	ReadTemp90
	clt
	bld	UserTrigger , ADCTrigger

	lds		r18 , WaterADCL
	lds		r19 , WaterADCH
	ldi		r16 , 0b01100000|WaterSenLine
	rcall	ADCRead
	sts		WaterADCL , r18
	sts		WaterADCH , r19


    rcall   delay10us
	rcall   delay10us
	rcall   delay10us
	rcall   delay10us

    lds		r18 , RoomADCL
	lds		r19 , RoomADCH
	ldi		r16 , 0b01100000|RoomSenLine
	rcall	ADCRead
	sts		RoomADCL , r18
	sts		RoomADCH , r19

ReadTemp40:
	lds		r16 , ADCSP
	inc		r16	
	sts		ADCSP , r16
	brne    ReadTemp90

ReadTemp45:
	;-----256 times ADC collection over-------

    lds     r16,roomadch
	cpi	    r16 , RoomLowErr
	brcs    ReadTemp46
    cpi	    r16 , RoomHighErr
	brcc	ReadTemp46
   rcall	CheckTemp1
   
	sts	    RoomTempBuf , r30       ;检测室温
    rjmp    ReadTemp47
ReadTemp46:
    ldi		r16 ,  25
	sts		RoomTempBuf , r16

ReadTemp47: 
	lds	r16 , WaterADCH
	cpi	r16 , ADCLowErr
	brcs    ReadTemp50
	cpi	r16 , ADCHighErr
	brcc	ReadTemp50

	com	r16
	rcall	CheckTemp

	sts	WaterTemp , r30
	rjmp	ReadTemp55
ReadTemp50:
	set
	bld		ErrorByte , WaterSenErr
	ldi		r16 , Zero + 25
	sts		WaterTemp , r16

ReadTemp55:
	sbrc	SystemByte , TempReadOK
	rjmp	ReadTemp60

	clt
	bld	ErrorByte , LeakErr

	lds	r16 , WaterTemp
	sts	TempRem0 , r16
	sts	TempRem1 , r16
	sts	TempRem2 , r16


ReadTemp60:
	set
	bld		SystemByte , TempReadOK

	ldi		r16 , 0
	sts		WaterADCH , r16
	sts		WaterADCL , r16
	sts		RoomADCH , r16
	sts		RoomADCL , r16
	rjmp    ReadTemp90

ReadTemp70:

ReadTemp90:
	ret	
;------------------------------------------
ADCRead:
	out		ADMUX , r16
	ldi		r16 , 0b10000100
	out		ADCSR , r16
	rcall	Delay10us
	rcall	Delay10us
	rcall	Delay10us
	sbi		ADCSR , ADSC
ADCLoop1:
	sbic	ADCSR , ADSC
	rjmp	ADCLoop1
	in		r20 , ADCH

	sbi		ADCSR , ADSC
ADCLoop2:
	sbic	ADCSR , ADSC
	rjmp	ADCLoop2
	in		r21 , ADCH

	sbi		ADCSR , ADSC
ADCLoop3:
	sbic	ADCSR , ADSC
	rjmp	ADCLoop3
	in		r22 , ADCH

	cp		r20 , r21
	brcs    ReadADC10  
	mov     r16 , r20
	mov     r20 , r21
	mov     r21 , r16
ReadADC10:
	cp		r21 , r22
	brcs	ReadADC30
	mov		r16 , r21
	mov		r21 , r22
	mov		r22 , r16
	cp		r20 , r21
	brcs    ReadADC30  
	mov     r16 , r20
	mov     r20 , r21
	mov     r21 , r16
ReadADC30:
	add		r18 , r21
	brcc	ReadADC60
	inc		r19
ReadADC60:	
	ret
;-------------------------------------------
Driver:
    sbrs    setbyte,setonoff
	rjmp    driver100
	clt
	bld	AskByte , UpAsk
	bld	AskByte , DownAsk

	sbrs	AskByte , HeaterAsk
	rjmp	Driver09
Driver02:
	set
	sbrc	ModeByte , UpMode
	bld	AskByte , UpAsk
	sbrc	ModeByte , DownMode
	bld	AskByte , DownAsk


Driver09:
	sbrs  AskByte,UpAsk
	sbrc  AskByte,DownAsk
	rJMP	  Driver091
	clt
	bld   AskByte,NAsk

Driver091:

	lds	r16 , RelayDelay
	tst	r16
	breq	Driver10
	dec	r16
	sts	RelayDelay , r16
	rjmp	Driver90

Driver10:
	mov	r16 , OutByte
	eor	r16 , AskByte
	sbrs	r16 , NAsk
	rjmp	Driver20
	ldi	r18 , (1<<NAsk)
	eor	OutByte , r18
	rjmp	Driver80
Driver20:	
	sbrs	r16 , UpAsk
	rjmp	Driver30
	ldi	r18 , (1<<UpAsk)
	eor	OutByte , r18
	rjmp	Driver80
Driver30:
	sbrs	r16 , DownAsk
	rjmp	Driver90
	ldi	r18 , (1<<DownAsk)
	eor	OutByte , r18

Driver80:
	ldi	r16 , RelayDelayInit
	sts	RelayDelay	, r16
Driver90:
	sbrs	OutByte , DownAsk
	cbi	OutPort , upline;DownLine
	sbrc	OutByte , DownAsk
	sbi	OutPort , upline;DownLine	

;	sbrs	OutByte , UpAsk
;	cbi	OutPort , UpLine
;	sbrc	OutByte , UpAsk
;	sbi	OutPort , UpLine	



	sbrs	OutByte , NAsk
	rjmp	Driver95
	sbrc    BlinkByte0 ,Blink2ms 		
	cbi	OutPort , NLine	
	sbrs    BlinkByte0 ,Blink2ms 
Driver95:
	sbi	OutPort , NLine
Driver99:
	ret

Driver100:
    cbi	OutPort , NLine	
    cbi	OutPort , upline
	ret
;-------------------------------------------
CheckSum:
	;check sum from checkramstart to checkramend
	ldi  Reg0 , 0      ;output low
	ldi  Reg1 , 0      ;output high
	ldi  Reg2 , 0
	ldi  Reg3 , 0
	ldi  r29 , CheckRamEnd-CheckRamStart+1     ;length
	ldi  r30 , low(CheckRamStart)      ;start address low
	ldi  r31 , high(CheckRamStart)     ;start address high
CheckSum10:
	ld   Reg2 ,  Z+
	ADD  Reg0,Reg2
	ADC  Reg1,Reg3
	dec  r29
	brne CheckSum10
	ret
;-------------------------------------------
;Clear r0~r28,and $60~$160
ClearRam:
	ldi  r28 , 0      ;full contents
	ldi  r29 , 27     ;length
	ldi  r30 , 0      ;start address low
	ldi  r31 , 0      ;start address high
ClearRam10:
	st   Z+ , r28
	dec  r29
	brne ClearRam10

    ldi  r29 , $ff
	ldi  r30 , $60
	ldi  r31 , $00

ClearRam20:
	st   Z+ , r28
	dec  r29
	brne ClearRam20
	ret

ResetRam:
	ldi  r28 , 0      ;full contents
	ldi  r29 , 13     ;length
	ldi  r30 , 0      ;start address low
	ldi  r31 , 0      ;start address high
ResetRam10:
	st   Z+ , r28
	dec  r29
	brne ResetRam10

    ldi  r29 , $30
	ldi  r30 , $60
	ldi  r31 , $00

ResetRam20:
	st   Z+ , r28
	dec  r29
	brne ResetRam20
	ret

;========================================================
STSMODE:
    sbrc    setbyte,setsts	
	sbrs    SystemByte,roomtempok
	rjmp    STSMODE90

    clt
	bld     systembyte,roomtempok  

	lds     r16,roomtemp
	cpi     r16,15
	brcs    STSMODE30

	cpi     r16,26
	brcc    STSMODE20
    ldi     r16,SettempSBothA
	rjmp    STSMODE50
STSMODE20:	
    ldi     r16,SettempEstival 
	rjmp    STSMODE50
STSMODE30:
    ldi     r16,SettempWinter 

STSMODE40:  
STSMODE50:
    sts     settempdefault,r16

 STSMODE90:
    RET
;====================================================================
;ROOMTEMP的平均值
RoomTemplogic:
     sbrc     setbyte,setsts
	 sbrs     UserTrigger,time1h
     rjmp     RoomTempLogic90
	 clt
	 bld      UserTrigger,time1h
	 lds      r16,roomtempL
	 lds      r17,roomtempH
	 lds      r18,roomtempbuf
	 clr      r19
	 add      r16 , r18     ;低8位寄存器相加
	 adc      r17 , r19     ;高8位寄存器相加
     sts      roomtempl,r16
     sts      roomtemph,r17
	 lds      r16,roomtempcnt
     inc      r16
	 sts      roomtempcnt,r16
	 cpi      r16,24
	 brne     roomtemplogic90
	
	 clr      reg0
     lds      r16,roomtempl  
roomtemplogic10:
	 sec
	 subi     r16,24
	 brcs     roomtemplogic20
	 inc      reg0
	 rjmp     roomtemplogic10
roomtemplogic20:
      ldi     r17 ,24
      add     r16,r17
      lds     r17,roomtemph
	  tst     r17
	  breq    roomtemplogic30
      dec     r17
	  sts     roomtempH,r17
      inc     reg0
      ldi     r17,220
      add     r16,r17
      rjmp    roomtemplogic10

roomtemplogic30:    
      clc
      rol     r16              ;左移一位*2
	  sec
      subi    r16,24
	  brcs    roomtemplogic40
      inc     reg0    
roomtemplogic40:
      mov     r16,reg0
      sts     roomtemp,r16
      set
	  bld     systembyte,roomtempok  
	  clr     r16
	  sts     roomtempL,R16
	  sts     roomtempH,r16
	  sts      roomtempcnt,r16
RoomTemplogic90:
              ret

;==================================================================




;-------------------------------------------
;   end

⌨️ 快捷键说明

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