- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 10 von 10

Thema: 16F877 + DS1820 + LCD + MatrixTastatur

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    08.04.2005
    Beiträge
    7

    16F877 + DS1820 + LCD + MatrixTastatur

    Anzeige

    Powerstation Test
    hiho

    ich brauch dringend hilfe...
    sozusagen leben oder tod...

    also ich soll ein system bis montag realisieren, bei dem ein DS1820 temperatur misst (ned schwer), daten werden dann vom PIC an das LCD gesendet und dargestellt...
    so und jetzt kommts:
    mit einer 12 Tastenmatrixtastatur gebe ich einen temp wert also zB 12*5 (12.5 soll das dann sein, weil die hat nur 0-9 und * und #) ist der wert kleiner als die temperatur am DS1820 soll ein Lamperl leuchten...
    und wenn sie groeßer is, soll ein anderes lamperl leuchten....

    bidde helfen, bin grad selber auch noch voll von der grippe dahingerafft worden und kann nicht denken....



    greetz
    adidactylus_IV

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.10.2004
    Ort
    ferd. Waldmüllerg. 7/2
    Alter
    39
    Beiträge
    456
    Ja, das ist mMn net wirklich schwer.

    Du liest die Tastatur aus (auf sprut.e kannst du nachschauen, wenn da Probleme bestehen). Dann speicherst du den eingegebenen Wert in ein (oder zwei) Bytes (einen für die Kommazahl) in der Memory, oder, wenn du es länger brauchst in den EEPROM (<-- wäre mMn fast einfacher zu handhaben) ab.
    Bei der Abfrage des DS1820 (kenn das Ding leider nicht, nehm aber an, I²C-Protokoll) vergleichst die beiden Werte miteinander:

    in C:

    if ( DS_C <= Tast_C)
    {
    ...
    }


    in Assembler substrahierst du von dem erhaltenen Wert den eingegebenen und guckst, welche Flags aktiviert wurden.
    also:

    movfw MATRIX_C
    subwf DS_C
    BZ temp_gleich
    BNC temp_unter

    erklärung:
    -) schiebe den eingetippten Wert in den Arbeitsregister
    -) substrahiere diesen dann von dem DS1820 Block
    -) Wenn 0, dann waren beide Werte gleich, springe zu dem Befehl
    -) Wenn Überlauf (VORSICHT, Carry Bit wird bei der substraktion gesetzt, wenn kein Überlauf passiert ist), springe anderswohin


    Hoffe, konnte helfen ^^
    MfG
    Mobius

    P.S.: Den LED an einem Port setzt du dann einfach mit "bsf PORTX,0-7"

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    08.04.2005
    Beiträge
    7
    ah

    thx daweil, ich meld mich, wenn ich wieder was brauch
    werd jetzt mal herum tippseln...

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    08.04.2005
    Beiträge
    7
    so, das is amal das, was ich noch vom Alex in der mailbox hatte...
    kann mir wer sagen bitte, was da passt und was nicht?

    Code:
    list p=16f877
    ;**************************************************************
    ;*  	Pinbelegung
    ;*	----------------------------------	
    ;*	PORTA: 	0 -
    ;*		1 -
    ;*		2 -
    ;*		3 -
    ;*		4 -
    ;*		5 -
    ;*		6 -
    ;*		7 -
    ;*
    ;*	PORTB:	0 LCD Display E
    ;*		1 			Keyboard 1 4 7 *
    ;*		2 LCD Display RS	Keyboard 2 5 8 0
    ;*		3 LCD Display R/W	Keyboard 3 6 9 #
    ;*		4 LCD Display D4 	---------I I I I
    ;*		5 LCD Display D5	-----------+ I I
    ;*		6 LCD Display D6	-------------+ I
    ;*		7 LCD Display D7	---------------+
    ;*	
    ;**************************************************************
    ; Tastatur mit LCD-Display
    ;
    ; Prozessor 16F877 
    ;
    ; Prozessor-Takt 4 MHz
    ;
    ; LCD & Keyboard am PortB
    ;
    ;**********************************************************
    ; Includedatei für den 16F877 einbinden
    
    	#include <P16f877.INC>
    
    	
    
    
    ; Konfiguration festlegen:
    ; Power on Timer, kein Watchdog, HS-Oscillator, kein Brown out, kein LV-programming
    	__CONFIG	_PWRTE_ON & _WDT_OFF & _HS_OSC & _BODEN_OFF & _LVP_OFF
    
    
    ; Variablen festlegen
    loops		equ	0x20	; Wartezeit für WAIT in Millisekunden
    loops2		equ	0x21	; interner timer für wait
    LcdStatus	equ	0x22	; Puffer für aus dem LCD ausgelesenes Statusbyte
    LcdDaten	equ	0x23	; Puffer für zum LCD zu schreibendes Byte
    Taste		equ	0x24	; Tastaturpuffer
    
    
    ; Konstanten festlegen
    ; das demonstriert die Nutzung des define-Kommandos im Assembler
    ; für LCD-Pins
    #define	LcdE	PORTB,0		; enable Lcd
    #define	LcdRw	PORTB,3		; read Lcd
    #define	LcdRs	PORTB,2		; Daten Lcd (nicht control)	
    #define LcdPort PORTB		; Datenbus des LCD (obere 4 Bit)
    				; für Tastatur-Anschluß
    #define	KRow1	PORTB,1		;Keyboard 1 4 7 *
    #define	KRow2	PORTB,2		;Keyboard 2 5 8 0
    #define	KRow3	PORTB,3		;Keyboard 3 6 9 #
    #define	KLine1	PORTB,4		;Keyboard 1 2 3
    #define	KLine2	PORTB,5		;Keyboard 4 5 6
    #define	KLine3	PORTB,6		;Keyboard 7 8 9
    #define	KLine4	PORTB,7		;Keyboard * 0 #
    
    ; Konstanten für OPTIN_REG and INTCON
    ; diese Werte werden im Programm wärend der Initialisierung verwendet
    ; sie hier abzulegen vereinfacht spätere Änderungen
    Ini_con Equ	B'00000000'	; Interupt disable
    Ini_opt	Equ	B'00000010'	; pull-up
    
    
    ;********************************************************
    ; Das Programm beginnt mit der Initialisierung
    
    Init	bsf     STATUS, RP0	; Bank 1
    	movlw   Ini_opt     	; pull-up Wiederstände ein
    	movwf   OPTION_REG 
    	movlw	B'00000000'	; PortB alle outputs 
    	movwf	TRISB
    	bcf     STATUS, RP0	; Bank 0
    	clrf	PORTB		
    	movlw   Ini_con     	; Interupt disable
    	movwf   INTCON   
    
    ;Display initialisieren
    	call	InitLcd
    
    mainloop
    	call	Tastfrei	; darauf warten, das keine Taste gedrückt ist	
    	call	WAIT		
    
    press
    	call	Tastatur	; wird nun eine Taste gedrückt?
    	movfw	Taste		; Tastencode nach w; Taste=0 dann Z=1  
    	btfsc	STATUS, Z	; skip wenn Taste<>0 
    	goto	press		; Tastencode=0 d.h. keine Taste gedrückt, weiter warten
    
    	call	OutLcdDaten	; Tastencode am LCD ausgeben
    	goto	mainloop	; auf ein neues
    
    
    
    ;*****************************************************
    ;+++LCD-Routinen**************************************
    ;*****************************************************
    ;LCD initialisieren, Begrüßung ausgeben
    
    InitLcd
    	movlw	D'255'		
    	movwf	loops	
    	call	WAIT		
    
    	movlw	B'00110000'	; 1
    	movwf	LcdPort
    	bsf	LcdE
    	nop	
    	bcf	LcdE
    	
    	movlw	D'50'		; 50 ms Pause
    	movwf	loops
    	call	WAIT
    	
    	movlw	B'00110000'	; 2
    	call	Control8Bit
    	movlw	B'00110000'	; 3
    	call 	Control8Bit
    	movlw	B'00100000'	; 4
    	call 	Control8Bit
    
    	movlw	B'00000001'	; löschen und cusor home
    	call	OutLcdControl	
    	movlw	B'00101000'	; 5 function set, 4-bit  2-zeilig,  5x7
    	call	OutLcdControl	
    	movlw	B'00001000'	; 6 display off
    	call	OutLcdControl
    	movlw	B'00000110'	; 7 entry mode, increment, disable display-shift
    	call	OutLcdControl
    	movlw	B'00000011'	; 8 cursor home, cursor home
    	call	OutLcdControl
    	movlw	B'00001111'	; 9 display on
    	call	OutLcdControl
    
    	movlw	'B'		
    	call	OutLcdDaten
    	movlw	'i'
    	call	OutLcdDaten
    	movlw	'n'
    	call	OutLcdDaten
    	movlw	'i'
    	call	OutLcdDaten
    	movlw	'_'
    	call	OutLcdDaten
    	movlw	'd'
    	call	OutLcdDaten
    	movlw	'a'
    	call	OutLcdDaten
    	movlw	'!'
    	call	OutLcdDaten
    
    	return
    
    ;*****************************************************
    ; ein Steuerbyte aus W 8-bittig übertragen
    Control8Bit
    	movwf	LcdPort
    	bsf	LcdE
    	nop
    	bcf	LcdE
    	movlw	D'10'
    	movwf	loops
    	call 	WAIT
    	return
    
    ;*****************************************************
    ; darauf warten, daß das Display bereit zur Datenannahme ist
    ; dazu wird das busy-Bit des LCD abgefragt
    LcdBusy
            bsf     STATUS, RP0	; make Port B4..7 input
    	movlw	B'11110000'
    	iorwf   TRISB, f 
            bcf     STATUS, RP0
    BusyLoop		
    	bcf	LcdRs		; Steuerregister
    	bsf	LcdRw		; Lesen
    	bsf	LcdE
    	nop
    	movf	LcdPort, w	; 4 obere Bits lesen (D7..D4)
    	movwf	LcdStatus	; und in LcdStatus speichern
    	bcf	LcdE
    	nop
    	bsf	LcdE
    	nop			; 4 untere Bits lesen (D3..D0) und ignorieren
    	bcf	LcdE
    	btfsc	LcdStatus, 7	; teste bit 7
    	goto	BusyLoop
    	bcf	LcdRw
            bsf     STATUS, RP0	; make Port B4..7 output
    	movlw	B'00001111'
    	andwf   TRISB, f    
            bcf     STATUS, RP0
    	return	
    
    ;*****************************************************
    ; aus W ein Byte mit Steuerdaten zum Display übertragen
    OutLcdControl
    	movwf	LcdDaten	; Byte in LcdDaten zwischenspeichern
    	call	LcdBusy		; warten bis Display bereit ist
    	movf	LcdDaten, w	; Byte zurück nach W holen
    	andlw	H'F0'		; low-Teil löschen
    	movwf	LcdPort		; Hi-teil Daten schreiben
    	bsf	LcdE
    	nop
    	bcf	LcdE		; Disable LcdBus
    	swapf	LcdDaten, w	; Byte verdreht nach W holen
    	andlw	H'F0'		; High Teil löschen
    	movwf	LcdPort		; Low-teil Daten schreiben
    	bsf	LcdE
    	nop
    	bcf	LcdE		; Disable LcdBus
    	return
    
    ;*****************************************************
    ; aus W ein Datenbyte (zum Anzeigen) an's Display übertragen
    OutLcdDaten
    	movwf	LcdDaten	; Byte in LcdDaten zwischenspeichern
    	call	LcdBusy		; warten bis Display bereit ist
    	movf	LcdDaten, w	; Byte zurück nach W holen
    	andlw	H'F0'		; low-Teil löschen
    	movwf	LcdPort		; Hi-teil Daten schreiben
    	bsf	LcdRs		; Daten
    	bsf	LcdE		; Enable LcdBus
    	nop
    	bcf	LcdE		; Disable LcdBus	
    	swapf	LcdDaten, w	; Byte verdreht nach W holen
    	andlw	H'F0'		; High Teil löschen
    	movwf	LcdPort		; Low-teil Daten schreiben
    	bsf	LcdRs		; Daten
    	bsf	LcdE
    	nop
    	bcf	LcdE		; Disable LcdBus	
    	bcf	LcdRs		;
    	return
    
    
    ;*****************************************************
    ;+++Tastatur-Routinen*********************************
    ;*****************************************************
    ; warten darauf, daß keine Taste mehr gedrückt ist
    
    Tastfrei			; Warten auf freie Tastatur
    	call	Tastatur	; Tastencode nach Taste & W
    	movfw	Taste		; wenn code=0 dann Z=1
    	btfss	STATUS, Z	; wenn Z=1 dann skip
    	goto	Tastfrei	; weiter warten
    	return			; Tastatur ist frei
    
    ;#define	KRow1	PORTB,1		;Keyboard 1 4 7 *
    ;#define	KRow2	PORTB,2		;Keyboard 2 5 8 0
    ;#define	KRow3	PORTB,3		;Keyboard 3 6 9 #
    ;#define	KLine1	PORTB,4		;Keyboard 1 2 3
    ;#define	KLine2	PORTB,5		;Keyboard 4 5 6
    ;#define	KLine3	PORTB,6		;Keyboard 7 8 9
    ;#define	KLine4	PORTB,7		;Keyboard * 0 #
    
    Tastatur
    	; zuerst müssen die Tastaturzeilen-Pins auf Eingang gestellt werden
    	bsf     STATUS, RP0	; Bank 1
    	movlw   Ini_opt     	; pull-up Widerstände ein
    	movwf   OPTION_REG 
    	movlw	B'11110000'	; RB0 .. RB3 output, RB4 .. RB7 input
    	movwf	TRISB
    	bcf     STATUS, RP0	; Bank 0
    
    	; das Enable-Pin des Displays muß auf Low stehen, damit das Display 
    	; abgeschaltet ist solange wir die Tastatur abfragen
    	clrf	PORTB		; Display inaktiv am Bus
    
    	; w wird auf 0 gesetzt, dieser Wert wird durch ein ASSCI-Zeichen
    	; überschrieben, falls eine Taste gedrückt ist
    	; falls keine Taste gedrückt ist, bleibt 0 erhalten
    	movlw	0		; W=0
    
    	bcf	KRow1		; 1. spalte aktivieren
    	bsf	KRow3
    	bsf	KRow2
    
    	call	key1		; 1. Spalte abfragen
    
    	bcf	KRow2		; 2.Spalte aktivieren
    	bsf	KRow1		; 1.Spalte ausschalten
    
    	call	key2		; 2. Spalte
    
    	bcf	KRow3		; 3. Spalte aktivieren
    	bsf	KRow2		; 2. spalte ausschalten
    
    	call	key3		; 3. Spalte
    	
    	bsf	KRow3		; 3. Spalte ausschalten
    	movwf	Taste
    
    	; PortB wieder komplett zu Output machen
    	bsf     STATUS, RP0	; Bank 1
    	movlw	B'00000000'	; RB1 .. RB7 output
    	movwf	TRISB
    	bcf     STATUS, RP0	; Bank 0
    	return
    
    key1
    	btfss	KLine1
    	retlw	'1'
    	btfss	KLine2
    	retlw	'4'
    	btfss	KLine3
    	retlw	'7'
    	btfss	KLine4
    	retlw	'*'
    	return
    key2
    	btfss	KLine1
    	retlw	'2'
    	btfss	KLine2
    	retlw	'5'
    	btfss	KLine3
    	retlw	'8'
    	btfss	KLine4
    	retlw	'0'
    	return
    key3
    	btfss	KLine1
    	retlw	'3'
    	btfss	KLine2
    	retlw	'6'
    	btfss	KLine3
    	retlw	'9'
    	btfss	KLine4
    	retlw	'#'
    	return
    
    
    WAIT
    top     movlw   .500           
            movwf   loops2
    top2    nop                    ; warten und nichts tun
            nop
            nop
            nop
    	nop
            nop
            nop
            decfsz  loops2, F      
            goto    top2           
                                   
            decfsz  loops, F       
            goto    top            
            retlw   0              
    
    
    	end
    greetz
    big thx
    Adidactylus

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    08.04.2005
    Beiträge
    7

    help nochmal

    hiho...

    ich habe jetzt sozusagen 2 programmteile die ich noch innernander verschachteln muesste....

    1. LCD ausgabe und tastatur eingabe...
    Code:
    	list p=16f877
    ;**************************************************************
    ;*  	Pinbelegung
    ;*	----------------------------------	
    ;*	PORTA: 	0 -
    ;*		1 -
    ;*		2 -
    ;*		3 -
    ;*		4 -
    ;*		5 -
    ;*		6 -
    ;*		7 -
    ;*
    ;*	PORTB:	0 LCD Display E
    ;*		1 			Keyboard 1 4 7 *
    ;*		2 LCD Display RS	Keyboard 2 5 8 0
    ;*		3 LCD Display R/W	Keyboard 3 6 9 #
    ;*		4 LCD Display D4 	---------I I I I
    ;*		5 LCD Display D5	-----------+ I I
    ;*		6 LCD Display D6	-------------+ I
    ;*		7 LCD Display D7	---------------+
    ;*	
    ;**************************************************************
    ; Tastatur mit LCD-Display
    ;
    ; Prozessor 16F877 
    ;
    ; Prozessor-Takt 4 MHz
    ;
    ; LCD & Keyboard am PortB
    ;
    ;**********************************************************
    ; Includedatei für den 16F877 einbinden
    
    	#include <P16f877.INC>
    
    	
    
    
    ; Konfiguration festlegen:
    ; Power on Timer, kein Watchdog, HS-Oscillator, kein Brown out, kein LV-programming
    	__CONFIG	_PWRTE_ON & _WDT_OFF & _HS_OSC & _BODEN_OFF & _LVP_OFF
    
    
    ; Variablen festlegen
    loops		equ	0x20	; Wartezeit für WAIT in Millisekunden
    loops2		equ	0x21	; interner timer für wait
    LcdStatus	equ	0x22	; Puffer für aus dem LCD ausgelesenes Statusbyte
    LcdDaten	equ	0x23	; Puffer für zum LCD zu schreibendes Byte
    Taste		equ	0x24	; Tastaturpuffer
    
    
    ; Konstanten festlegen
    ; das demonstriert die Nutzung des define-Kommandos im Assembler
    ; für LCD-Pins
    #define	LcdE	PORTB,0		; enable Lcd
    #define	LcdRw	PORTB,3		; read Lcd
    #define	LcdRs	PORTB,2		; Daten Lcd (nicht control)	
    #define LcdPort PORTB		; Datenbus des LCD (obere 4 Bit)
    				; für Tastatur-Anschluß
    #define	KRow1	PORTB,1		;Keyboard 1 4 7 *
    #define	KRow2	PORTB,2		;Keyboard 2 5 8 0
    #define	KRow3	PORTB,3		;Keyboard 3 6 9 #
    #define	KLine1	PORTB,4		;Keyboard 1 2 3
    #define	KLine2	PORTB,5		;Keyboard 4 5 6
    #define	KLine3	PORTB,6		;Keyboard 7 8 9
    #define	KLine4	PORTB,7		;Keyboard * 0 #
    
    ; Konstanten für OPTIN_REG and INTCON
    ; diese Werte werden im Programm wärend der Initialisierung verwendet
    ; sie hier abzulegen vereinfacht spätere Änderungen
    Ini_con Equ	B'00000000'	; Interupt disable
    Ini_opt	Equ	B'00000010'	; pull-up
    
    
    ;********************************************************
    ; Das Programm beginnt mit der Initialisierung
    
    Init	bsf     STATUS, RP0	; Bank 1
    	movlw   Ini_opt     	; pull-up Wiederstände ein
    	movwf   OPTION_REG 
    	movlw	B'00000000'	; PortB alle outputs 
    	movwf	TRISB
    	bcf     STATUS, RP0	; Bank 0
    	clrf	PORTB		
    	movlw   Ini_con     	; Interupt disable
    	movwf   INTCON   
    
    ;Display initialisieren
    	call	InitLcd
    
    mainloop
    	call	Tastfrei	; darauf warten, das keine Taste gedrückt ist	
    	call	WAIT		
    
    press
    	call	Tastatur	; wird nun eine Taste gedrückt?
    	movfw	Taste		; Tastencode nach w; Taste=0 dann Z=1  
    	btfsc	STATUS, Z	; skip wenn Taste<>0 
    	goto	press		; Tastencode=0 d.h. keine Taste gedrückt, weiter warten
    
    	call	OutLcdDaten	; Tastencode am LCD ausgeben
    	goto	mainloop	; auf ein neues
    
    
    
    ;*****************************************************
    ;+++LCD-Routinen**************************************
    ;*****************************************************
    ;LCD initialisieren, Begrüßung ausgeben
    
    InitLcd
    	movlw	D'255'		
    	movwf	loops	
    	call	WAIT		
    
    	movlw	B'00110000'	; 1
    	movwf	LcdPort
    	bsf	LcdE
    	nop	
    	bcf	LcdE
    	
    	movlw	D'50'		; 50 ms Pause
    	movwf	loops
    	call	WAIT
    	
    	movlw	B'00110000'	; 2
    	call	Control8Bit
    	movlw	B'00110000'	; 3
    	call 	Control8Bit
    	movlw	B'00100000'	; 4
    	call 	Control8Bit
    
    	movlw	B'00000001'	; löschen und cusor home
    	call	OutLcdControl	
    	movlw	B'00101000'	; 5 function set, 4-bit  2-zeilig,  5x7
    	call	OutLcdControl	
    	movlw	B'00001000'	; 6 display off
    	call	OutLcdControl
    	movlw	B'00000110'	; 7 entry mode, increment, disable display-shift
    	call	OutLcdControl
    	movlw	B'00000011'	; 8 cursor home, cursor home
    	call	OutLcdControl
    	movlw	B'00001111'	; 9 display on
    	call	OutLcdControl
    
    	movlw	'B'		
    	call	OutLcdDaten
    	movlw	'i'
    	call	OutLcdDaten
    	movlw	'n'
    	call	OutLcdDaten
    	movlw	'i'
    	call	OutLcdDaten
    	movlw	'_'
    	call	OutLcdDaten
    	movlw	'd'
    	call	OutLcdDaten
    	movlw	'a'
    	call	OutLcdDaten
    	movlw	'!'
    	call	OutLcdDaten
    
    	return
    
    ;*****************************************************
    ; ein Steuerbyte aus W 8-bittig übertragen
    Control8Bit
    	movwf	LcdPort
    	bsf	LcdE
    	nop
    	bcf	LcdE
    	movlw	D'10'
    	movwf	loops
    	call 	WAIT
    	return
    
    ;*****************************************************
    ; darauf warten, daß das Display bereit zur Datenannahme ist
    ; dazu wird das busy-Bit des LCD abgefragt
    LcdBusy
            bsf     STATUS, RP0	; make Port B4..7 input
    	movlw	B'11110000'
    	iorwf   TRISB, f 
            bcf     STATUS, RP0
    BusyLoop		
    	bcf	LcdRs		; Steuerregister
    	bsf	LcdRw		; Lesen
    	bsf	LcdE
    	nop
    	movf	LcdPort, w	; 4 obere Bits lesen (D7..D4)
    	movwf	LcdStatus	; und in LcdStatus speichern
    	bcf	LcdE
    	nop
    	bsf	LcdE
    	nop			; 4 untere Bits lesen (D3..D0) und ignorieren
    	bcf	LcdE
    	btfsc	LcdStatus, 7	; teste bit 7
    	goto	BusyLoop
    	bcf	LcdRw
            bsf     STATUS, RP0	; make Port B4..7 output
    	movlw	B'00001111'
    	andwf   TRISB, f    
            bcf     STATUS, RP0
    	return	
    
    ;*****************************************************
    ; aus W ein Byte mit Steuerdaten zum Display übertragen
    OutLcdControl
    	movwf	LcdDaten	; Byte in LcdDaten zwischenspeichern
    	call	LcdBusy		; warten bis Display bereit ist
    	movf	LcdDaten, w	; Byte zurück nach W holen
    	andlw	H'F0'		; low-Teil löschen
    	movwf	LcdPort		; Hi-teil Daten schreiben
    	bsf	LcdE
    	nop
    	bcf	LcdE		; Disable LcdBus
    	swapf	LcdDaten, w	; Byte verdreht nach W holen
    	andlw	H'F0'		; High Teil löschen
    	movwf	LcdPort		; Low-teil Daten schreiben
    	bsf	LcdE
    	nop
    	bcf	LcdE		; Disable LcdBus
    	return
    
    ;*****************************************************
    ; aus W ein Datenbyte (zum Anzeigen) an's Display übertragen
    OutLcdDaten
    	movwf	LcdDaten	; Byte in LcdDaten zwischenspeichern
    	call	LcdBusy		; warten bis Display bereit ist
    	movf	LcdDaten, w	; Byte zurück nach W holen
    	andlw	H'F0'		; low-Teil löschen
    	movwf	LcdPort		; Hi-teil Daten schreiben
    	bsf	LcdRs		; Daten
    	bsf	LcdE		; Enable LcdBus
    	nop
    	bcf	LcdE		; Disable LcdBus	
    	swapf	LcdDaten, w	; Byte verdreht nach W holen
    	andlw	H'F0'		; High Teil löschen
    	movwf	LcdPort		; Low-teil Daten schreiben
    	bsf	LcdRs		; Daten
    	bsf	LcdE
    	nop
    	bcf	LcdE		; Disable LcdBus	
    	bcf	LcdRs		;
    	return
    
    
    ;*****************************************************
    ;+++Tastatur-Routinen*********************************
    ;*****************************************************
    ; warten darauf, daß keine Taste mehr gedrückt ist
    
    Tastfrei			; Warten auf freie Tastatur
    	call	Tastatur	; Tastencode nach Taste & W
    	movfw	Taste		; wenn code=0 dann Z=1
    	btfss	STATUS, Z	; wenn Z=1 dann skip
    	goto	Tastfrei	; weiter warten
    	return			; Tastatur ist frei
    
    ;#define	KRow1	PORTB,1		;Keyboard 1 4 7 *
    ;#define	KRow2	PORTB,2		;Keyboard 2 5 8 0
    ;#define	KRow3	PORTB,3		;Keyboard 3 6 9 #
    ;#define	KLine1	PORTB,4		;Keyboard 1 2 3
    ;#define	KLine2	PORTB,5		;Keyboard 4 5 6
    ;#define	KLine3	PORTB,6		;Keyboard 7 8 9
    ;#define	KLine4	PORTB,7		;Keyboard * 0 #
    
    Tastatur
    	; zuerst müssen die Tastaturzeilen-Pins auf Eingang gestellt werden
    	bsf     STATUS, RP0	; Bank 1
    	movlw   Ini_opt     	; pull-up Widerstände ein
    	movwf   OPTION_REG 
    	movlw	B'11110000'	; RB0 .. RB3 output, RB4 .. RB7 input
    	movwf	TRISB
    	bcf     STATUS, RP0	; Bank 0
    
    	; das Enable-Pin des Displays muß auf Low stehen, damit das Display 
    	; abgeschaltet ist solange wir die Tastatur abfragen
    	clrf	PORTB		; Display inaktiv am Bus
    
    	; w wird auf 0 gesetzt, dieser Wert wird durch ein ASSCI-Zeichen
    	; überschrieben, falls eine Taste gedrückt ist
    	; falls keine Taste gedrückt ist, bleibt 0 erhalten
    	movlw	0		; W=0
    
    	bcf	KRow1		; 1. spalte aktivieren
    	bsf	KRow3
    	bsf	KRow2
    
    	call	key1		; 1. Spalte abfragen
    
    	bcf	KRow2		; 2.Spalte aktivieren
    	bsf	KRow1		; 1.Spalte ausschalten
    
    	call	key2		; 2. Spalte
    
    	bcf	KRow3		; 3. Spalte aktivieren
    	bsf	KRow2		; 2. spalte ausschalten
    
    	call	key3		; 3. Spalte
    	
    	bsf	KRow3		; 3. Spalte ausschalten
    	movwf	Taste
    
    	; PortB wieder komplett zu Output machen
    	bsf     STATUS, RP0	; Bank 1
    	movlw	B'00000000'	; RB1 .. RB7 output
    	movwf	TRISB
    	bcf     STATUS, RP0	; Bank 0
    	return
    
    key1
    	btfss	KLine1
    	retlw	'1'
    	btfss	KLine2
    	retlw	'4'
    	btfss	KLine3
    	retlw	'7'
    	btfss	KLine4
    	retlw	'*'
    	return
    key2
    	btfss	KLine1
    	retlw	'2'
    	btfss	KLine2
    	retlw	'5'
    	btfss	KLine3
    	retlw	'8'
    	btfss	KLine4
    	retlw	'0'
    	return
    key3
    	btfss	KLine1
    	retlw	'3'
    	btfss	KLine2
    	retlw	'6'
    	btfss	KLine3
    	retlw	'9'
    	btfss	KLine4
    	retlw	'#'
    	return
    
    
    WAIT
    top     movlw   .500           
            movwf   loops2
    top2    nop                    ; warten und nichts tun
            nop
            nop
            nop
    	nop
            nop
            nop
            decfsz  loops2, F      
            goto    top2           
                                   
            decfsz  loops, F       
            goto    top            
            retlw   0              
    
    
    	end

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    08.04.2005
    Beiträge
    7
    2. temp ausgabe auf LCD


    -> was jetzt noch fehlen wuerde, is abspeichern des eingegebenen temp wertes und vergleich mit dem wert des DS1820
    und das zusammenschachteln eben,...

    PLEASE HELP...
    Angehängte Dateien Angehängte Dateien

  7. #7
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Ich hab mich versucht, schlau zu machen. In der Zeit kann ich leider nicht jede Zeile nachvollziehen, ich hoffe, daß die vorhandenen Routinen halbwegs dicht sind
    Isses richtig, daß
    Du den DB1820 auslesen kannst und die akutelle Temperatur umgewandelt auf dem LCD zeigen kannst ?
    Isses richtig, daß
    Du die Tasten richtig lesen kannst und ebenfalls auf das LCD bringst (dzt. isses glaub ich nur der Hex code ?

    In den vorhandenen Routinen wird der DS.. gelesen und umgewandelt
    Hund:Ten:One
    Da Bin->Dec vorhanden ist, umgekehrt aber nicht, bleib am Besten glecih bei dec.
    d.h. die Ds.. kopierst du in drei Felder DsHund, DsTen, DsOne und schreibst sie nach jeder Meßung rein. Ideal, wenn du sie auch zeigen kannst,
    Für die Tasten brauchst du Vergleichsfelder KyHund, KyTen, KyOne
    Da brauchst du einen Cursor, den du bei jeder Eingabe inkrementierst.
    Die gedrückte Taste zeigst du her UND kopierst
    Bei 0 --> KyHund,
    Bei 1--> KyTen
    Bei 2 --> KyOne
    Verzichte aus Zeitmangel auf alle extras, wie ausbessern der Eingabe und so: Du verlangst IMMER alle drei Zahlen.
    bei Eingabe '*' (löschen) kannst du den Cursor wieder auf Null setzen--> neue Eingabe

    HauptSchleife:
    1 Tastenabfrage wenn Taste--> je nach Cursor speichern / Cursor +1
    2 Temperatur holen ---> nach Dshund, -... etc. speichern
    3 Vergleich:
    Erst hunderter vergl., dann Ten, dann One.
    Bei der ersten Ungleichheit ist der Vergleich zu Ende --> LED an oder aus
    --> Schleife

    Cursor >= 3 ---> keine Eingabe zulässig, außer "*"

    Hilft das ein wenig ? (oder is eh schon alles zu spät ?)
    Tut leid, zaubern is nich
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    08.04.2005
    Beiträge
    7
    k very big thx,...

    zumindest kenn ich mich jetzt bereits a bissal mit asm aus...

    hiflt mir schon was und zu spaet is es auch noch ned

    rotinen sind dicht, ausgabe auf dem lcd funzt auch und eingabe auch...

    jetzt muss ich das ganze zusammenschaufeln

  9. #9
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Tät' mich freuen, wenn's was nutzt.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    08.04.2005
    Beiträge
    7
    bin grad dabei die beiden proggis zusammen zu fuegen,...

    nur hab ich irgendwie probs mit dem timeing...

    ich halt dich auf dem laufenden...

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress