Make your own free website on Tripod.com

Isto é um exemplo de rotina, em assembler, para os microcontroladores da linha PIC. Ela tem a capacidade de imprimir qualquer caractere de 7 segmentos em seis displays ao "mesmo tempo".

 

;**************************************************************************
;		Rotina de Display
;**************************************************************************
;
;
display0
	clrf	status0
	clrf	tect
	comf	tect,f
;
display01
	comf	tect,f
	btfsc	mode,0		;testa modo de programacao
	goto	display1
	btfsc	tect,0
	goto	display02
	movf	prog,w		;carrega w com valor de temp prog
	movwf	display		;1100100b=64h=100d
	clrf	cem0
	goto	display2
;
display02
	bsf	tect,0
	movf	tempera,w
	movwf	display
	clrf	cem0
	goto	display2
;
display1
	btfsc	tect,0
	goto	display101
	movf	progu,w		;move umid. prog. pra w
	movwf	display		;move w pra display
	clrf	status0
	clrf	cem0
	movlw	0x64		;carrega w com 100d
	goto	display2
;
display101
	bsf	tect,0
	movf	umide,w
	movwf	display
	clrf	status0
	clrf	cem0
	movlw	0x64		;carrega w com 100d
;
display2
	movlw	0x64		;carrega w com 100d	
	subwf	display,f	;display - 100d
	btfss	status0,c	;testa se subtracao de positivo ou nao	
	goto	display3	
	incf	cem0,f		;movlw	0x01		;carrega w com 1
	goto	display2
				;goto	display4
;
display3
	addwf	display,f		;display + 100
	movf	cem0,w
;
display4
	call 	table		;chama tabela de conversao pra 7 seg.
	btfsc	tect,0
	goto	display40
	movwf	cem1
	goto	display401
;
display40
	movwf	cem2
;
display401
	clrf	status0
	movlw	0x0a		;carrega w com 10d
	clrf	decim0
;
display5
	subwf	display,f	;f - w
	btfss	status0,c	;testa se - ou +
	goto	display6
	incf	decim0,f	;incrementa bcd
	goto	display5
;
display6
	addwf	display,f	;f + w
	movf	decim0,w
	call	table		;bcd p/ 7 segmentos
	btfsc	tect,0
	goto	display60
	movwf	decim1		;carrega decim1 c/ valor em 7 segm.
	goto	display601
;
display60
	movwf	decim2
;
display601
	clrf	status0	
	movlw	0x01		;carrega w c/ 1
	clrf	unid0
;
display7
	subwf	display,f	;f - w
	btfss	status0,c	;testa se deu - ou +
	goto	display8
	incf	unid0,f		;incrementa unidade bcd
	goto	display7
;
display8
	movf	unid0,w		;carrega w c/ unidade em bcd
	call	table		;chama conversao p/ 7 segmentos
	btfsc	tect,0
	goto	display80
	movwf	unid1		;carrega unid1 c/ valor em 7 segmentos
	goto	display801
;
display80
	movwf	unid2
;
display801
	btfss	tect,0
	goto	display01
	goto	display_atual	;call	display_atual
;	return
;
display_atual
;	movf	cem1,w
;	movwf	portc
	clrf	status0
	movlw	0x3f
	subwf	cem1,w
	btfsc	status0,z
	clrf	cem1
	movf	cem1,w
	movwf	portc
	btfss	mode,1
	goto	display_atual1
	bsf	portc,4
	bcf	portc,5
	goto	display_atual2
;
display_atual1
	bcf	portc,4
	bsf	portc,5
;
display_atual2
;selecao
	bsf	portb,0		;1  
	call 	display_temp
;limpa selecao
	bcf	portb,0
	movf	decim1,w
	movwf	portc
;selecao
	bsf	portb,2
	call 	display_temp
;limpa selecao
	bcf	portb,2
	movf	unid1,w
	movwf	portc
;selecao
	bsf	portb,3
	call 	display_temp
;limpa selecao
	bcf	portb,3
	clrf	status0
	movlw	0x3f
	subwf	cem2,w
	btfsc	status0,z
	clrf	cem2
	movf	cem2,w
	movwf	portc
;	bcf	portb,3
;	movf	cem2,w
;	movwf	portc
;selecao
	bsf	portb,6
	call 	display_temp
;limpa selecao
	bcf	portb,6
	movf	decim2,w
	movwf	portc
;selecao
	bsf	portb,7
	call 	display_temp
;limpa selecao
	bcf	portb,7
	movf	unid2,w
	movwf	portc
;selecao
	bsf	portc,7
	call 	display_temp
;limpa selecao
	bcf	portc,7
	return
;
display_temp
	movlw	0x0a
	movwf	esper1
;
esp1	
	movlw	0x0a
	movwf	esper
;
esp	
	decfsz	esper,f		;temporização
	goto	esp
	decfsz	esper1,f	;temp
	goto	esp1
	return
;
	org	0xdc
;
table
	addwf	PC,f
	retlw	0x3f		;0
	retlw	0x06		;1
	retlw	0x5b		;2
	retlw	0x4f		;3
	retlw	0x66		;4
	retlw	0x6d		;5
	retlw	0x7d		;6
	retlw	0x07		;7
	retlw	0x7f		;8
	retlw	0x67		;9
	end