'**************************************************************** '* Creates a variable sized BAR-graph anywhere on the screen * '**************************************************************** '* Name : LCDbar_INC.bas * '* 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 * '* : * '**************************************************************** ; default 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 0 ; Identify the Custom Characters TwoBARS CON 1 OneBAR CON 2 ASM lines = 0x10000001 ; Define the Styles boxed = 0x10000002 blocks = 0x10000003 ENDASM ; --- lines Style custom chars ---- CharsetLines: LCDOut $FE,$40,REP $15\8 ; Custom char 0 - 3 lines ||| LCDOut $FE,$48,REP $14\8 ; Custom char 1 - 2 lines || LCDOut $FE,$50,REP $10\8 ; Custom char 2 - 1 line | RETURN ; --- boxed Style custom chars ---- CharsetBoxed: LCDOut $FE,$40,$1F,REP $15\6,$1F ; III LCDOut $FE,$48,$1C,REP $14\6,$1C ; II LCDOut $FE,$50,REP $10\8 ; I RETURN ; --- blocks Style custom chars ---- CharsetBlocks: LCDOut $FE,$40,REP $1F\8 LCDOut $FE,$48,REP $1C\8 LCDOut $FE,$50,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: