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

📄 8363_pedometercode.asm

📁 application note 8363
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	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 + -