📄 programroutines.asm
字号:
;------------------------------------------------------------------------------------------------------
;Name :ProgramRoutines
;------------------------------------------------------------------------------------------------------
.cseg
.org SegmentProgramRoutines
;------------------------------------------------------------------------------------------------------
UpdateInterruptFlag: ;Set InterruptFlag whenever interrupts
ori ProgramFlagRegister,SetInterruptFlag
ret
;------------------------------------------------------------------------------------------------------
AccelerometterCalibration: ;calibrate the accelerometter
ldi TempRegisterB,_CALLIBRATION_TIMES
ldi TempRegister,0x00
clr AccelerationZeroRegisterLow
clr AccelerationZeroRegisterHigh
AccelerometterCalibrationInLoop:
out TCCR1B,TempRegister
out TCNT1H,TempRegister
out TCNT1L,TempRegister
Accelerometter1stEdge: ;Do 16 measurements and divide
sbic PIND,PinAccelerometter ;their summary with 16 (Average)
rjmp Accelerometter1stEdge
Accelerometter2ndEdge:
sbis PIND,PinAccelerometter ;the average is the ZERO Acceleration
rjmp Accelerometter2ndEdge
ldi TempRegister,0x01
out TCCR1B,TempRegister
nop
nop
nop
nop
nop
nop
Accelerometter3rdEdge:
sbic PIND,PinAccelerometter
rjmp Accelerometter3rdEdge
clr TempRegister
out TCCR1B,TempRegister
in AccelerationTimeRegisterLow,TCNT1L
in AccelerationTimeRegisterHigh,TCNT1H
add AccelerationZeroRegisterLow,AccelerationTimeRegisterLow
adc AccelerationZeroRegisterHigh,AccelerationTimeRegisterHigh
out TCNT1H,TempRegister
out TCNT1L,TempRegister
ldi TempRegister,_25_MSEC
rcall Delaymsec
dec TempRegisterB
cpi TempRegisterB,0
breq CallibrationDivision
rjmp AccelerometterCalibrationInLoop
CallibrationDivision:
sbrc AccelerationZeroRegisterLow,3
ldi TempRegister,16
add AccelerationZeroRegisterLow,TempRegister
ldi TempRegister,4
CallibrationDivisionInLoop:
lsr AccelerationZeroRegisterHigh
ror AccelerationZeroRegisterLow
dec TempRegister
cpi TempRegister,0
brne CallibrationDivisionInLoop
ret
;------------------------------------------------------------------------------------------------------
UpdateLine1: ;Update LCD's line 1
rcall Line1
ldi ZH,High(2*MessageTime) ;write a standart message "TIME:"
ldi ZL,Low(2*MessageTime)
rcall LoadMessage
mov TempRegister,HourRegister ;and the current time counter
rcall UpdateCharacters
mov TempRegister,DisplayCharacterB
rcall LCDData
mov TempRegister,DisplayCharacterA
rcall LCDData
ldi TempRegister,_CHAR_UP_DOWN_DOT
rcall LCDData
mov TempRegister,MinuteRegister
rcall UpdateCharacters
mov TempRegister,DisplayCharacterB
rcall LCDData
mov TempRegister,DisplayCharacterA
rcall LCDData
ldi TempRegister,_CHAR_UP_DOWN_DOT
rcall LCDData
mov TempRegister,SecondRegister
rcall UpdateCharacters
mov TempRegister,DisplayCharacterB
rcall LCDData
mov TempRegister,DisplayCharacterA
rcall LCDData
ret
;------------------------------------------------------------------------------------------------------
UpdateLine2: ;Update LCD's line 2
rcall Line2 ;Check if the current acceleration measurement
cpi AccelerationTimeRegisterLow,127 ;is positive or negative
brlo PossitiveAcceleration
NegativeAcceleration:
ldi ZH,High(2*MessageAccelerationMinus) ;write a standart message "Acc/tion:-"
ldi ZL,Low(2*MessageAccelerationMinus)
rcall LoadMessage
mov TempRegister,AccelerationTimeRegisterLow
subi TempRegister,255
mov AccelerationTimeRegisterLow,TempRegister
com AccelerationTimeRegisterLow
inc AccelerationTimeRegisterLow
rjmp AccelerationMessageOk
PossitiveAcceleration:
ldi ZH,High(2*MessageAcceleration) ;write a standart message "Acc/tion:"
ldi ZL,Low(2*MessageAcceleration)
rcall LoadMessage
AccelerationMessageOk:
rcall MakeMeasurementInmg ;and the current acceleration measurement
mov TempRegister,AccelerationTimeRegisterLow
rcall UpdateCharacters
ldi TempRegister,_ASCII_0
rcall LCDData
mov TempRegister,DisplayCharacterC
rcall LCDData
mov TempRegister,DisplayCharacterB
rcall LCDData
mov TempRegister,DisplayCharacterA
rcall LCDData
ldi ZH,High(2*Messagemg)
ldi ZL,Low(2*Messagemg)
rcall LoadMessage
ret
;------------------------------------------------------------------------------------------------------
AccelerometterMeasurement: ;acceleration measurement subroutine
clr TempRegister ;measurement:
out TCCR1B,TempRegister ;128-------------0--------------127
out TCNT1H,TempRegister ;-1g------------0g--------------1g
out TCNT1L,TempRegister
WaitForLowEdge1:
sbic PIND,PinAccelerometter
rjmp WaitForLowEdge1
WaitForHighEdge2:
sbis PIND,PinAccelerometter
rjmp WaitForHighEdge2
ldi TempRegister,1
out TCCR1B,TempRegister
nop
nop
nop
nop
nop
nop
WaitForHighEdge3:
sbic PIND,PinAccelerometter
rjmp WaitForHighEdge3
clr TempRegister
out TCCR1B,TempRegister
in AccelerationTimeRegisterLow,TCNT1L
in AccelerationTimeRegisterHigh,TCNT1H
sub AccelerationTimeRegisterLow,AccelerationZeroRegisterLow
sbc AccelerationTimeRegisterHigh,AccelerationZeroRegisterHigh
rcall MakeMeasurementByte
ret
;------------------------------------------------------------------------------------------------------
MakeMeasurementByte: ;Encode the 16bit measurement in abyte
ldi TempRegister,0
lsr AccelerationTimeRegisterHigh
ror AccelerationTimeRegisterLow
lsr AccelerationTimeRegisterHigh
ror AccelerationTimeRegisterLow
adc AccelerationTimeRegisterLow,TempRegister
ret
;------------------------------------------------------------------------------------------------------
MakeMeasurementInmg: ;make the measurement in "mg"
rcall DivisionBy10
rcall MultiplicationResultWith8
ret
;------------------------------------------------------------------------------------------------------
DivisionBy10:
ldi DelayRegisterB,_DIVISOR ;Divisor
clr TempRegisterB ;Remainder
clr TempRegister ;Result
DivisionInLoop1:
add TempRegisterB,DelayRegisterB
inc TempRegister
cp TempRegisterB,AccelerationTimeRegisterLow
breq NoRemainder
brlo DivisionInLoop1
sub TempRegisterB,DelayRegisterB
dec TempRegister
sub AccelerationTimeRegisterLow,TempRegisterB
WithRemainder:
mov TempRegisterB,AccelerationTimeRegisterLow
cpi TempRegisterB,6
brlo DivisionResults
inc TempRegister
DivisionResults:
mov AccelerationTimeRegisterLow,TempRegister
ret
NoRemainder:
clr TempRegisterB
rjmp DivisionResults
;------------------------------------------------------------------------------------------------------
MultiplicationResultWith8:
lsl AccelerationTimeRegisterLow
lsl AccelerationTimeRegisterLow
lsl AccelerationTimeRegisterLow
ret
;------------------------------------------------------------------------------------------------------
UpdateCharacters: ;find the BCD result
clr DisplayCharacterC
clr DisplayCharacterB
clr DisplayCharacterA
CharacterC:
cpi TempRegister,100
brlo CharacterB
inc DisplayCharacterC
subi TempRegister,100
rjmp CharacterC
CharacterB:
cpi TempRegister,10
brlo CharacterA
inc DisplayCharacterB
subi TempRegister,10
rjmp CharacterB
CharacterA:
cpi TempRegister,1
brlo UpdateNumbers
inc DisplayCharacterA
subi TempRegister,1
rjmp CharacterA
UpdateNumbers:
mov TempRegister,DisplayCharacterC
rcall UpdateNumber
mov DisplayCharacterC,TempRegister
mov TempRegister,DisplayCharacterB
rcall UpdateNumber
mov DisplayCharacterB,TempRegister
mov TempRegister,DisplayCharacterA
rcall UpdateNumber
mov DisplayCharacterA,TempRegister
ret
;------------------------------------------------------------------------------------------------------
UpdateNumber: ;find the ASCII characters for the LCD
cpi TempRegister,9
breq ItIsNumber9
cpi TempRegister,8
breq ItIsNumber8
cpi TempRegister,7
breq ItIsNumber7
cpi TempRegister,6
breq ItIsNumber6
cpi TempRegister,5
breq ItIsNumber5
cpi TempRegister,4
breq ItIsNumber4
cpi TempRegister,3
breq ItIsNumber3
cpi TempRegister,2
breq ItIsNumber2
cpi TempRegister,1
breq ItIsNumber1
ItIsNumber0:
ldi TempRegister,_NUMBER0
ret
ItIsNumber9:
ldi TempRegister,_NUMBER9
ret
ItIsNumber8:
ldi TempRegister,_NUMBER8
ret
ItIsNumber7:
ldi TempRegister,_NUMBER7
ret
ItIsNumber6:
ldi TempRegister,_NUMBER6
ret
ItIsNumber5:
ldi TempRegister,_NUMBER5
ret
ItIsNumber4:
ldi TempRegister,_NUMBER4
ret
ItIsNumber3:
ldi TempRegister,_NUMBER3
ret
ItIsNumber2:
ldi TempRegister,_NUMBER2
ret
ItIsNumber1:
ldi TempRegister,_NUMBER1
ret
;------------------------------------------------------------------------------------------------------
LoadMessage: ;call a string from flash memmory
lpm
tst r0
breq LoadMessageEnd
mov TempRegister,r0
rcall LCDData
adiw ZL,1
rjmp LoadMessage
LoadMessageEnd:
ret
;------------------------------------------------------------------------------------------------------
MessageAcceleration:
.db "Acc/tion: ",0
;------------------------------------------------------------------------------------------------------
MessageAccelerationMinus:
.db "Acc/tion:-",0
;------------------------------------------------------------------------------------------------------
MessageTime:
.db "Time: ",0
;------------------------------------------------------------------------------------------------------
Messagemg:
.db "mg",0
;------------------------------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -