; Beispiel-Programm / Ausgangsbasis für Aufgabe 1, Versuch 2, Versuchsreihe 1. ; Autor: Tobias Schubert, April 2003. ; ; Funktion: ; Mit Taste S5 wird eine Textausgabe am LCD-Display hervorgerufen. ; Mit Taste S6 wird das Display gelöscht. ; Gewünschten Prozessor definieren. LIST P=16F84 INCLUDE ; Variablen. Counter EQU 0x0C Z0 EQU 0x0D Z1 EQU 0x0E ; Reset-Vektor festlegen. ORG 0x00 GOTO Start ; 2 Zeilen Text als Tabelle ablegen, je nach Wert von PCL wird ; das entsprechende PCL-te Zeichen zurückgegeben. ORG 0x20 Zeile1 ADDWF PCL,1 DT "Mobiles HWP2003 " Zeile2 ADDWF PCL,1 DT "Uni Freiburg " ; Tastendruck S5: Text ausgeben. ORG 0x70 TasteS5 ; Erste Zeile des Displays ansteuern. BCF PORTA,3 ; "Instruction Register" (RS=0). MOVLW b'00000010' ; 1.Zeile ansteuern. CALL WREG2LCD BSF PORTA, 3 ; "Data Register" (RS=1). ; Erste Zeile ausgeben. CLRF Counter ; Counter = 0. MOVF Counter,0 ; W = Counter. CALL Zeile1 ; W-tes Zeichen lesen. CALL WREG2LCD ; Und auf dem Display ausgeben. INCF Counter,1 ; Counter++. BTFSS Counter,4 ; Counter == 16? GOTO $-5 ; Nächstes Zeichen ausgeben. ; Zweite Zeile des Displays ansteuern. BCF PORTA,3 ; "Instruction Register" (RS=0). MOVLW b'11000000' ; 2.Zeile ansteuern. CALL WREG2LCD BSF PORTA, 3 ; "Data Register" (RS=1). ; Zweite Zeile ausgeben. CLRF Counter ; Counter = 0. MOVF Counter,0 ; W = Counter. CALL Zeile2 ; W-tes Zeichen lesen. CALL WREG2LCD ; Und auf dem Display ausgeben. INCF Counter,1 ; Counter++. BTFSS Counter,4 ; Counter == 16? GOTO $-5 ; Nächstes Zeichen ausgeben. MOVLW 0x40 ; W = 0x40 (Parameter für Funktion Delay). CALL Delay ; Pause zur Entprellung. RETURN ; Tastendruck S6: Display löschen. ORG 0x120 TasteS6 BCF PORTA,3 ; "Instruction Register" (RS=0). MOVLW b'00000001' ; Display loeschen (siehe Datenblatt HD44780U, Seite 28). CALL WREG2LCD BSF PORTA, 3 ; "Data Register" (RS=1). RETURN ; Pause. ORG 0x140 Delay MOVWF Z1 ; Z1 = W. CLRF Z0 ; Z0 = 0. INCFSZ Z0,1 ; Z0++ und Test auf Z0 == 0. GOTO $-1 INCFSZ Z1,1 ; Z1++ und Test auf Z1 == 0. GOTO $-4 RETURN ; Inhalt des "Working Registers" an PORTB / LCD ausgeben. ORG 0x160 WREG2LCD: MOVWF PORTB ; PORTB = WREG. BSF PORTA, 2 ; "Enable LCD" aktivieren (E = 1). MOVLW 0xFD ; W = 0xFD (Parameter für Funktion Delay). CALL Delay BCF PORTA, 2 ; "Enable LCD" deaktivieren (E = 0). RETURN ; Funktion beenden. ; Hauptprogramm ab Speicherzelle 0x300. ORG 0x200 Start ; PORTA / PORTB initialisieren. CLRF PORTA ; PORTA löschen. CLRF PORTB ; PORTB löschen. BSF STATUS,5 ; Bank 1 waehlen. BCF STATUS,6 CLRF TRISB ; Alle Pins von PORTB als Ausgang. CLRF TRISA ; TRISA initialisieren (Pin 2/3 als Ausgang, RS/E LCD). BSF TRISA, 0 ; PIN 0 von PORTA als Eingang (Taster S5). BSF TRISA, 1 ; PIN 1 von PORTA als Eingang (Taster S6). BCF STATUS,5 ; Bank 0 wählen. ; LCD-Display initialisieren (siehe Datenblatt HD44780U, Seite 45). BCF PORTA,3 ; "Instruction Register" (RS=0). MOVLW b'00110000' ; Initialisierung. CALL WREG2LCD MOVLW b'00110000' ; Initialisierung. CALL WREG2LCD MOVLW b'00110000' ; Initialisierung. CALL WREG2LCD MOVLW b'00111000' ; 2 Zeilen, 5*8 Pixel (siehe Datenblatt HD44780U, Seite 29). CALL WREG2LCD MOVLW b'00001100' ; LCD ein, Cursor aus (siehe Datenblatt HD44780U, Seite 26-28). CALL WREG2LCD ; Zu Beginn Display löschen. CALL TasteS6 Tastenabfrage ; Taste S5 aktiv (--> Text ausgeben)? BTFSC PORTA,0 CALL TasteS5 ; Taste S6 aktiv (--> Display löschen)? BTFSC PORTA,1 CALL TasteS6 ; Neuer Schleifendurchlauf. GOTO Tastenabfrage ; Programm-Ende. END