ELEKTROLINE

Fényújság LED-es kijelzőn

A következő program alkalmas a LED-es kijelzőkön tetszőleges számú (2..4 DIGIT) és hosszúságú szöveg megjelenítésére. A program TMR0 megszakításhoz van rendelve, így folyamatosan képes megjeleníteni a szöveget.

;PIC16F84 4 MHz
; A PROGRAM A LEDES KIJELZŐN "FÉNYÚJSÁGOT" ÁLLÍT ELŐ (ASCII KÓDDAL)
; TESTRESZABÁS:
;	ASCII KEZDETE 0x20
;	KARAKTERKÓDHOZ KARAKTERMINTA
; 	STRPOS = A KIÍRANDÓ STRING POZICIÓJA A STRING TÁBLÁBAN
; 	STRPOS BEÁLLÍTÁSA: W=STRPOS => CALL SETSTR 
; 	A SZÖVEGET NULLA KARAKTERREL KELL ZÁRNI
;	DIGIT BEÁLLÍTÁS
;	MASK = PORTA KEZDŐLÁB BEÁLLÍTÁS
;	STIME ÉS DTIME BEÁÁLÍTÁSA
;	JErvin © 2004

	list p=16f84, f=inhx8m
	#include 
	__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC

;CONSTANS
DIGIT	EQU 4			; DIGITEK SZÁMA
MASK	EQU B'11110111'		; AZ ELSŐ DIGIT (PORTA MASK)
DTIME	EQU 0x05		; DRAW LASSÍTÁS 
STIME	EQU 0x10		; SHIFT LASSÍTÁSA

;REGISZTEREK
STRPTR	EQU 0x20		; STRING ELEJE MUTATÓ
POS	EQU 0x21		; KARAKTER POZICIO
TMP	EQU 0x22		; TEMP
LO	EQU 0x23		; DTIME REG.
HI	EQU 0x24		; .
SWAIT	EQU 0x26		; STIME REG.
SAVEW	EQU 0x27		; W TÁROLÓJA
BUFFER	EQU 0x40		; KARAKTER BUFFER

;MAKRÓK
BANK1	MACRO			
	BSF STATUS,RP0
	ENDM
	
BANK0	MACRO			
	BCF STATUS,RP0
	ENDM

;VEKTOROK
	ORG	0x0000
	GOTO	GYI
	ORG	0x0004

;INT
	MOVWF	SAVEW		; W MENTÉSE
	BCF	INTCON, GIE	; INT LETILTÁSA
	DECFSZ	SWAIT		; SHIFT VÁRAKOZÁS CSÖKKENTÉSE 
	GOTO	IN1		; :
	MOVLW	STIME		; SHIFT IDŐ VISSZAÁLLÍTÁSA
	MOVWF	SWAIT		; :
	CALL	SHIFT		; ELTOLÁS
IN1
	CALL	DRAW		; KIJELZŐRE ÍRÁS
	BSF	INTCON,GIE	; INT ENGEDÉLYEZÉSE
	BCF	INTCON,T0IF	; TOIF LEKEZELVE
	MOVFW	SAVEW		; W VISSZAÁLLÍTÁSA
	RETFIE			; INT VÉGE

GYI	
	BCF	STATUS,RP1	; BANK1, PORTA, PORTB KIMENET
	BANK1			; 
	CLRF	TRISA		;
	CLRF	TRISB		;
	MOVLW	B'00000000'	; TMR LEOSZTÁSA (NINCS)
	MOVWF	OPTION_REG	;

	BANK0
	MOVLW	0xFF		; PORTA, PORTB KIKAPCSOLÁSA
	MOVWF	PORTA
	MOVWF	PORTB
	MOVLW	STIME		; KEZDŐÉRTÉKEK
	MOVWF	SWAIT
	MOVLW	0x20		; PUFFER FELTÖLTÉSE 'SPACE'
	MOVWF	BUFFER
	MOVWF	BUFFER+1
	MOVWF	BUFFER+2
	MOVWF	BUFFER+3
	MOVLW	.12		; "HELLO " POZICIÓJA 
	CALL	SETSTR		; STRING BEÁLLÍTÁSA ÉS INT ENGED


FOPROGRAM
	NOP
   	GOTO	FOPROGRAM


SETSTR
	BCF	INTCON,GIE	; INT TILT
	MOVWF	STRPTR		; STR MUTATOTO	
	MOVWF	POS		; POZICIO A STRINGBEN
	BSF	INTCON,T0IE	; TMR INT ENGED	
	BSF	INTCON,GIE	; INT ENGED
	RETURN

SHIFT				; PROCEDURE SHIFT
	MOVLW	DIGIT-1		; ELTOLÁSOK SZÁMA
	MOVWF	TMP		; TEMP-BE 
	MOVLW	BUFFER		; BUFFER CÍMÉT AZ FSR-BE
	MOVWF	FSR		; INDEX = BUFFER
SN1						;
	INCF	FSR		; INDEX += 1
	MOVFW	INDF		; W = [INDEX]
	DECF	FSR		; INDEX -= 1	
	MOVWF	INDF		; [INDEX] = W
	INCF	FSR		; INDEX += 1
	DECFSZ	TMP		; ELTOLÁSOK SZÁMÁNAK CSÖKKENTÉSE
	GOTO	SN1		; FOLYTATÁS AMÍG 0 < TMP
	CALL	STRINGS		; KARAKTERKÓD ELHOZÁSA; W=STR[POS]
	ANDLW	0xFF		; AND $FF	
	BNZ	SN2		; HA NEM STRING VEGE UGRÁS
	MOVFW	STRPTR		; W = A STRING ELEJÉRE
	MOVWF	POS		; POS = W
SN2
	CALL	STRINGS		; KARAKTERKÓD ELHOZÁSA; W=STR[POS]
	MOVWF	INDF		; [INDEX] = W
	INCF	POS		; POS += 1
	RETURN	

DRAW				; PROCEDURE DRAW
	MOVLW	BUFFER		; BUFFER CÍMÉT AZ FSR-BE
	MOVWF	FSR		; INDEX = BUFFER
	MOVLW	MASK		; PORTA MASK
	MOVWF	TMP		; TMP = MASK
DN1
	MOVFW	TMP		; W = MASK
	MOVWF	PORTA		; PORTA = W
	MOVFW	INDF		; W = [INDEX]
	INCF	FSR		; INDEX += 1
	CALL	PATTERN		; W = KARAKTERMINTA[KARAKTERKÓD]
	MOVWF	PORTB		; PORTB = W
	CALL	SZUNET		; SZUNET
	RRF	TMP		; MASK (POTRA) ROTÁLÁSA
	BC	DN1		; UGRAS HA CARRY != 0
	RETURN

SZUNET 				; SZÜNET (ÁTLAPOLÁS MIATT)
	MOVLW	DTIME
	MOVWF	HI
	MOVLW	0x00
	MOVWF	LO
T1
	DECFSZ	LO
	GOTO	T1
	DECFSZ	HI
	GOTO	T1
	RETURN

STRINGS				; STRING LEÍRÓK
	MOVFW	POS
	ADDWF PCL, f		; PC = PC + W	
	DT  "0123456789 ", 0
	DT  "HELLO ", 0

	
PATTERN				; KARAKTER LEÍRÓK (ASCII SZERINT)
	CLRC
	ADDLW	-0x20		; W = ASCII-TABLEKEZDETE
	ADDWF PCL, f		; PC = PC + W	
	RETLW b'11111111'	; SPACE (SÖTÉT KIJELZŐ) CHR(0x20)
	RETLW b'01101111'	; ! (NINCS)
	RETLW b'01101111'	; " (NINCS)
	RETLW b'01101111'	; # (NINCS)
	RETLW b'01101111'	; $ (NINCS)
	RETLW b'01101111'	; % (NINCS)
	RETLW b'01101111'	; & (NINCS)
	RETLW b'01101111'	; ' (NINCS)
	RETLW b'01101111'	; ( (NINCS)
	RETLW b'01101111'	; ) (NINCS)
	RETLW b'01101111'	; * (NINCS)
	RETLW b'01101111'	; + (NINCS)
	RETLW b'01101111'	; , (NINCS)
	RETLW b'01101111'	; - (NINCS)
	RETLW b'01101111'	; . (NINCS)
	RETLW b'01101111'	; / (NINCS)
	RETLW b'01100000'	; 0 
	RETLW b'01111011'	; 1
	RETLW b'01001100'	; 2
	RETLW b'01001010'	; 3
	RETLW b'01010011'	; 4
	RETLW b'11000010'	; 5
	RETLW b'11000000'	; 6
	RETLW b'01101011'	; 7
	RETLW b'01000000'	; 8
	RETLW b'01000010'	; 9
	RETLW b'01101111'	; : (NINCS)
	RETLW b'01101111'	; ; (NINCS)
	RETLW b'01101111'	; < (NINCS)
	RETLW b'01101111'	; = (NINCS)
	RETLW b'01101111'	; > (NINCS)
	RETLW b'01101111'	; ? (NINCS)
	RETLW b'01101111'	; @ (NINCS)
	RETLW b'01101111'	; A (NINCS)
	RETLW b'01101111'	; B (NINCS)
	RETLW b'01101111'	; C (NINCS)
	RETLW b'01101111'	; D (NINCS)
	RETLW b'11000100'	; E 
	RETLW b'01101111'	; F (NINCS)
	RETLW b'01101111'	; G (NINCS)
	RETLW b'01010001'	; H 
	RETLW b'01101111'	; I (NINCS)
	RETLW b'01101111'	; J (NINCS)
	RETLW b'01101111'	; K (NINCS)
	RETLW b'11110100'	; L 
	RETLW b'01101111'	; M (NINCS)
	RETLW b'01101111'	; N (NINCS)
	RETLW b'01100000'	; O 
	RETLW b'01101111'	; P (NINCS)
	RETLW b'01101111'	; Q (NINCS)
	RETLW b'01101111'	; R (NINCS)
	RETLW b'01101111'	; S (NINCS)
	RETLW b'01101111'	; T (NINCS)
	RETLW b'01101111'	; U (NINCS)
	RETLW b'01101111'	; V (NINCS)
	RETLW b'01101111'	; W (NINCS)
	RETLW b'01101111'	; X (NINCS)
	RETLW b'01101111'	; Y (NINCS)
	RETLW b'01101111'	; Z (NINCS)

END