Code:
'****************************************************************
'* Creates a variable sized BAR-graph anywhere on the screen *
'****************************************************************
'* Name : LCDbar_INC_MOD1.bas *
'* Original: *
'* Author : Darrel Taylor *
'* Notice : Copyright (c) 2005 *
'* Date : 9/8/2005 *
'* Version : 1.0 *
'* Notes : Maximum Range is 32768 *
'* : Range must always be a Constant *
'* : Value must always be a WORD variable *
'* : *
'* Modified : By SteveB on 11/23/2012 *
'* : The original include has been modified to *
'* : accomodate a flaw in Newhaven OLEDs firmware. *
'* : By using the define below, it will adjust the *
'* : custom CGRAM character locations used to 1-3 *
'* : (vs. 0-2). *
'* : *
'* : If using a flawed Newhaven Display add the *
'* : following define BEFORE the INCLUDE statement: *
'* : *
'* : DEFINE NEWHAVEN_DISPLAY 1 *
'* : *
'****************************************************************
BAR_width VAR BYTE : BAR_width = 16 ; Width of the BARgraph 16
BAR_range VAR WORD : BAR_range = 100 ; Range of Values (0-100) 100
BAR_row VAR BYTE : BAR_row = 1 ; Row location (1-4) 1
BAR_col VAR BYTE : BAR_col = 0 ; Column location (0-15) 0
BAR_value VAR WORD : BAR_value = 0 ; Current BAR value 0
BAR_style VAR BYTE : BAR_style = 1 ; 1=lines, 2=boxed, 3=blocks 1
; --- Temporary vars ----
BARtemp VAR WORD
Remainder VAR WORD
BARloop VAR BYTE
LastCharset VAR BYTE : LastCharset = 0
Limit1 VAR WORD
GOTO overBAR ; Skip over Subroutines
ThreeBARS CON EXT
TwoBARS CON EXT
OneBAR CON EXT
CharLoc3 CON EXT
CharLoc2 CON EXT
CharLoc1 CON EXT
ASM
ifdef NEWHAVEN_DISPLAY
ThreeBARS = 1 ; Identify the Custom Characters
TwoBARS = 2
OneBAR = 3
else
ThreeBARS = 0 ; Identify the Custom Characters
TwoBARS = 1
OneBAR = 2
endif
CharLoc3 = 40h +(ThreeBARS*8)
CharLoc2 = 40h +(TwoBARS*8)
CharLoc1 = 40h +(OneBAR*8)
lines = 0x10000001 ; Define the Styles
boxed = 0x10000002
blocks = 0x10000003
ENDASM
; --- lines Style custom chars ----
CharsetLines:
LCDOut $FE,CharLoc3,REP $15\8 ; Custom char 0 - 3 lines |||
LCDOut $FE,CharLoc2,REP $14\8 ; Custom char 1 - 2 lines ||
LCDOut $FE,CharLoc1,REP $10\8 ; Custom char 2 - 1 line |
RETURN
; --- boxed Style custom chars ----
CharsetBoxed:
LCDOut $FE,CharLoc3,$1F,REP $15\6,$1F ; III
LCDOut $FE,CharLoc2,$1C,REP $14\6,$1C ; II
LCDOut $FE,CharLoc1,REP $10\8 ; I
RETURN
; --- blocks Style custom chars ----
CharsetBlocks:
LCDOut $FE,CharLoc3,REP $1F\8
LCDOut $FE,CharLoc2,REP $1C\8
LCDOut $FE,CharLoc1,REP $10\8
RETURN
; ----- Show the BAR graph -----------------------------------------------------
ShowBAR:
IF BAR_width = 0 then BARdone
if LastCharset <> BAR_style then ; If the Style has changed ?
LastCharset = BAR_style
SELECT CASE BAR_style ; Load the new custom chars
CASE 1 : GOSUB CharsetLines
CASE 2 : GOSUB CharsetBoxed
CASE 3 : GOSUB CharsetBlocks
END SELECT
endif
@ ifdef LCD4X20
LOOKUP BAR_row,[$80,$80,$C0,$94,$D4],BARtemp
@ else
LOOKUP BAR_row,[$80,$80,$C0,$90,$D0],BARtemp
@ endif
LCDOUT $FE, BARtemp + BAR_col ; Move cursor to start of the BAR
BARtemp = BAR_value * BAR_width ; calc the char position
BARtemp = DIV32 BAR_range
Remainder = R2
For BARloop = 0 to BAR_width -1
SELECT CASE BARtemp
CASE IS > BARloop
LCDOUT ThreeBARS ; send 3 bars |||
CASE IS < BARloop
LCDOUT " " ; clear to end of BARwidth
CASE IS = BARloop
Limit1 = BAR_range * 6
Limit1 = DIV32 10
if Remainder >= Limit1 then
LCDOUT TwoBARS ; send 2 bars ||
else
Limit1 = BAR_range * 3
Limit1 = DIV32 10
if Remainder >= Limit1 then ; 30%
LCDOUT OneBAR ; send 1 bar |
else
LCDOUT " " ; no bars
endif
endif
END SELECT
NEXT BARloop
BARdone:
RETURN
ASM
; --- The main macro for creating BARgraphs ------------------------------------
BARgraph macro Value, Row, Col, Width, Range, Style
MOVE?CW Range, _BAR_range ; Range MUST be a constant
MOVE?WW Value, _BAR_value ; Value MUST be a WORD variable
if (Row < 5) ; Row is a constant
MOVE?CB Row, _BAR_row
else ; Row is a variable
MOVE?BB Row, _BAR_row
endif
if (Col < 16) ; Is Col a constant ?
MOVE?CB Col, _BAR_col
else ; NO, it's a variable
MOVE?BB Col, _BAR_col
endif
if (Width <= 40)
MOVE?CB Width, _BAR_width
else
MOVE?BB Width, _BAR_width
endif
if ((Style >= lines) & (Style <= blocks)) ; Is Style a valid constant ?
MOVE?CB Style, _BAR_style
else ; NO, treat it like a variable
MOVE?BB Style, _BAR_style
endif
L?CALL _ShowBAR
endm
ENDASM
overBAR:
Of course, more could be done to make this even more flexible, but this is at least a tidy way do deal with this particular problem.
Bookmarks