# HG changeset patch # User JeanDo # Date 1294580349 -3600 # Node ID c09b0be2e1e697682a710dc6d995cd7de29f3437 # Parent 8bda2452a53260b3f3e3c5b473bd41cb0f5942af PIXEL_WRITE macros. + obey win_flip_screen flag. diff -r 8bda2452a532 -r c09b0be2e1e6 code_part1/OSTC_code_asm_part1/menu_logbook.asm --- a/code_part1/OSTC_code_asm_part1/menu_logbook.asm Sun Jan 09 11:45:20 2011 +0100 +++ b/code_part1/OSTC_code_asm_part1/menu_logbook.asm Sun Jan 09 14:39:09 2011 +0100 @@ -491,7 +491,8 @@ movlw d'75' ; Zero-m row movwf apnoe_mins ; here: used for fill between rows incf timeout_counter3,W ; Init Column - call PLED_SetColumnPixel ; pixel x2 + + INIT_PIXEL_WROTE timeout_counter3 ; pixel x2 profile_display_loop: movff profile_temp+0,profile_temp2+0 @@ -522,13 +523,7 @@ movff xC+0,apnoe_mins ; Store last row for fill routine incf timeout_counter3,F - movf xC+0,W - call PLED_SetRow ; 0...259 - - movf timeout_counter3,W - call PLED_SetColumnPixel ; pixel x2 - call PLED_standard_color - call PLED_PxlWrite ; Write two pixels + PIXEL_WRITE timeout_counter3,xC+0 ; Set col(0..159) x row (0..239), put a std color pixel. profile_display_skip_loop1: ; skips readings! dcfsnz profile_temp2+0,F @@ -595,11 +590,7 @@ profile_display_fill_down2: ; Loop decf xC+1,F - movf xC+1,W ; Row - call PLED_SetRow ; 0...259 - - call PLED_standard_color - call PLED_PxlWrite_Single; Write one Pixel + HALF_PIXEL_WRITE xC+1 ; Updates just row (0..239) movf xC+0,W cpfseq xC+1 ; Loop until xC+1=xC+0 @@ -611,11 +602,7 @@ profile_display_fill_up2: ; Loop decf xC+1,F - movf xC+1,W ; Row - call PLED_SetRow ; 0...259 - - call PLED_standard_color - call PLED_PxlWrite_Single; Write one Pixel + HALF_PIXEL_WRITE xC+1 ; Updates just row (0..239) movf apnoe_mins,W cpfseq xC+1 ; Loop until xC+1=apnoe_mins diff -r 8bda2452a532 -r c09b0be2e1e6 code_part1/OSTC_code_asm_part1/oled_samsung.asm --- a/code_part1/OSTC_code_asm_part1/oled_samsung.asm Sun Jan 09 11:45:20 2011 +0100 +++ b/code_part1/OSTC_code_asm_part1/oled_samsung.asm Sun Jan 09 14:39:09 2011 +0100 @@ -58,62 +58,100 @@ return ;============================================================================= -; PLED_SetColumnPixel: +; Macro to provides our own interface code. ; -PLED_SetColumnPixel: - movff WREG,win_leftx2 ; d'0' ... d'159' - mullw 2 ; Copy to PROD, times 2. +PIXEL_WRITE macro colRegister, rowRegister + movff colRegister,win_leftx2 + movff rowRegister,win_top + call pixel_write + endm - movlw 0x21 ; Start Address Vertical (.0 - .319) - rcall PLED_CmdWrite - bra PLED_DataWrite_PROD +INIT_PIXEL_WROTE macro colRegister + movff colRegister,win_leftx2 + call init_pixel_write + endm + +HALF_PIXEL_WRITE macro rowRegister + movff rowRegister,win_top + call half_pixel_write + endm -;============================================================================= -; PLED_SetRow: -; Backup WREG --> win_top, for the next write pixel. -; Setup OLED pixel horizontal address. -; -PLED_SetRow: - movff WREG,win_top ; d'0' ... d'239' - mullw 1 ; Copy row to PRODH:L - movlw 0x20 ; Horizontal Address START:END - rcall PLED_CmdWrite - bra PLED_DataWrite_PROD - -;============================================================================= -; PLED Write Two Pixel -; +;----------------------------------------------------------------------------- +; Init for half_pixel_write +; Set column register on OLED device, and current color. +; Inputs: win_leftx2 +; Outputs: win_color:2 +; Trashed: WREG, PROD +init_pixel_write: + movff win_leftx2,WREG + mullw 2 + rcall pixel_write_col320 ; Start Address Vertical (.0 - .319) + goto PLED_standard_color + +;----------------------------------------------------------------------------- +; Writes two half-pixels at position (win_top,win_leftx2) +; Inputs: win_leftx2, win_top, win_color:2 +; Trashed: WREG, PROD +pixel_write: + movff win_leftx2,WREG + mullw 2 + rcall pixel_write_col320 ; Start Address Vertical (.0 - .319) + rcall half_pixel_write ; Write this half-one. -PLED_PxlWrite: - rcall PLED_PxlWrite_Single ; Write first pixel. + movff win_leftx2,WREG ; Address of next one + mullw 2 + infsnz PRODL ; +1 + incf PRODH + rcall pixel_write_col320 + bra half_pixel_write ; Note: Cmd 0x20 is mandatory, because + ; of the autoincrement going vertical + + ;---- Do the 16bit 319-X-->X, if needed, and send to OLED ------------ +pixel_write_col320: + movff win_flags,WREG ; BEWARE: bank0 bit-test + btfss WREG,0 ; 180° rotation ? + bra pixel_write_noflip_H + + movf PRODL,W ; 16bits 319 - PROD --> PROD + sublw LOW(.319) ; 319-W --> W + movwf PRODL + movf PRODH,W + btfss STATUS,C ; Borrow = /CARRY + incf WREG + sublw HIGH(.319) + movwf PRODH -; Write 2nd Pixel on same row but one column to the right - movff win_top,WREG - rcall PLED_SetRow ; Re-Set Row - movff win_leftx2,WREG ; Increment column address. - mullw 2 - incf PRODL - clrf WREG ; Does not reset CARRY... - addwfc PRODH - movlw 0x21 ; Start Address Vertical (.0 - .319) - rcall PLED_CmdWrite - rcall PLED_DataWrite_PROD - ; Continue with PLED_PxlWrite_Single... +pixel_write_noflip_H: + movlw 0x21 ; Start Address Vertical (.0 - .319) + rcall PLED_CmdWrite + bra PLED_DataWrite_PROD + +;----------------------------------------------------------------------------- +; Writes one half-pixel at position (win_top,win_leftx2). +; Inputs: win_leftx2, win_top, win_color:2 +; Trashed: WREG, PROD +half_pixel_write: + movff win_top,WREG ; d'0' ... d'239' + + movff win_flags,PRODL ; BEWARE: bank0 bit-test + btfsc PRODL,0 ; 180° rotation ? + sublw .239 ; 239-Y --> Y -; ----------------------------- -; 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 + mullw 1 ; Copy row to PRODH:L + movlw 0x20 ; Horizontal Address START:END + rcall PLED_CmdWrite + rcall PLED_DataWrite_PROD + + 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