Explanation:
GCBASIC can draw circles on a Graphical LCD device using GCBASIC library functions.
Demonstration program:
;Circle and filled circle commands on a graphic LCD.
;This uses the 2-place trigonometric routines found in the include file.
;----- Configuration
#CHIP 16F88, 8 ;PIC16F88 RUNNING AT 8 MHZ
#CONFIG MCLR=OFF ;RESET HANDLED INTERNALLY
#OPTION EXPLICIT
#DEFINE USELEGACYFORNEXT ;WILL ENSURE THE OLD FOR-NEXT Loop is used just to save some memory as this is a very simple FOR-NEXT loop
#INCLUDE <GLCD.H>
#INCLUDE <TRIG2PLACES.H>
;----- Constants
;Pinout is shown for the LCM12864H-FSB-FBW
;graphical LCD available from Amazon.
; +5V ;LCD pin 1
; ground ;LCD pin 2
; Vo = wiper of pot ;LCD pin 3
#define GLCD_DB0 PORTB.0 ;LCD pin 4
#define GLCD_DB1 PORTB.1 ;LCD pin 5
#define GLCD_DB2 PORTB.2 ;LCD pin 6
#define GLCD_DB3 PORTB.3 ;LCD pin 7
#define GLCD_DB4 PORTB.4 ;LCD pin 8
#define GLCD_DB5 PORTB.5 ;LCD pin 9
#define GLCD_DB6 PORTB.6 ;LCD pin 10
#define GLCD_DB7 PORTB.7 ;LCD pin 11
#define GLCD_CS2 PORTA.0 ;LCD pin 12
#define GLCD_CS1 PORTA.1 ;LCD pin 13
#define GLCD_RESET PORTA.2 ;LCD pin 14
#define GLCD_RW PORTA.3 ;LCD pin 15
#define GLCD_RS PORTA.4 ;LCD pin 16
#define GLCD_ENABLE PORTA.6 ;LCD pin 17
; Vee = pot low side ;LCD pin 18
; backlight anode ;LCD pin 19
; backlight cathode ;LCD pin 20
#define GLCD_TYPE GLCD_TYPE_KS0108
#define GLCD_WIDTH 128
#define GLCD_HEIGHT 64
;----- Variables
dim cx, cy, edge, jj as byte
dim ii as word
;----- Program
myCircle(10,10,10)
;upper left
myCircle(117,10,10) ;upper right
myCircleFilled(63,31,10) ;center
myCircle(63,31,20) ;center
myCircleFilled(10,53,10) ;lower left
myCircleFilled(117,53,10) ;lower right
;----- Subroutines
sub myCircle(cenX, cenY, rad)
;Center of circle = (cenX,cenY), radius = rad
for ii = 0 to 358 step 2 ;every two degrees
cx = cenX -((10*rad*cos(ii))/100+5)/10 ;properly rounded x value
cy = cenY -((10*rad*sin(ii))/100+5)/10 ;properly rounded y value
;the following ignores the pixel if off the screen
if (cx>=0 and cx<=GLCD_WIDTH and cy>=0 and cy<=GLCD_HEIGHT) then
Pset(cx, cy, on)
end if
next ii
end sub
sub myCircleFilled(cenX, cenY, rad)
;Center of circle = (cenX,cenY), radius = rad
for ii = 0 to 358 step 2
cx = cenX -((10*rad*cos(ii))/100+5)/10
cy = cenY -((10*rad*sin(ii))/100+5)/10
edge = 2 * cenX - cx ;compute right edge
for jj = cx to edge ;fill entire line, uses legacy for next permitting CX to be less than edge
if (jj>=0 and jj<=GLCD_WIDTH and cy>=0 and cy<=GLCD_HEIGHT) then
Pset(jj,cy,on)
end if
next jj
next ii
end subSee also Trigonometry, Circle, FilledCircle,

