p16f877_test.asm

来自「可移植的MicroChip的PIC全系列单片机软件仿真器」· 汇编 代码 · 共 455 行

ASM
455
字号
	list	p=16f877  __config _wdt_off	;; The purpose of this program is to test gpsim's ability to simulate a pic 16f877.	;; (this was derived from the similar program for testing the c64).	include "p16f877.inc"		  cblock  0x20	x,y	t1,t2,t3	pma_string		; starting here's where a string will be copied from flash  endc	;; Take advantage of the upper 16 bytes all banks being aliased  cblock 0x70	adr_cnt	data_cnt	w_temp	status_temp  endcDATA14  macro  _a, _b	data (_a<<7) | (_b)  endm	  org	0	goto	main  org	4	;; Interrupt	;; 	movwf	w_temp	swapf	status,w	movwf	status_temp		btfss	intcon,peie	 goto	exit_int	bcf	status,rp1	bcf	status,rp0	btfss	(pir2 & 0x7f),eeif	 goto	exit_int;;; eeprom has interrupted	bcf	(pir2 & 0x7f),eeifexit_int:	swapf	status_temp,w	movwf	status	swapf	w_temp,f	swapf	w_temp,w	retfiemain:		;; clear ram	movlw	0	call	preset_ram	movlw	0x55	call	preset_ram	movlw	0	call	preset_ram	;; disable (primarily) global and peripheral interrupts		clrf	intcon	call	obliterate_data_eeprom	call	bank_access_test	call	read_program_flash	;;	call	tmr1_test;; 	call	tmr2_test;; 	call	tmr1_test2;; 	call	tmr1_test3;; 	call	pwm_test	goto	$	;; =========================================================	;; read_program_flash	;;	;; Copy a string from program memory to data memory	read_program_flash;;;;;;	clrf	status		; Bank 0	movlw	pma_string	; Pointer to where we'll copy the string	movwf	fsr		movlw	pgm_table_end - pgm_table ; Length of the string	movwf	adr_cnt			  ; (actually 1/2 string length)		bsf	status,rp1	;Point to bank 2	bcf	status,rp0	;	movlw	LOW(pgm_table)	; Start of the string	movwf	eeadr		; in program memory	movlw	HIGH(pgm_table)	movwf	eeadrhpgm_flash_read_loop1:		bsf	status,rp0	; bank 3		bsf	eecon1,eepgd	; program memory (instead of data flash)	bsf	eecon1,rd	; start the read.	bcf	status,rp0	; two cycle delay to read memory	nop		rlf	eedata,w	; Copy the 14bit value that was read	rlf	eedath,w	; from program memory. It's broken into	movwf	indf		; two 7-bit values that are copied to	incf	fsr,f		; data memory	movf	eedata,w	andlw	0x7f	movwf	indf	incf	fsr,f	incf	eeadrh,f	; Next program memory location	incfsz	eeadr,f	 decf	eeadrh,f	decfsz	adr_cnt,f	 goto	pgm_flash_read_loop1	returnpgm_table	DATA14	't','e'	DATA14	's','t'pgm_table_end	;;	;; TMR1 test	;;tmr1_test:		;; Clear all of the bits of the TMR1 control register:	;; this will:	;;	Turn the tmr off	;;	Select Fosc/4 as the clock source	;;	Disable the External oscillator feedback circuit	;;	Select a 1:1 prescale		clrf	t1con		;	bcf	pir1,tmr1if	; Clear the interrupt/roll over flag	;; Zero the TMR1	clrf	tmr1l	clrf	tmr1h	;; Test rollover	;;  the following block of code will test tmr1's rollover for	;; each of the 4 prescale values.		clrf	x	;; Start the timer	bsf	t1con,tmr1ontmr1_test1:	;; Loop until the timer rolls over:	btfss	pir1,tmr1if	 goto	$-1	bcf	pir1,tmr1if		incf	x,f	btfss	x,2	 goto   tmr1_test1	clrf	x	movf	t1con,w	addlw   (1<<t1ckps0)	movwf   t1con	andlw	0x40	skpnz	 goto   tmr1_test1		clrf	t1con	return	;;	;; TMR2 test	;;tmr2_test:	clrf	t2con	movlw	0x40	movwf	t1	clrf	xtmr2_test1:	movf	t1,w	bsf	status,rp0	movwf	pr2	bcf	status,rp0	btfss	t2con,tmr2on	 bsf	t2con,tmr2on		bcf	pir1,tmr2if		btfss	pir1,tmr2if	 goto	$-1	movlw	0x40	addwf	t1,f	incf	x,f	btfss	x,2	 goto	tmr2_test1	returntmr1_test2:		bsf	status,rp0 	bsf	portc,2		;CCP bit is an input	bcf	status,rp0	movlw	7	movwf	ccp1con	;; Start the timer	bsf	t1con,tmr1on	clrf	ytt2:		movf	portc,w	decfsz	x,f	 goto	$-1	decfsz	y,f	  goto	tt2	returntmr1_test3:	bsf	status,rp0 	bcf	portc,2		;CCP bit is an output	bcf	status,rp0	movlw	0xb	movwf	ccp1con	;; Initialize the 16-bit compare register:	movlw	0x34	movwf	ccpr1l	movlw	0x12	movwf	ccpr1htt3:	;;	bcf	pir1,ccp1if		;; Try the next capture mode;; 	incf	ccp1con,f		;; If bit 2 is set then we're through with capture modes	;; (and are starting pwm modes)	btfsc	ccp1con,2	 goto	die	;; Start the timer	bsf	t1con,tmr1on	btfss	pir1,ccp1if	 goto	$-1	goto	tt3pwm_test1:	clrf	status	bsf	status,rp0 	bsf	portc,2		;CCP bit is an input	movlw	0x7f	movwf	pr2	bcf	status,rp0	movlw	0x40	movwf	ccpr1l	clrf	ccpr1h	movlw	4	movwf	t2con	movlw	0xc	movwf	ccp1con	return	die:	goto	$	;; ======================================================	;; preset_ram	;;	;; copy the contents of w to all of rampreset_ram	clrf	status	movwf	0x20		;save the constant	movlw	0x20		;start of ram	movwf	fsr		;use indirect addressing to preset	movf	0x20,w		;get the constantcb0:		movwf	indf		;Preset...	incf	fsr,f		;next register	btfss	fsr,7		;loop until fsr == 0x80	 goto	cb0	bsf	fsr,5		;fsr = 0xa0cb1:		movwf	indf	incfsz	fsr,f		; loop until fsr == 0	 goto	cb1	bsf	fsr,4		;fsr =0x10	bsf	status,7	;irp=1 ==> fsr =0x110cb2:		movwf	indf	incf	fsr,f	btfss	fsr,7		;loop until fsr == 0x80	 goto	cb2	bsf	fsr,4		;fsr == 0x90 (but irp is still set)cb3:		movwf	indf	incfsz	fsr,f	 goto	cb3	clrf	status		;clear irp,rp0,rp1	return	;; =========================================================	;; bank_access_test:	;; 	;; use the indirect register to increment register 0x70.	;; This register is aliased in all four banks.	;; Then use direct addressing to verify that the increment	;; occurred. Note that bank switching is necessary to access	;; 0x70 directly in the other banks (that is to access 0xf0,	;; 0x170 and 0x1f0 directly, you need to switch to bank 1,2	;; or 3 respectively).bank_access_test:			bcf	status,rp0	movlw	0x70	movwf	fsr	clrf	0x70	incf	indf,f	btfss	0x70,0	 goto	$-1	bsf	status,rp0	;bank 1	incf	indf,f	btfsc	0x70,0	 goto	$-1	bsf	status,rp1	;bank 3	incf	indf,f	btfss	0x70,0	 goto	$-1	bcf	status,rp0	;bank 2	incf	indf,f	btfsc	0x70,0	 goto	$-1	bcf	status,rp1	;bank 0	return	obliterate_data_eeprom		clrf	adr_cnt	clrf	data_cnt	incf    data_cnt,f	bsf	intcon,eeiel1:		bsf	status,rp1	;Point to bank 2	bcf	status,rp0	;	movf	adr_cnt,w	movwf	eeadr	movf	data_cnt,W	movwf	eedata	bsf	status,rp0	bcf	intcon,gie	;Disable interrupts while enabling write	bcf	(eecon1 & 0x7f),eepgd	;Point to data and not program mem.	bsf	(eecon1 & 0x7f),wren	;Enable eeprom writes	movlw	0x55		;Magic sequence to enable eeprom write	movwf	(eecon2 & 0x7f)	movlw	0xaa	movwf	(eecon2 & 0x7f)	bsf	(eecon1 & 0x7f),wr	;Begin eeprom write	bsf	intcon,gie	;Re-enable interrupts		btfsc	(eecon1 & 0x7f),wr	;Wait for the write to complete 	 goto	$-1;; 	bcf	status,rp0		incfsz	adr_cnt,f	 goto	l1	incfsz	data_cnt,F	 goto	l1	return				org	0x2100	de	"Linux is cool!",0	de	0xaa,0x55,0xf0,0x0f	de	'g','p','s','i','m'	de	"p16f877_test.asm - a program to test "	de	"eveything an 'f877 can possibly do."			end

⌨️ 快捷键说明

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