📄 f_3.asm
字号:
.include "c:\appnotes\2333def.inc"
.org $000
rjmp main
.org $006
rjmp timer0
.org $007
rjmp SPI_TXC
.org $00d
MAIN:;********************************************************
;
; initialize MCU system
;
sbi DDRD,0
cbi PORTD,0
;rcall delay
sbi DDRD,0
cbi PORTD,0 ; define PD0 output 0 to ensure relay close POWER ON
ser r16
out DDRC,r16 ;portc is output mode and turn off all LEDS
ldi r17,$df
out SPL,r17
ldi r25,$80
out SREG,r25 ;Enable globle interrupt
ldi r20,$00
out ADCSR,r20 ;Disnable ADC
ldi r17,$0f
out WDTCR,r17;enable wacthdog
wdr ;reset wachdog
ldi r17,$02
out TIMSK,r17;enable timer0 overflow
sbi DDRB,3 ;set MOSI(PB.3) output mode whwn SPI is master.
sbi DDRB,5 ;set SCK (PB.5) output mode when SPI is master
sbi DDRB,2 ;set SS output mode so that this byte cann't
;influence SPI master work mode .
ldi r17,0b11111100
out SPCR,r17 ;set SPIE,SPE,MSTR,CPOL,CPHA ,reset the others
ldi r25,$80
out GIMSK,r25 ;enable INT1
;
;**********************************************************
;
;main programme is used to output PWM wave and display LED
;r26 is used to record time value
;r27 is used to record magnetic field trength
;
display: sbi DDRD,0
cbi PORTD,0
clr r17
out EEAR,r17
sbi EECR,EERE ;this instruction need 4 cycles and halt CPU 2 cycles
sbi EECR,EERE
read_1:sbic EECR,0
rjmp read_1
in r26,EEDR ; read last time r26 value
inc r17
out EEAR,r17
sbi EECR,EERE
sbi EECR,EERE
read_2:sbic EECR,0
rjmp read_2
in r27,EEDR ; read last time r27
; clr r26 ;r26 is used to record time value
; clr r27 ;r27 is used to record magnetic field trength
cpi r27,$05
brpl larger
rjmp small
larger: ldi r27,$00
rjmp m_d
small : cpi r27,-4
brmi larger ;if last time r27 in EEPROM >90 or <10 reset r27=0 system defaut
m_d: rcall m_leddisp
rcall t_leddisp
k3:sbic PIND,6
rjmp k4
rcall delay
sbic PIND,6
rjmp k3
rcall delay1
rjmp md
k4:sbic PIND,7
rjmp display
rcall delay
sbic PIND,7
rjmp k4
rcall delay1
cd: ldi r17,$01
mov r8,r17 ;set PWM output original value
ldi r17,$00
out TCNT0,r17;timer0 up count FF
ldi r17,$05
out TCCR0,r17;CK/1024 and star counting
clr r2
clr r3
clr r4
disp: wdr
rcall pwm_output
mov r18,r2
cpi r18,255 ; if timer0 overflow 255 times t=256*256*1024/8MHz
breq again
rjmp disp
again: inc r4
ldi r19,2
cp r4,r19
breq d_t
clr r2
rjmp disp
d_t: rcall define_time
inc r3
nop ; r24 is selected to define time value
cp r3,r24 ; this instruction is used to confirm PWM output time
breq stop_pwm
clr r4
clr r2
rjmp disp
stop_pwm: clr r17
out TCCR1B,r17
out TCCR0,r17
rcall delay1
zero1: sbic EECR,EEWE
rjmp zero1
out EEAR,r17 ;write time value r26 into EEPROM
out EEDR,r26
sbi EECR,EEMWE
sbi EECR,EEWE
inc r17
zero2: sbic EECR,1
rjmp zero2
out EEAR,r17 ;write magnetic field trength r27 into EEPROM
out EEDR,r27
sbi EECR,EEMWE
sbi EECR,EEWE
rcall delay
power_off:sbi DDRD,0
sbi PORTD,0 ; define PD0 output 1 to ensure relay open POWER OFF
sbi DDRD,0
sbi PORTD,0
rcall delay1
rcall delay1
rcall delay1
rcall delay1
rjmp display
;---------------------------------------------------------------;
md: ; clr r26 ;r26 is used to record time value
; clr r27 ;r27 is used to record magnetic field trength
m_wait_k1: rcall m_leddisp
sbic PIND,4
rjmp m_k2_press
rcall delay
sbic PIND,4
rjmp m_wait_k1
compare: inc r27
cpi r27,$05
brpl addset_r27 ;k1 press down 4 times display "90" and cann't increase again
rcall m_leddisp
rcall delay1
sbic PIND,7
rjmp m_wait_k1
rcall delay
sbic PIND,7
rjmp m_wait_k1
rjmp cd
addset_r27: ldi r27,4
m_k2_press:sbic PIND,5
rjmp m_k4_press
rcall delay
sbic PIND,5
rjmp m_k2_press
min_comp: nop
dec r27
cpi r27,-4
brmi minset_r27 ; k2 press down 4 times display "10" and cann't decrease again
rcall m_leddisp
rcall delay1
sbic PIND,7
rjmp m_k2_press
rcall delay
sbic PIND,7
rjmp m_k2_press
rjmp cd
minset_r27: ldi r27,-4
m_k4_press: sbic PIND,7
rjmp k3_again
rcall delay
sbic PIND,7
rjmp m_k4_press
rjmp cd
rcall delay2
k3_again: sbic PIND,6
rjmp m_wait_k1
rcall delay
sbic PIND,6
rjmp k3_again
rcall delay1
t_wait_k1: rcall t_leddisp
sbic PIND,4
rjmp t_k2_press
rcall delay
sbic PIND,4
rjmp t_wait_k1
t_compare: inc r26
cpi r26,13
brpl taddset_r26 ;k1 press down 4 times display "90" and cann't increase again
rcall t_leddisp
rcall delay1
sbic PIND,7
rjmp t_wait_k1
rcall delay
sbic PIND,7
rjmp t_wait_k1
rjmp cd
taddset_r26: ldi r26,12
t_k2_press:sbic PIND,5
rjmp t_k4_press
rcall delay
sbic PIND,5
rjmp t_k2_press
tmin_comp: nop
dec r26
cpi r26,-3
brmi tminset_r26 ; k2 press down 4 times display "10" and cann't decrease again
rcall t_leddisp
rcall delay1
sbic PIND,7
rjmp t_k2_press
rcall delay
sbic PIND,7
rjmp t_k2_press
rjmp cd
tminset_r26: ldi r26,-3
t_k4_press: sbic PIND,7
rjmp t_k3_again
rcall delay
sbic PIND,7
rjmp t_k4_press
rjmp cd
t_k3_again: sbic PIND,6
rjmp t_wait_k1
rcall delay
sbic PIND,6
rjmp t_k3_again
rcall delay1
rjmp m_wait_k1
SPI_TXC: sbi SPCR,4
reti
timer0: inc r2
reti
delay:ldi r21,$01
d2:ldi r22,$01
d1:ldi r23,$0ff
d0:dec r23
wdr
brne d0
dec r22
brne d1
dec r21
brne d2
ret
delay1:ldi r21,$08
d21:ldi r22,$0ff
d11:ldi r23,$0ff
d01:dec r23
wdr
brne d01
dec r22
brne d11
dec r21
brne d21
ret
delay2:ldi r21,$01
d22:ldi r22,$01
d12:ldi r23,$0ff
d02:dec r23
wdr
push r21
push r22
push r23
rcall m_leddisp
rcall t_leddisp
pop r23
pop r22
pop r21
brne d02
dec r22
brne d12
dec r21
brne d22
ret
;------------------------------------------------------
t_leddisp: cpi r26,-3
brne time_60
time_30 : nop
;----------------------
ldi r20,$00 ; r20 is content of display word
out SPDR , r20
ldi r17,0b0000100 ; display byte PC.2
out PORTC,r17
rcall delay
rcall turn_off
; ---------------------display PC.2 first byte of time value
ldi r20 ,$4f
out SPDR , r20
ldi r17,0b00001000 ; display byte PC.3
out PORTC,r17 ;PC.3 output 1 ,
rcall delay
rcall turn_off
;-------------------display PC.3 second byte of time value
rcall b4_d0
ret
;-------------------- ; PC.4 display "0"
time_60: cpi r26,-2
brne time_90
;----------------------
ldi r20,$00
out SPDR , r20
ldi r17,0b0000100 ; display byte PC.2
out PORTC,r17
rcall delay
rcall turn_off
; ---------------------display PC.2 first byte of time value
ldi r20 ,$7d
out SPDR , r20
ldi r17,0b00001000 ; display byte PC.3
out PORTC,r17
rcall delay
rcall turn_off
;-------------------display PC.3 second byte of time value
rcall b4_d0
ret
;-------------------- ; PC.4 display "0"
time_90: cpi r26,-1
brne time_120
;----------------------
ldi r20,$00
out SPDR , r20
ldi r17,0b0000100 ; display byte PC.2
out PORTC,r17
rcall delay
rcall turn_off
; ---------------------display PC.2 first byte of time value
ldi r20 ,$6f
out SPDR , r20
ldi r17,0b00001000 ; display byte PC.3
out PORTC,r17
rcall delay
rcall turn_off
;-------------------display PC.3 second byte of time value
rcall b4_d0
ret
;-------------------- ; PC.4 display "0"
time_120: cpi r26,0
brne time_150
;----------------------
ldi r20,$06
out SPDR , r20
ldi r17,0b0000100 ; display byte PC.2
out PORTC,r17
rcall delay
rcall turn_off
; ---------------------display PC.2 first byte of time value
ldi r20 ,$5b
out SPDR , r20
ldi r17,0b00001000 ; display byte PC.3
out PORTC,r17
rcall delay
rcall turn_off
;-------------------display PC.3 second byte of time value
rcall b4_d0
ret
;-------------------- ; PC.4 display "0"
time_150: cpi r26,1
brne time_180
;----------------------
ldi r20,$06
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -