📄 8363_pedometercode.asm
字号:
pop del_temp1 ret;*************END OF ROUTINES FOR ANSWERING THE INPUT PORTS*************;************************** DISPLAY DISTANCE****************************disp_dist: rcall clrdisp cli MOV disp_temp1, distR1 MOV disp_temp2, distR2 MOV disp_temp3, distR3 sei LDI div1, $98 ; 1,00,00,000 LDI div2, $96 LDI div3, $80 RCALL ext_3 LDI div1, $0F ; 10,00,000 LDI div2, $42 LDI div3, $40 RCALL ext_3 LDI div1, $01 ; 1,00,000 LDI div2, $86 LDI div3, $A0 RCALL ext_3 LDI div1, $00 ; 10,000 LDI div2, $27 LDI div3, $10 RCALL ext_3 LDI div2, $03; 1,000 LDI div3, $E8 RCALL ext_2 LDI div2, $00; LDI div3, $64; 100 RCALL ext_2; LDI div3, $0A; 10 RCALL ext_1; mov lcd_dat, disp_temp3 adiw lcd_dat, 0b00110000 rcall lcd_all_dat ret;************************** DISPLAY DISTANCE DURING INTERRUPT****************************disp_disti: rcall clrdisp MOV disp_temp1, distR1 MOV disp_temp2, distR2 MOV disp_temp3, distR3 LDI div1, $98 ; 1,00,00,000 LDI div2, $96 LDI div3, $80 RCALL ext_3 LDI div1, $0F ; 10,00,000 LDI div2, $42 LDI div3, $40 RCALL ext_3 LDI div1, $01 ; 1,00,000 LDI div2, $86 LDI div3, $A0 RCALL ext_3 LDI div1, $00 ; 10,000 LDI div2, $27 LDI div3, $10 RCALL ext_3 LDI div2, $03; 1,000 LDI div3, $E8 RCALL ext_2 LDI div2, $00; LDI div3, $64; 100 RCALL ext_2; LDI div3, $0A; 10 RCALL ext_1; mov lcd_dat, disp_temp3 adiw lcd_dat, 0b00110000 rcall lcd_all_dat ret;***************TO DISPLAY VELOCITY******************************disp_vel: rcall clrdisp MOV disp_temp1, re3 MOV disp_temp2, re2 MOV disp_temp3, re1 LDI div1, $98 ; 1,00,00,000 LDI div2, $96 LDI div3, $80 RCALL ext_3 LDI div1, $0F ; 10,00,000 LDI div2, $42 LDI div3, $40 RCALL ext_3 LDI div1, $01 ; 1,00,000 LDI div2, $86 LDI div3, $A0 RCALL ext_3 LDI div1, $00 ; 10,000 LDI div2, $27 LDI div3, $10 RCALL ext_3 LDI div2, $03; 1,000 LDI div3, $E8 RCALL ext_2 LDI div2, $00; LDI div3, $64; 100 RCALL ext_2; LDI div3, $0A; 10 RCALL ext_1; mov lcd_dat, disp_temp3 adiw lcd_dat, 0b00110000 rcall lcd_all_dat ret;***************TO DISPLAY NO OF STEPS************************************disp_step: rcall clrdisp cli MOV disp_temp2, no_stepR1 MOV disp_temp3, no_stepR2 sei LDI div2, $27 ; 10,000 LDI div3, $10 RCALL ext_2 LDI div2, $03; 1,000 LDI div3, $E8 RCALL ext_2 LDI div2, $00; LDI div3, $64; 100 RCALL ext_2; LDI div3, $0A; 10 RCALL ext_1; mov lcd_dat, disp_temp3 adiw lcd_dat, 0b00110000 rcall lcd_all_dat ret;***************TO DISPLAY NO OF STEPS DURING INTERRUPT*************************disp_stepi: rcall clrdisp MOV disp_temp2, no_stepR1 MOV disp_temp3, no_stepR2 LDI div2, $27 ; 10,000 LDI div3, $10 RCALL ext_2 LDI div2, $03; 1,000 LDI div3, $E8 RCALL ext_2 LDI div2, $00; LDI div3, $64; 100 RCALL ext_2; LDI div3, $0A; 10 RCALL ext_1; mov lcd_dat, disp_temp3 adiw lcd_dat, 0b00110000 rcall lcd_all_dat ret;***************TO DISPLAY THE STEP VALUE*********************************disp_step_val: rcall clrdisp mov disp_temp3, step_valR LDI div3, $64; 100 RCALL ext_1; LDI div3, $0A; 10 RCALL ext_1; mov lcd_dat, disp_temp3 adiw lcd_dat, 0b00110000 rcall lcd_all_dat RET;************** To divide a 24 bit number by a 24 bit number ***************** ext_3: clr bcdstart3: cp disp_temp3, div3 cpc disp_temp2, div2 cpc disp_temp1, div1 brcs end3 sub disp_temp3, div3 sbc disp_temp2, div2 sbc disp_temp1, div1 INC bcd rjmp start3end3: mov lcd_dat, bcd ADIW lcd_dat, 0b00110000 rcall lcd_all_dat RET;*********** To divide 16 bit number by a 16 bit number **********************ext_2: clr bcdstart2: cp disp_temp3, div3 cpc disp_temp2, div2 brcs end2 sub disp_temp3, div3 sbc disp_temp2, div2 INC bcd rjmp start2end2: mov lcd_dat, bcd ADIW lcd_dat, 0b00110000 rcall lcd_all_dat RET;*********** To divide a 8 bit number by a 8 bit number ************************ext_1: clr bcdstart1: cp disp_temp3, div3 brcs end1 sub disp_temp3, div3 INC bcd rjmp start1end1: mov lcd_dat, bcd ADIW lcd_dat, 0b00110000 rcall lcd_all_dat RET;*****************Low_Delay: A 250 us delay *****************************low_delay: push low_del push hi_del ldi low_del, 20ld_hi: ldi hi_del, 10loop_in: dec hi_del cpi hi_del, 0 brne loop_in dec low_del cpi low_del, 0 brne ld_hi pop hi_del pop low_del ret;********************* Hi_Delay: A 5 ms delay *****************************hi_delay: push low_del ldi low_del, 25more_call: rcall low_delay dec low_del cpi low_del, 0 brne more_call pop low_del ret;******************* Big_delay: A 1 s delay **********************big_delay: push low_del push hi_del ldi low_del, 250more_big: rcall hi_delay dec low_del cpi low_del, 0 brne more_big pop hi_del pop low_del ret;**********************************************************;Lcd_Low_Cmd1: Sends a command to higher 4 bits of the LCD.;The command nibble must be in the lower nibble of the;variable 'lcd_cmd';**********************************************************lcd_low_cmd1: push temp_lcd mov temp_lcd, lcd_cmd lsl temp_lcd lsl temp_lcd lsl temp_lcd lsl temp_lcd andi temp_lcd, $f0 out PORTB, temp_lcd ori temp_lcd, $08 out PORTB, temp_lcd andi temp_lcd, $f7 out PORTB, temp_lcd pop temp_lcd ret;**********************************************************;Lcd_All_Cmd1: sends an 8 bit command to the LCD;**********************************************************lcd_all_cmd1: push lcd_cmd lsr lcd_cmd lsr lcd_cmd lsr lcd_cmd lsr lcd_cmd rcall lcd_low_cmd1 pop lcd_cmd andi lcd_cmd, $0f rcall lcd_low_cmd1 rcall low_delay ret;**********************************************************;Lcd_Low_Dat: Sends a data nibble to higher 4 bits of the;LCD. The data nibble must be in the lower nibble of the;variable 'lcd_dat';**********************************************************lcd_low_dat: push temp_lcd mov temp_lcd, lcd_dat lsl temp_lcd lsl temp_lcd lsl temp_lcd lsl temp_lcd andi temp_lcd, $f0 ori temp_lcd, 4 out PORTB, temp_lcd ori temp_lcd, 8 out PORTB, temp_lcd andi temp_lcd, $f7 out PORTB, temp_lcd pop temp_lcd ret;**********************************************************;Lcd_All_Dat: Sends a data byte to the LCD. The data byte;is stored in variable 'lcd_dat';**********************************************************lcd_all_dat: push lcd_dat lsr lcd_dat lsr lcd_dat lsr lcd_dat lsr lcd_dat andi lcd_dat, $0f rcall lcd_low_dat pop lcd_dat andi lcd_dat, $0f rcall lcd_low_dat rcall low_delay retclrdisp: ldi lcd_cmd, $01 rcall lcd_all_cmd1 rcall hi_delayret;*********** To note the current time in the tims registers **************************tim: CLI mov tims3, tim3 ; Note the present time in tims registers mov tims2, tim2 mov tims1, tim1 in tims0, tcnt0 SEI; ldi temp_tim, 0b00000101 ; Start the clock again; OUT TCCR0, temp_tim ret;*********** Routine to calculate velocity and call routine for displaying it **********calc_vel: push r17 push r18 push r19 push r20 push r21 push r22 push r23 push r24 push r25 push r26 clr rmh ; clear interim storage clr vel1 ; clear result registers clr vel2 ; clr vel3 ldi const1, $d5 ldi const2, $0f mov step_for_vel, step_valRMULT8a: clc ; clear carry bit ror step_for_vel ; bit 0 to carry, bit 1 to 7 one position to ; the right, carry bit to bit 7 brcc MULT8b ; jump over adding, if carry has a 0 from LSB to MSB add vel1, const1 ; add LSB of const1 to the result adc vel2, const2 adc vel3, rmh ; add carry and MSB of const1MULT8b: clc ; clear carry bit rol const1 ; rotate LSB left (multiply by 2) rol const2 rol rmh ; rotate carry into MSB and MSB one left tst step_for_vel ; all bits zero? brne MULT8a ; if not, go on in the loop in tim_vel1, tcnt0 mov tim_vel2, tim1 mov tim_diff1, tim_vel1 mov tim_diff2, tim_vel2 sub tim_diff1, tim_vel1_bef sbc tim_diff2, tim_vel2_bef mov tim_vel1_bef, tim_vel1 mov tim_vel2_bef, tim_vel2 clr rd1u ; clear interim register clr rd2u; clr re3; clear result clr re2; clr re1 inc re1 ; Here the division loop start_divsdiv8a: clc ; clear carry-bit rol vel1 rol vel2 rol vel3 rol rd1u rol rd2u brcs div8b ; a one has rolled left, so subtract cp rd1u ,tim_diff1 ; Division result 1 or 0? cpc rd2u, tim_diff2 brcs div8c ; jump over subtraction, if smallerdiv8b: sub rd1u, tim_diff1; subtract number to divide with sbc rd2u, tim_diff2 sec ; set carry-bit, result is a 1 rjmp div8d ; jump to shift of the result bitdiv8c: clc ; clear carry-bit, resulting bit is a 0div8d: rol re1 ; rotate carry-bit into result registers rol re2 rol re3 brcc div8a ; as long as zero rotate out of the result ; registers: go on with the division loop ; End of the division reached rcall disp_vel pop r26 pop r25 pop r24 pop r23 pop r22 pop r21 pop r20 pop r19 pop r18 pop r17ret;*********** Routine to initialize the LCD display *****************************init_lcd: rcall hi_delay rcall hi_delay rcall hi_delay ldi lcd_cmd, 3 rcall lcd_low_cmd1 rcall hi_delay ldi lcd_cmd, 3 rcall lcd_low_cmd1 rcall low_delay ldi lcd_cmd, 3 rcall lcd_low_cmd1 rcall low_delay ldi lcd_cmd, $28 ; set 4-bit interface rcall lcd_all_cmd1 ldi lcd_cmd, 8 ; set DDRAM address to 00 rcall lcd_all_cmd1 ldi lcd_cmd, $0e ; Display setting rcall lcd_all_cmd1 ldi lcd_cmd, 6 rcall lcd_all_cmd1 ;mode settings ldi lcd_cmd, $80 rcall lcd_all_cmd1 ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -