Mercurial > public > mk2
diff code_part1/OSTC_code_asm_part1/oled_samsung.asm @ 0:96a35aeda5f2
Initial setup
author | heinrichsweikamp |
---|---|
date | Tue, 12 Jan 2010 15:05:59 +0100 |
parents | |
children | d11ef8dc4b2c |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/code_part1/OSTC_code_asm_part1/oled_samsung.asm Tue Jan 12 15:05:59 2010 +0100 @@ -0,0 +1,768 @@ +; OSTC - diving computer code +; Copyright (C) 2009 HeinrichsWeikamp GbR + +; This program is free software: you can redistribute it and/or modify +; it under the terms of the GNU General Public License as published by +; the Free Software Foundation, either version 3 of the License, or +; (at your option) any later version. + +; This program is distributed in the hope that it will be useful, +; but WITHOUT ANY WARRANTY; without even the implied warranty of +; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +; GNU General Public License for more details. + +; You should have received a copy of the GNU General Public License +; along with this program. If not, see <http://www.gnu.org/licenses/>. + + +; hardware routines for S6E6D6 Samsung OLED Driver IC +; written by: Matthias Heinrichs, info@heinrichsweikamp.com +; written: 090801 +; last updated: 090830 +; known bugs: +; ToDo: Optimise PLED_box calls + +WIN_FONT macro win_font_input + movlw win_font_input + movff WREG,win_font + endm + +WIN_TOP macro win_top_input + movlw win_top_input + movff WREG,win_top + endm + +WIN_LEFT macro win_left_input + movlw win_left_input + movff WREG,win_leftx2 + endm + +WIN_INVERT macro win_invert_input + movlw win_invert_input + movff WREG,win_invert + endm + +WIN_COLOR macro win_color_input + movlw win_color_input + call PLED_set_color + endm + + +word_processor: ; word_processor: + clrf POSTINC2 ; Required! + movff win_color2,win_color2_temp + movff win_color1,win_color1_temp + call main_wordprocessor ; C-Code + movlb b'00000001' ; Back to Rambank1 + movff win_color2_temp,win_color2 + movff win_color1_temp,win_color1 + return + +; ----------------------------- +; PLED_SetColumnPixel: +; ----------------------------- +PLED_SetColumnPixel: + movwf LastSetColumn ; d'0' ... d'159' + movff LastSetColumn,win_leftx2 + movlw 0x21 ; Start Address Vertical (.0 - .319) + rcall PLED_CmdWrite + bcf STATUS,C + rlcf LastSetColumn,W ; x2 -> WREG + movlw d'0' + btfsc STATUS,C ; Result >255? + movlw d'1' ; Yes: Upper=1! + rcall PLED_DatWrite ; Upper + bcf STATUS,C + rlcf LastSetColumn,W ; x2 -> WREG + rcall PLED_DatWrite ; Lower + return + +; ----------------------------- +; PLED_SetRow: +; ----------------------------- +PLED_SetRow: + movwf LastSetRow ; d'0' ... d'239' + movff LastSetRow,win_top + movlw 0x20 ; Horizontal Address START:END + rcall PLED_CmdWrite + movlw 0x00 + rcall PLED_DatWrite + movf LastSetRow,W + rcall PLED_DatWrite + return + +; ----------------------------- +; PLED Write Two Pixel +; ----------------------------- +PLED_PxlWrite: + movlw 0x22 ; Start Writing Data to GRAM + rcall PLED_CmdWrite + bsf oled_rs ; Data! + movff win_color1,PORTD + bcf oled_rw + bsf oled_rw ; Upper + movff win_color2,PORTD + bcf oled_rw + bsf oled_rw ; Lower + +; Reset Column+1 + movlw 0x21 ; Start Address Vertical (.0 - .319) + rcall PLED_CmdWrite + bcf STATUS,C + rlcf LastSetColumn,W ; x2 + movlw d'0' + btfsc STATUS,C ; Result >256? + movlw d'1' ; Yes! + rcall PLED_DatWrite ; Upper + bcf STATUS,C + rlcf LastSetColumn,F + incf LastSetColumn,W ; x2 + rcall PLED_DatWrite ; Lower + +; Reset Row + movlw 0x20 ; Horizontal Address START:END + rcall PLED_CmdWrite + movlw 0x00 + rcall PLED_DatWrite + movf LastSetRow,W + rcall PLED_DatWrite + +; Write 2nd Pixel on same row but one column to the right + movlw 0x22 ; Start Writing Data to GRAM + rcall PLED_CmdWrite + bsf oled_rs ; Data! + movff win_color1,PORTD + bcf oled_rw + bsf oled_rw ; Upper + movff win_color2,PORTD + bcf oled_rw + bsf oled_rw ; Lower + return + +; ----------------------------- +; PLED Write One Pixel +; ----------------------------- +PLED_PxlWrite_Single: + movlw 0x22 ; Start Writing Data to GRAM + rcall PLED_CmdWrite + bsf oled_rs ; Data! + movff win_color1, PORTD + bcf oled_rw + bsf oled_rw ; Upper + movff win_color2, PORTD + bcf oled_rw + bsf oled_rw ; Lower + return + +; ----------------------------- +; PLED Display Off +; ----------------------------- +PLED_DisplayOff: + clrf PORTD + bcf oled_hv + bcf oled_vdd + bcf oled_cs + bcf oled_e_nwr + bcf oled_rw + bcf oled_nreset + return + +; ----------------------------- +; PLED FRAME (win_color1 and win_color2) +; ----------------------------- +PLED_frame: + movf box_temp+0,W + call PLED_set_color + ; draw right line from row top (box_temp+1) to row bottom (box_temp+2) + movff box_temp+1,draw_box_temp1 ; Store start row +PLED_frame2: + movf draw_box_temp1,W ; d'0' ... d'239' + rcall PLED_SetRow ; Set Row + movf box_temp+3,W ; d'0' ... d'159' + call PLED_SetColumnPixel ; Set left column + rcall PLED_PxlWrite_Single ; Write Pixel + incf draw_box_temp1,F + movf draw_box_temp1,W ; Copy to W + cpfseq box_temp+2 ; Done? + bra PLED_frame2 ; Not yet... + + movf draw_box_temp1,W ; d'0' ... d'239' + rcall PLED_SetRow ; Set Row + movf box_temp+3,W ; d'0' ... d'159' + call PLED_SetColumnPixel ; Set left column + rcall PLED_PxlWrite_Single ; Write Pixel + + ; draw left line from row top (box_temp+1) to row bottom (box_temp+2) + movff box_temp+1,draw_box_temp1 ; Store start row +PLED_frame3: + movf draw_box_temp1,W ; d'0' ... d'239' + rcall PLED_SetRow ; Set Row + movf box_temp+4,W ; d'0' ... d'159' + call PLED_SetColumnPixel ; Set left column + rcall PLED_PxlWrite_Single ; Write Pixel + incf draw_box_temp1,F + movf draw_box_temp1,W ; Copy to W + cpfseq box_temp+2 ; Done? + bra PLED_frame3 ; Not yet... + + movf draw_box_temp1,W ; d'0' ... d'239' + rcall PLED_SetRow ; Set Row + movf box_temp+4,W ; d'0' ... d'159' + call PLED_SetColumnPixel ; Set left column + rcall PLED_PxlWrite_Single ; Write Pixel + + ; draw top line from box_temp+3 (0-159) to box_temp+4 (0-159) + movff box_temp+3,draw_box_temp1 ; Store start column +PLED_frame4: + movf draw_box_temp1,W ; d'0' ... d'159' + rcall PLED_SetColumnPixel ; Set Column + movf box_temp+1,W ; d'0' ... d'239' + rcall PLED_SetRow ; Set Row + rcall PLED_PxlWrite ; Write 2 Pixels + incf draw_box_temp1,F + movf draw_box_temp1,W + cpfseq box_temp+4 + bra PLED_frame4 + + ; draw bottom line from box_temp+3 (0-159) to box_temp+4 (0-159) + movff box_temp+3,draw_box_temp1 ; Store start column +PLED_frame5: + movf draw_box_temp1,W ; d'0' ... d'159' + rcall PLED_SetColumnPixel ; Set Column + movf box_temp+2,W ; d'0' ... d'239' + rcall PLED_SetRow ; Set Row + rcall PLED_PxlWrite ; Write 2 Pixels + incf draw_box_temp1,F + movf draw_box_temp1,W + cpfseq box_temp+4 + bra PLED_frame5 + + movlw color_white + call PLED_set_color + + return + +; ----------------------------- +; PLED Box (win_color1 and win_color2) +; ----------------------------- +PLED_box: + movf box_temp+0,W + call PLED_set_color +; /Define Window + movlw 0x35 ; VerticalStartAddress HIGH:LOW + rcall PLED_CmdWrite + movff box_temp+3,draw_box_temp1 + bcf STATUS,C + rlcf draw_box_temp1,W ; x2 + movlw d'0' + btfsc STATUS,C ; Result >255? + movlw d'1' ; Yes: Upper=1! + rcall PLED_DatWrite ; Upper + bcf STATUS,C + rlcf draw_box_temp1,W ; x2 -> WREG + rcall PLED_DatWrite ; Lower + + movlw 0x36 ; VerticalEndAddress HIGH:LOW + rcall PLED_CmdWrite + movff box_temp+4,draw_box_temp1 + bcf STATUS,C + rlcf draw_box_temp1,W ; x2 + movlw d'0' + btfsc STATUS,C ; Result >255? + movlw d'1' ; Yes: Upper=1! + rcall PLED_DatWrite ; Upper + bcf STATUS,C + rlcf draw_box_temp1,W ; x2 -> WREG + rcall PLED_DatWrite ; Lower + + movlw 0x37 ; HorizontalAddress START:END + rcall PLED_CmdWrite + movff box_temp+1,draw_box_temp1 + movf draw_box_temp1,W + rcall PLED_DatWrite + movff box_temp+2,draw_box_temp1 + movf draw_box_temp1,W + rcall PLED_DatWrite + + movlw 0x20 ; Start Address Horizontal (.0 - .239) + rcall PLED_CmdWrite + movlw 0x00 + rcall PLED_DatWrite + movff box_temp+1,draw_box_temp1 + movf draw_box_temp1,W + rcall PLED_DatWrite + + movlw 0x21 ; Start Address Vertical (.0 - .319) + rcall PLED_CmdWrite + movff box_temp+3,draw_box_temp1 + bcf STATUS,C + rlcf draw_box_temp1,W ; x2 + movlw d'0' + btfsc STATUS,C ; Result >255? + movlw d'1' ; Yes: Upper=1! + rcall PLED_DatWrite ; Upper + bcf STATUS,C + rlcf draw_box_temp1,W ; x2 -> WREG + rcall PLED_DatWrite ; Lower +; /Define Window + +; Fill Window + movlw 0x22 ; Start Writing Data to GRAM + rcall PLED_CmdWrite + + movff box_temp+1,draw_box_temp1 + movff box_temp+2,draw_box_temp2 + movf draw_box_temp1,W + subwf draw_box_temp2,F ; X length + incf draw_box_temp2,F + + movff box_temp+3,draw_box_temp1 + movff box_temp+4,draw_box_temp3 + movf draw_box_temp1,W + subwf draw_box_temp3,F ; Y length/2 + + incf draw_box_temp3,F ; Last pixel... + + bsf oled_rs ; Data! + +PLED_box2: + movff draw_box_temp3,draw_box_temp1 +PLED_box3: + movff win_color1,PORTD + bcf oled_rw + bsf oled_rw ; Upper + movff win_color2,PORTD + bcf oled_rw + bsf oled_rw ; Lower + + movff win_color1,PORTD + bcf oled_rw + bsf oled_rw ; Upper + movff win_color2,PORTD + bcf oled_rw + bsf oled_rw ; Lower + + decfsz draw_box_temp1,F + bra PLED_box3 + decfsz draw_box_temp2,F + bra PLED_box2 + + movlw 0x00 ; NOP, to stop Address Update Counter + rcall PLED_CmdWrite + + movlw color_white + call PLED_set_color + return + + +; ----------------------------- +; PLED_ClearScreen: +; ----------------------------- +PLED_ClearScreen: + movlw 0x35 ; VerticalStartAddress HIGH:LOW + rcall PLED_CmdWrite + movlw 0x00 + rcall PLED_DatWrite + movlw 0x00 + rcall PLED_DatWrite + + movlw 0x36 ; VerticalEndAddress HIGH:LOW + rcall PLED_CmdWrite + movlw 0x01 + rcall PLED_DatWrite + movlw 0x3F + rcall PLED_DatWrite + + movlw 0x37 ; HorizontalAddress START:END + rcall PLED_CmdWrite + movlw 0x00 + rcall PLED_DatWrite + movlw 0xEF + rcall PLED_DatWrite + + movlw 0x20 ; Start Address Horizontal (.0 - .239) + rcall PLED_CmdWrite + movlw 0x00 + rcall PLED_DatWrite + movlw 0x00 + rcall PLED_DatWrite + + movlw 0x21 ; Start Address Vertical (.0 - .319) + rcall PLED_CmdWrite + movlw 0x00 + rcall PLED_DatWrite + movlw 0x00 + rcall PLED_DatWrite + + movlw 0x22 ; Start Writing Data to GRAM + rcall PLED_CmdWrite + + bsf oled_rs ; Data! + + clrf PORTD ; See Page 101 of OLED Driver IC Datasheet + + movlw d'10' + movwf draw_box_temp3 +PLED_ClearScreen2: + movlw d'30' + movwf draw_box_temp2 +PLED_ClearScreen3: + clrf draw_box_temp1 ; 30*10*256=76800 Pixels -> Clear complete 240*320 +PLED_ClearScreen4: + + bcf oled_rw + bsf oled_rw ; Upper + bcf oled_rw + bsf oled_rw ; Lower + + decfsz draw_box_temp1,F + bra PLED_ClearScreen4 + decfsz draw_box_temp2,F + bra PLED_ClearScreen3 + decfsz draw_box_temp3,F + bra PLED_ClearScreen2 + + movlw 0x00 ; NOP, to stop Address Update Counter + rcall PLED_CmdWrite + + return + + +; ----------------------------- +; PLED Write Cmd via W +; ----------------------------- +PLED_CmdWrite: + bcf oled_rs ; Command! + movwf PORTD ; Move Data to PORTD + bcf oled_rw + bsf oled_rw + return + +; ----------------------------- +; PLED Write Display Data via W +; ----------------------------- +PLED_DataWrite: + +; ----------------------------- +; PLED Data Cmd via W +; ----------------------------- +PLED_DatWrite: + bsf oled_rs ; Data! + movwf PORTD ; Move Data to PORTD + bcf oled_rw + bsf oled_rw + return + +; ----------------------------- +; PLED boot +; ----------------------------- +PLED_boot: + bcf oled_hv + WAITMS d'32' + bsf oled_vdd + nop + bcf oled_cs + nop + bsf oled_nreset + WAITMS d'10' ; Quick wake-up +; WAITMS d'250' + bsf oled_e_nwr + nop + bcf oled_nreset + WAIT10US d'2' + bsf oled_nreset + WAITMS d'10' + + movlw 0x24 ; 80-System 8-Bit Mode + rcall PLED_CmdWrite + + movlw 0x02 ; RGB Interface Control (S6E63D6 Datasheet page 42) + rcall PLED_CmdWrite + movlw 0x00 ; X X X X X X X RM + rcall PLED_DatWrite + movlw 0x00 ; DM X RIM1 RIM0 VSPL HSPL EPL DPL + rcall PLED_DatWrite ; System Interface: RIM is ignored, Internal Clock + + movlw 0x03 ; Entry Mode (S6E63D6 Datasheet page 46) + rcall PLED_CmdWrite + movlw 0x00 ; =b'00000000' CLS MDT1 MDT0 BGR X X X SS 65k Color + rcall PLED_DatWrite + movlw b'00110000' ; =b'00110000' X X I/D1 I/D0 X X X AM + rcall PLED_DatWrite + + movlw 0x18 + rcall PLED_CmdWrite + movlw 0x00 + rcall PLED_DatWrite + movlw 0x28 + rcall PLED_DatWrite + + movlw 0xF8 + rcall PLED_CmdWrite + movlw 0x00 + rcall PLED_DatWrite + movlw 0x0F + rcall PLED_DatWrite + + movlw 0xF9 + rcall PLED_CmdWrite + movlw 0x00 + rcall PLED_DatWrite + movlw 0x0F + rcall PLED_DatWrite + + movlw 0x10 + rcall PLED_CmdWrite + movlw 0x00 + rcall PLED_DatWrite + movlw 0x00 + rcall PLED_DatWrite + +; Now Gamma settings... + rcall PLED_brightness_full +; End Gamma Settings + + rcall PLED_ClearScreen + + bsf oled_hv + WAITMS d'32' + + movlw 0x05 + rcall PLED_CmdWrite + movlw 0x00 + rcall PLED_DatWrite + movlw 0x01 + rcall PLED_DatWrite ; Display ON + return + + +PLED_brightness_full: + movlw 0x70 + rcall PLED_CmdWrite + movlw 0x1F + rcall PLED_DatWrite + movlw 0x00 + rcall PLED_DatWrite + movlw 0x71 + rcall PLED_CmdWrite + movlw 0x23 + rcall PLED_DatWrite + movlw 0x80 + rcall PLED_DatWrite + movlw 0x72 + rcall PLED_CmdWrite + movlw 0x2A + rcall PLED_DatWrite + movlw 0x80 + rcall PLED_DatWrite + + movlw 0x73 + rcall PLED_CmdWrite + movlw 0x15 + rcall PLED_DatWrite + movlw 0x11 + rcall PLED_DatWrite + movlw 0x74 + rcall PLED_CmdWrite + movlw 0x1C + rcall PLED_DatWrite + movlw 0x11 + rcall PLED_DatWrite + + movlw 0x75 + rcall PLED_CmdWrite + movlw 0x1B + rcall PLED_DatWrite + movlw 0x15 + rcall PLED_DatWrite + movlw 0x76 + rcall PLED_CmdWrite + movlw 0x1A + rcall PLED_DatWrite + movlw 0x15 + rcall PLED_DatWrite + + movlw 0x77 + rcall PLED_CmdWrite + movlw 0x1C + rcall PLED_DatWrite + movlw 0x18 + rcall PLED_DatWrite + movlw 0x78 + rcall PLED_CmdWrite + movlw 0x21 + rcall PLED_DatWrite + movlw 0x15 + rcall PLED_DatWrite + + return + +PLED_brightness_low: + movlw 0x70 + rcall PLED_CmdWrite + movlw 0x14 + rcall PLED_DatWrite + movlw 0x00 + rcall PLED_DatWrite + movlw 0x71 + rcall PLED_CmdWrite + movlw 0x17 + rcall PLED_DatWrite + movlw 0x00 + rcall PLED_DatWrite + movlw 0x72 + rcall PLED_CmdWrite + movlw 0x15 + rcall PLED_DatWrite + movlw 0x80 + rcall PLED_DatWrite + + movlw 0x73 + rcall PLED_CmdWrite + movlw 0x15 + rcall PLED_DatWrite + movlw 0x11 + rcall PLED_DatWrite + movlw 0x74 + rcall PLED_CmdWrite + movlw 0x14 + rcall PLED_DatWrite + movlw 0x0B + rcall PLED_DatWrite + + movlw 0x75 + rcall PLED_CmdWrite + movlw 0x1B + rcall PLED_DatWrite + movlw 0x15 + rcall PLED_DatWrite + movlw 0x76 + rcall PLED_CmdWrite + movlw 0x13 + rcall PLED_DatWrite + movlw 0x0E + rcall PLED_DatWrite + + movlw 0x77 + rcall PLED_CmdWrite + movlw 0x1C + rcall PLED_DatWrite + movlw 0x18 + rcall PLED_DatWrite + movlw 0x78 + rcall PLED_CmdWrite + movlw 0x15 + rcall PLED_DatWrite + movlw 0x0E + rcall PLED_DatWrite + + return + +PLED_set_color:;Converts 8Bit RGB b'RRRGGGBB' into 16Bit RGB b'RRRRRGGGGGGBBBBB' + movwf oled1_temp ; Get 8Bit RGB b'RRRGGGBB' + movff oled1_temp, oled2_temp ; Copy + + ; Mask Bit 7,6,5,4,3,2 + movlw b'00000011' + andwf oled2_temp,F + + movlw b'00000000' + dcfsnz oled2_temp,F + movlw b'01010000' + dcfsnz oled2_temp,F + movlw b'10100000' + dcfsnz oled2_temp,F + movlw b'11111000' + movwf oled3_temp ; Blue done. + + movff oled1_temp, oled2_temp ; Copy + ; Mask Bit 7,6,5,1,0 + movlw b'00011100' + andwf oled2_temp,F + rrncf oled2_temp,F + rrncf oled2_temp,F + + movlw b'00000000' + dcfsnz oled2_temp,F + movlw b'00000100' + dcfsnz oled2_temp,F + movlw b'00001000' + dcfsnz oled2_temp,F + movlw b'00001100' + dcfsnz oled2_temp,F + movlw b'00010000' + dcfsnz oled2_temp,F + movlw b'00010100' + dcfsnz oled2_temp,F + movlw b'00100000' + dcfsnz oled2_temp,F + movlw b'00111111' + movwf oled4_temp + + rrcf oled4_temp,F + rrcf oled3_temp,F + + rrcf oled4_temp,F + rrcf oled3_temp,F + + rrcf oled4_temp,F + rrcf oled3_temp,F ; oled3_temp (b'GGGBBBBB') done. + + movff oled1_temp, oled2_temp ; Copy + clrf oled1_temp + + rrcf oled4_temp,F + rrcf oled1_temp,F + + rrcf oled4_temp,F + rrcf oled1_temp,F + + rrcf oled4_temp,F + rrcf oled1_temp,F ; Green done. + + ; Mask Bit 4,3,2,1,0 + movlw b'11100000' + andwf oled2_temp,F + + rrncf oled2_temp,F + rrncf oled2_temp,F + rrncf oled2_temp,F + rrncf oled2_temp,F + rrncf oled2_temp,F + + movlw b'00000000' + dcfsnz oled2_temp,F + movlw b'00000100' + dcfsnz oled2_temp,F + movlw b'00001000' + dcfsnz oled2_temp,F + movlw b'00001100' + dcfsnz oled2_temp,F + movlw b'00010000' + dcfsnz oled2_temp,F + movlw b'00010100' + dcfsnz oled2_temp,F + movlw b'00100000' + dcfsnz oled2_temp,F + movlw b'00111111' + movwf oled4_temp + + rrcf oled4_temp,F + rrcf oled1_temp,F + + rrcf oled4_temp,F + rrcf oled1_temp,F + + rrcf oled4_temp,F + rrcf oled1_temp,F + + rrcf oled4_temp,F + rrcf oled1_temp,F + + rrcf oled4_temp,F + rrcf oled1_temp,F ; Red done. + + movff oled1_temp,win_color1 + movff oled3_temp,win_color2 ; Set Bank0 Color registers... + return +