;======== Programmteile für LCD-Betrieb =============================== ; ; ALPS LSU_7S1011A: 96 x 32 Pixel ; ; beteiligt sind folgende Signale: ; LCD_A0 ; LCD_CS ; LCD_RD ; LCD_WR ; LCD_reset ; Port_D komplett als 8 Bit Daten zum/vom LCD ; Controller-Kommandos: ; 0x40..7F Start-Display-Line setzen ; 0xB0..BF Page 0..F setzen. Physisch nur 0..3 möglich!! ; 0x00..0F Low-Nibble der Spaltenadresse setzen ; 0x10..1F High-Nibble der Spaltenadresse setzen ; 0xA0 / 0xA1 Anzeige normal/gespiegelt (re<-->li) ; 0xA2 / 0xA3 Set Bias 1/5 oder 1/6 ; 0xA4 / 0xA5 ganzes Display on/nicht on (Test?) ; 0xA6 / 0xA7 Display invertieren hell<-->dunkel ; 0xAF / 0xAE Display on/off ;Display-Matrix: real: 96x32, Controller kann 132x64 ;Spalten: links Spalte 0, rechts Spalte 95 ;Zeilen: von oben nach unten: ; - Bank 0, D0..D7 ; - Bank 1, D0..D7 ; - Bank 2, D0..D7 ; - Bank 3, D0..D7 ; hintereinander eingegebene Bytes schreiben von links ; nach rechts eine Bank voll. ; Jede Bank ist also ein Display-Bereich von 96x8 Pixeln ; beginnend mit Pixel 18 ; Funktionen: ; ZifferOut : Zahl 0..9 in W ausgeben, Pixel-Posi in ; Xposi (wird automat. weitergestellt) ; immer nur in der oberen Hälfte des LCD. ; Font: 7x14 ; Init_LCD : LCD initialisieren und Display ablöschen ; DeziPunkt : Dezimalpunkt an aktueller Stelle schreiben ; mehr ist z.Z. nicht. Eigentlich ist das auch zu viel für ; so einen kleinen PIC. ;------------------------------------------------------------- LCD_ReadData: BSF LCD_A0 GOTO LCD_Read LCD_ReadStatus: BCF LCD_A0 LCD_Read: BSF LCD_WR BSF LCD_RD BSF RP0 ; Bank 1 MOVLW 0FFh MOVWF TrisD BCF RP0 BSF LCD_CS BCF LCD_RD NOP NOP MOVF PortD,W BSF LCD_RD BCF LCD_CS RETURN LCD_WriteData: BSF LCD_A0 GOTO LCD_Write LCD_Command: BCF LCD_A0 LCD_Write: MOVWF PortD BSF LCD_WR BSF LCD_RD BSF RP0 ; Bank 1 CLRF TrisD BCF RP0 BSF LCD_CS BCF LCD_WR NOP BSF LCD_WR BCF LCD_CS RETURN LCD_warten: CLRF LcdHudl _il1: NOP NOP ADDLW 1 SKIP Z GOTO _il1 DECFSZ LcdHudl,W SKIP Z GOTO _il1 RETURN ;=================================================== ; Init. W enthält Modifikationen Init_LCD: MOVWF Ziffer ; erstmal.. BCF LCD_reset CALL LCD_warten CALL LCD_warten BSF LCD_reset MOVLW 40h ; start DisplayLine 0 CALL LCD_Command MOVLW 0A1h ; ADC invers BTFSC Ziffer,0 MOVLW 0A0h ; ADC nicht invers CALL LCD_Command MOVLW 0A3h ; LCD-Bias = 1/6 CALL LCD_Command MOVLW 0C0h ; Output Status = 0 CALL LCD_Command MOVLW 2Fh ; Voltages on CALL LCD_Command MOVLW 0A4h ; Test aus CALL LCD_Command MOVLW 0AFh ; Display ein CALL LCD_Command MOVLW 0A6h ; Reverse Color aus BTFSC Ziffer,1 MOVLW 0A7h ; Colors Reverse CALL LCD_Command MOVLW 90h ; Kontrast 80..9F CALL LCD_Command MOVLW 0B0h MOVWF Nibble __giz: MOVLW 132 MOVWF LcdHudl MOVF Nibble,W CALL LCD_Command MOVLW 10h CALL LCD_Command CLRW CALL LCD_Command __liz: CLRW CALL LCD_WriteData DECFSZ LcdHudl,F GOTO __liz INCF Nibble,F MOVLW 0B4h XORWF Nibble,W SKIP Z GOTO __giz MOVF Lbegin,W MOVWF Xposi CLRW CALL ZifferOut MOVLW 1 CALL ZifferOut MOVLW 2 CALL ZifferOut MOVLW 3 CALL ZifferOut MOVLW 4 CALL ZifferOut MOVLW 5 CALL ZifferOut CALL DeziPunkt MOVLW 6 CALL ZifferOut MOVLW 7 CALL ZifferOut MOVLW 8 CALL ZifferOut MOVLW 9 CALL ZifferOut RETURN DoBankPos: CALL LCD_Command SWAPF Xposi,W ANDLW 15 ADDLW 10h ; hiNibbel Column CALL LCD_Command MOVF Xposi,W ; loNibble Colum ANDLW 15 GOTO LCD_Command ; die Ziffern für einen 7x14 Ziffernsatz ; macht 10*7 = 70 Worte ; 8 uo 7 Ziff_0: DATA B'11111001111111' DATA B'11111111111111' DATA B'00000110000000' DATA B'00000110000000' DATA B'00000110000000' DATA B'11111111111111' DATA B'11111001111111' ; 8 uo 7 Ziff_1: DATA B'00000000000000' DATA B'00000000110000' DATA B'00000001110000' DATA B'11111111111111' DATA B'11111111111111' DATA B'00000000000000' DATA B'00000000000000' ; 8 uo 7 Ziff_2: DATA B'00111101100000' DATA B'01111111100000' DATA B'11000110000000' DATA B'10000110000001' DATA B'00000110000011' DATA B'00000111111110' DATA B'00000101111100' ; 8 uo 7 Ziff_3: DATA B'00011001100000' DATA B'00011111100000' DATA B'00000110000000' DATA B'00000110000110' DATA B'00000110000110' DATA B'11111111111001' DATA B'11111001110000' ; 8 uo 7 Ziff_4: DATA B'10000000000011' DATA B'10000000001111' DATA B'10000000111100' DATA B'10000001110000' DATA B'11111111111111' DATA B'11111111111111' DATA B'10000000000000' ; 8 uo 7 Ziff_5: DATA B'00011011111100' DATA B'00011111111100' DATA B'00000110000100' DATA B'00000110000100' DATA B'00000110000110' DATA B'11111110000011' DATA B'11111010000001' ; 8 uo 7 Ziff_6: DATA B'11111000011111' DATA B'11111101111111' DATA B'00000111000010' DATA B'00000110000010' DATA B'00000110000010' DATA B'11111101000011' DATA B'11111000000000' ; 8 uo 7 Ziff_7: DATA B'00000011000000' DATA B'00000011000000' DATA B'01111110000000' DATA B'11111110000011' DATA B'00000010001111' DATA B'00000011111000' DATA B'00000011100000' ; 8 uo 7 Ziff_8: DATA B'11111001111000' DATA B'11111111111101' DATA B'00000110000010' DATA B'00000110000010' DATA B'00000110000010' DATA B'11111111111101' DATA B'11111001111000' ; 8 uo 7 Ziff_9: DATA B'00000001111100' DATA B'00001011111100' DATA B'00001110000010' DATA B'00000110000010' DATA B'00000110000010' DATA B'11111111111111' DATA B'11111001111111' DeziPunkt: MOVLW 0B0h ; Page 0 CALL DoBankPos MOVLW 12 CALL LCD_WriteData CALL LCD_WriteData CLRW CALL LCD_WriteData MOVLW 0B1h ; Page 1 CALL DoBankPos CLRW CALL LCD_WriteData CALL LCD_WriteData CALL LCD_WriteData MOVLW 3 ADDWF Xposi,F RETURN ; Ziffer ausgeben. ; Xposi = X-Position ; W = 0..9 für Ziffer ZifferOut: MOVWF EEpos ; 0..9 BCF Carry CLRF EEposhi RLF EEpos,F ; *2 0..18 ADDWF EEpos,F ; *3 0..27 RLF EEpos,F ; *6 0..54 ADDWF EEpos,F ; *7 0..63 MOVLW lo(Ziff_0) ADDWF EEpos,F SKIP NC INCF EEposhi,F MOVLW hi(Ziff_0) ADDWF EEposhi,F MOVLW 7 MOVWF Hudl _zio: MOVLW 0B1h ; Page 1 CALL DoBankPos MOVF EEpos,W BSF RP1 BCF RP0 ;Bank 2 MOVWF EEADR ;address bytes BCF RP1 MOVF EEposhi,W BSF RP1 MOVWF EEADRH ;address to read BSF RP0 ;Bank 3 BSF EE_PGD ;Point to Program memory BSF EE_RD ;Start read operation NOP ;Required two NOPs NOP ; BCF RP0 ;Bank 2 MOVF EEDATA, W ;DATAL = EEDATA BCF RP1 ;Bank0 CALL LCD_WriteData DECF Hudl,W SKIP NZ CALL LCD_WriteData MOVLW 0B0h ; Page 0 CALL DoBankPos BSF RP1 MOVF EEDATH,W ;DATAH = EEDATH BCF RP1 MOVWF Nibble RLF Nibble,F RLF Nibble,W ANDLW B'11111100' CALL LCD_WriteData DECF Hudl,W SKIP NZ CALL LCD_WriteData INCF Xposi,F INCF EEpos,F SKIP NZ INCF EEposhi,F DECFSZ Hudl,F GOTO _zio INCF Xposi,F RETURN END