
The example shows a method of formation of a menu with options on an LCD in 4-bit mode. Setting of bit 1 on port F means go to the next option, whereas setting of bit 0 on port F means go to the previous option. The rate of transition to the next/previous option is limited so the maximum of 4 transitions per second is allowed.
{ This project is designed to work with PIC P30F6014A. It has been tested
on dsPICPRO3 development system with 10.0 MHz crystal and 8xPLL.
It should work with any other crystal.
Note: the maximum operating frequency for dsPIC is 120MHz.
With minor adjustments, this example should work with any other dsPIC MCU }
program MenuTest1;
var
menu_index : byte;
menu : array[1..5] of String[6]; absolute $1880;
// Directive absolute specifies
// the starting address in RAM for a variable.
begin
ADPCFG := $FFFF; // Configure PORTB as digital
TRISF := $FFFF; // Configure PORTF as input (menu control)
menu_index := 1; // Init menu_item[1]
menu[1] := 'First' ; // Menu items
menu[2] := 'Second';
menu[3] := 'Third' ;
menu[4] := 'Fourth';
menu[5] := 'Fifth' ;
Lcd_Init_DsPicPro3(); // Init LCD in 4-bit mode for dsPICPRO3 board
// Note: GLCD/LCD Setup routines are in the setup library files located in the Uses folder
// These routines will be moved into AutoComplete in the future.
Lcd_Cmd(LCD_CURSOR_OFF);
Lcd_Cmd(LCD_FIRST_ROW);
Lcd_Out(1,1,'Menu :');
Lcd_Out(1,8,menu[menu_index]); // Show menu element on LCD
while true do // endless loop
begin
if PORTF.1 = 1 then // Detect logical one on RF1 pin => MENU UP
begin
menu_index := menu_index+1; // Next index in menu
if menu_index>5 then
menu_index := 1; // Circular menu
Lcd_Out(1,8, ' '); // Clear text
Lcd_Out(1,8,menu[menu_index]); // Show menu element on LCD
Delay_ms(250); // No more than 4 changes per sec
end;
if PORTF.0 = 1 then // Detect logical one on RF0 pin => MENU DOWN
begin
menu_index := menu_index-1; // Previous index in menu
if menu_index<1 then
menu_index := 5; // Circular menu
Lcd_Out(1,8, ' '); // Clear text
Lcd_Out(1,8,menu[menu_index]); // Show menu element on LCD
Delay_ms(250); // No more than 4 changes per sec
end;
end;
end.




{ This project is designed to work with PIC P30F6014A. It has been tested
on dsPICPRO3 board with 10.0 MHz crystal and 8xPLL. It should work with any
other crystal. Note: the maximum operating frequency for dsPIC is 120MHz.
With minor adjustments, this example should work with any other dsPIC MCU
On-board DAC module
Enable SPI connection to DAC on SW4 and DAC's Load(LD) and Chip Select(CS) pins on SW3.
}
program DTMFout;
// *** Filter Designer Tool outputs *** //
const
BUFFER_SIZE = 8;
FILTER_ORDER = 3;
COEFF_B : array[FILTER_ORDER+1] of Integer=(0x21F3, 0x65DA, 0x65DA, 0x21F3);
COEFF_A : array[FILTER_ORDER+1] of Integer=(0x2000, 0xB06D, 0x47EC, 0xE8B6);
SCALE_B = 6;
SCALE_A = -2;
// *** DAC pinout *** //
const LOAD_PIN = 2; // DAC load pin
const CS_PIN = 1; // DAC CS pin
var
THalf_Low, THalf_High : word; // half-periods of low and high-frequency
// square signals
char2send : byte; // char recived from UART
sample, sending_ch_cnt : word; // digital signal sample, sending char counter
us_cntL, us_cntH : word; // low and high-frequency square
// signal microseconds counters
input : array[BUFFER_SIZE] of integer; // filter input signal (two square signals)
output : array[BUFFER_SIZE] of integer; // filtered signal
sample_index : word; // index of current sample
voltageL, voltageH : integer; // square signals amplitudes
procedure InitMain();
begin
LATC.CS_PIN := 1; // set DAC CS to inactive
LATC.LOAD_PIN := 0; // set DAC LOAD to inactive
TRISC.LOAD_PIN := 0; // configure DAC LOAD pin as output
TRISC.CS_PIN := 0; // configure DAC CS pin as output
// Initialize SPI2 module
Spi2_Init_Advanced(_SPI_MASTER, _SPI_16_BIT, _SPI_PRESCALE_SEC_1, _SPI_PRESCALE_PRI_1,
_SPI_SS_DISABLE, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_HIGH,
_SPI_ACTIVE_2_IDLE);
Uart1_Init(9600); // Initialize UART1 module
end;
procedure DAC_Output(valueDAC : word) ;
begin
LATC.CS_PIN := 0; // CS enable for DAC
// filter output range is 16-bit number; DAC input range is 12-bit number
valueDAC := valueDAC shr 4;
// now both numbers are 12-bit but filter output is signed and DAC input is unsigned.
// Half of DAC range 4096/2=2048 is added to correct this
valueDAC := valueDAC + 2048;
SPI2BUF := 0x3000 or valueDAC; // write valueDAC to DAC (0x3 is required by DAC)
while (SPI2STAT.1 = 1) do // wait for SPI module to finish sending
nop;
LATC.CS_PIN := 1; // CS disable for DAC
end;
procedure SetPeriods(ch:Word);
begin
{ DTMF frequencies:
1209 Hz 1336 Hz 1477 Hz 1633 Hz
697 Hz 1 2 3 A
770 Hz 4 5 6 B
852 Hz 7 8 9 C
941 Hz * 0 # D
}
// Calculate half-periods in microseconds
// example: 1/697Hz = 0.001435 seconds = 1435 microseconds
// 1435/2 = 717
case ch of
49: begin THalf_Low:=717; THalf_High:=414; end; //'1'
50: begin THalf_Low:=717; THalf_High:=374; end; //'2'
51: begin THalf_Low:=717; THalf_High:=339; end; //'3'
65: begin THalf_Low:=717; THalf_High:=306; end; //'A'
52: begin THalf_Low:=649; THalf_High:=414; end; //'4'
53: begin THalf_Low:=649; THalf_High:=374; end; //'5'
54: begin THalf_Low:=649; THalf_High:=339; end; //'6'
66: begin THalf_Low:=649; THalf_High:=306; end; //'B'
55: begin THalf_Low:=587; THalf_High:=414; end; //'7'
56: begin THalf_Low:=587; THalf_High:=374; end; //'8'
57: begin THalf_Low:=587; THalf_High:=339; end; //'9'
67: begin THalf_Low:=587; THalf_High:=306; end; //'C'
42: begin THalf_Low:=531; THalf_High:=414; end; //'*'
48: begin THalf_Low:=531; THalf_High:=374; end; //'0'
35: begin THalf_Low:=531; THalf_High:=339; end; //'#'
68: begin THalf_Low:=531; THalf_High:=306; end; //'D'
end;
end;
procedure ClearBufs();
begin
//Clear buffers
Vector_Set(input, BUFFER_SIZE, 0);
Vector_Set(output, BUFFER_SIZE, 0);
end;
procedure Timer1Int; org $1A; // interrupt frequency is 20kHz
begin
// calculate sample
sample := voltageL + voltageH; // add voltages
input[sample_index] := sample; // write sample to input buffer
// update low-frequency square signal microseconds counter
us_cntL := us_cntL + 50; // since us_cntL and THalf_Low are in microseconds
// and Timer1 interrupt occures every 50us
// increment us_cntL by 50
if us_cntL > THalf_Low then // half-period exceeded, change sign
begin
voltageL := -voltageL;
us_cntL := us_cntL - THalf_Low;// subtract half-period
end;
// update high-frequency square signal microseconds counter
us_cntH := us_cntH + 50;
if us_cntH > THalf_High then
begin
voltageH := -voltageH;
us_cntH := us_cntH - THalf_High;
end;
//IIR(amp), filtering new sample
sample := IIR_Radix(SCALE_B, SCALE_A, @COEFF_B, @COEFF_A, FILTER_ORDER+1,
@input, BUFFER_SIZE, @output, sample_index);
DAC_Output(sample); // send sample to digital-to-analog converter
output[sample_index] := sample; // write filtered sample in output buffer
Inc(sample_index); // increment sample index, prepare for next sample
if sample_index = BUFFER_SIZE then
sample_index := 0;
Dec(sending_ch_cnt); // decrement char sending counter
// (character transmition lasts 90ms = 1800 samples)
if sending_ch_cnt = 0 then // if character transmition is over
begin
T1CON:=0; // turn off Timer1
DAC_Output(0);
Delay_ms(200); // pause between two characters is 200ms
end;
IFS0.3 := 0; // clear Timer1 interrupt flag
end;
// --- main --- //
begin
InitMain(); // perform initializations
DAC_Output(0);
sending_ch_cnt := 0; // reset counter
sample_index := 0; // initialize sample index
// Clear interrupt flags
IFS0 := 0;
IFS1 := 0;
IFS2 := 0;
INTCON1 := $8000; // disable nested interrupts
IEC0 := $0008; // enable Timer1 interrupt
// Timer1 input clock is Fosc/4. Sampling frequency is 20kHz. Timer should
// raise interrupt every 50 microseconds. PR1 = (Fosc[Hz]/4) / 20000Hz = Fosc[kHz]/(4*20)
PR1 := Clock_kHz() div 80;
// Note: interrupt routine execution takes ~10us
while true do
begin
if (sending_ch_cnt = 0) and // check if sending of previous character is over
(Uart1_Data_Ready() = 1) then // check if character arrived via UART1
begin
char2send := Uart1_Read_Char(); // read data from UART and store it
SetPeriods(char2send); // set periods for low and high-frequency
// square signals
ClearBufs(); // clear input and output buffers
// digital filter computing error is smaller for signals of higher amplitudes
// so signal amplitude should as high as possible. The highest value for
// signed integer type is 0x7FFF but since we are adding 2 signals we must
// divide it by 2.
voltageH := $7FFF div 2; // high-frequency square signal amplitude
voltageL := $7FFF div 2; // low-frequency square signal amplitude
us_cntL := 0; // low-frequency square signal microseconds counter
us_cntH := 0; // high-frequency square signal microseconds counter
// start Timer T1
sending_ch_cnt := 1800; // character tansmition lasts
// 90ms = 1800 samples * 50us
T1CON := $8000; // enable Timer1 (TimerOn, prescaler 1:1)
end;
end;
end.



{ This project is designed to work with PIC P30F6014A. It has been tested
on dsPICPRO3 board with 10.0 MHz crystal and 8xPLL. It should work with any
other crystal. Note: the maximum operating frequency for dsPIC is 120MHz.
With minor adjustments, this example should work with any other dsPIC MCU
}
program DTMFin;
// *** DAC pinout *** //
const LOAD_PIN = 2; // DAC load pin
const CS_PIN = 1; // DAC CS pin
const
// filter setup:
// filter kind: IIR
// filter type: lowpass filter
// filter order: 4
// design method: Chebyshev type II
BUFFER_SIZE = 8;
FILTER_ORDER = 4;
BPF1_COEFF_B : array[FILTER_ORDER+1] of Integer=(0x1BD7, 0xAB5D, 0x753A, 0xAB5D, 0x1BD7);
BPF1_COEFF_A : array[FILTER_ORDER+1] of Integer=(0x2000, 0xA1C7, 0x6C59, 0xC6EA, 0x0BDE);
BPF1_SCALE_B = 0;
BPF1_SCALE_A = -2;
// filter setup:
// filter kind: IIR
// filter type: Highpass filter
// filter order: 4
// design method: Chebyshev type II
BPF2_COEFF_B : array[FILTER_ORDER+1] of Integer=(0x0BF7, 0xD133, 0x45AF, 0xD133, 0x0BF7);
BPF2_COEFF_A : array[FILTER_ORDER+1] of Integer=(0x1000, 0xCA8B, 0x44B5, 0xD7E5, 0x08F3);
BPF2_SCALE_B = -3;
BPF2_SCALE_A = -3;
MinLevel : integer = 18; // min voltage offset level on ADC
// that can be detected as DTMF
var
SignalActive : Boolean; // indicator (if input signal exists)
sample : Integer; // temp variable used for reading from ADC
Key : Char; // detected character
f:longint; // detected frequency
SampleCounter : word; // indicates the number of samples in circular buffer
sample_index : word; // index of next sample
input : array[8] of Integer; // circular buffer - raw samples (directly after ADC)
output_f1 : array[8] of Integer; // circular buffer - samples after IIR BP filter
output_f2 : array[8] of Integer; // circular buffer - samples after IIR BP filter
TransitLow, TransitHigh:Word; // counts of transitions (low, high freq)
sgnLow, sgnHigh:Integer; // current signs of low and high freq signal
KeyCnt : integer; // number of recived DTFM and displayed on LCD
procedure Estimate;
var
fd:Word;
begin
{ DTMF frequencies:
1209 Hz 1336 Hz 1477 Hz 1633 Hz
697 Hz 1 2 3 A
770 Hz 4 5 6 B
852 Hz 7 8 9 C
941 Hz * 0 # D
}
//calculating index of lower freq
f := TransitLow*20000; // f := No_Of_Transitions*Sampling_Freq [Hz]
f := f shr 11; // f := f div 2048 := f/2/1024 (2 transitions in each period)
if f < 733 then
fd:=1 //index of Low_freq = 1
else if f < 811 then
fd:=2 //index of Low_freq = 2
else if f < 896 then
fd:=3 //index of Low_freq = 3
else
fd:=4; //index of Low_freq = 4
//calculating index of higher freq
f:=TransitHigh*20000; // f := No_Of_Transitions*Sampling_Freq
f:=f shr 11; // f := f/2048 := f/2/1024 (2 transitions in each period)
if f<1272 then
fd:=fd+10 // encode Index of higher freq as 10
else if f<1406 then
fd:=fd+20 // encode Index of higher freq as 20
else if f<1555 then
fd:=fd+30 // encode Index of higher freq as 30
else
fd:=fd+40; // encode Index of higher freq as 40
case fd of // Reading of input char from DTMF matrix
11: Key:='1';
12: Key:='4';
13: Key:='7';
14: Key:='*';
21: Key:='2';
22: Key:='5';
23: Key:='8';
24: Key:='0';
31: Key:='3';
32: Key:='6';
33: Key:='9';
34: Key:='#';
41: Key:='A';
42: Key:='B';
43: Key:='C';
44: Key:='D';
end;
// diplay recived char on second row of LCD
if(KeyCnt >= 16) then
begin // if second row is full erase it and postion cursor at first column
Lcd_Cmd(LCD_SECOND_ROW);
Lcd_Out_CP(' ');
Lcd_Cmd(LCD_SECOND_ROW);
KeyCnt := 0; // reset recived DTFM signals counter
end;
Lcd_Chr_CP(Key); // output recived on LCD
inc(KeyCnt); // increment counter
end;
procedure DAC_Output(valueDAC : word) ;
begin
LATC.CS_PIN := 0; // CS enable for DAC
// filter output range is 16-bit number; DAC input range is 12-bit number
valueDAC := valueDAC shr 4;
// now both numbers are 12-bit but filter output is signed and DAC input is unsigned.
// Half of DAC range 4096/2=2048 is added to correct this
valueDAC := valueDAC + 2048;
SPI2BUF := 0x3000 or valueDAC; // write valueDAC to DAC (0x3 is required by DAC)
while (SPI2STAT.1 = 1) do // wait for SPI module to finish sending
nop;
LATC.CS_PIN := 1; // CS disable for DAC
end;
procedure InitDec();
begin // Estimate on 1024 samples for fast DIV
SampleCounter := 1024; // Init low-freq transitions counter
TransitLow := 0; // Init high-freq transitions counter
TransitHigh := 0; // Init input circular buffer (zero-filled)
Vector_Set(input, 8, 0); // Init filtered circular buffer (zero-filled)
Vector_Set(output_f1, 8, 0); // Init filtered circular buffer (zero-filled)
Vector_Set(output_f2, 8, 0); // Points on first element of circular buffer
sample_index := 0; // Current sign is positive
sgnLow:=0; // Current sign is positive
sgnHigh:=0;
DAC_Output(0);
end;
procedure ADC1Int; org $2A;
begin
sample := ADCBUF0; // read input ADC signal
if (sample > 2048+MinLevel) and not(SignalActive) then // detecting signal
begin
SignalActive := true; // activate estimation algorithm
InitDec(); // initialize variables
end;
// since ADC is configured to get samples as intgers
// mean value of input signal is expected to be located at
// middle of ADC voltage range
sample := sample shl 4;
sample := sample-(2048 shl 4); //expanding signal to full scale
// now sample is ready to be filtred
if SignalActive then
begin
input[sample_index] := sample; // Write sample in circular buffer
//Filter input signal (for low-freq estimation)
sample := IIR_Radix(BPF1_SCALE_B, BPF1_SCALE_A, @BPF1_COEFF_B, @BPF1_COEFF_A,
FILTER_ORDER+1, @input, BUFFER_SIZE, @output_f1, sample_index);
DAC_Output(sample); // output filtred signal to DAC for Visual check
output_f1[sample_index]:=sample;
//transition_Low?
if sample.15<>sgnLow then // If transition trough 0
begin
sgnLow:=sample.15; // save current sign
Inc(TransitLow); // Increment transition counter
end;
//Filter input signal (for high-freq estimation)
sample := IIR_Radix(BPF2_SCALE_B, BPF2_SCALE_A, @BPF2_COEFF_B, @BPF2_COEFF_A,
FILTER_ORDER+1, @input, BUFFER_SIZE, @output_f2, sample_index);
output_f2[sample_index]:=sample; // Write filtered signal in buffer
//transition_High?
if sample.15<>sgnHigh then // If transition
begin
sgnHigh:=sample.15;
Inc(TransitHigh); // Increment transition counter
end;
sample_index:=(sample_index+1) and 7; // Move pointer on next element
dec(SampleCounter); // Decrement sample counter
if SampleCounter = 0 then // If all of 1024 samples are readed
begin
SignalActive:=false; // Deactivate estimation algorithm
Estimate(); // Read estimated character
DAC_Output(0); // set DAC output to 0
Delay_ms(80); // Wait for next char
end;
end;
IFS0.11 := 0; // clear ADC complete IF
end;
procedure Timer1Int; org $1A;
begin
ADCON1.1 := 1; // ASAM=0 and SAMP=1 begin sampling
ADCON1.15 := 1; // start ADC
IFS0.3 := 0; // clear Timer1 IF
end;
begin
KeyCnt := 0; // set to 0
SignalActive := false; // no signal is present
ADPCFG := $FFFF; // configure pins as digital
Lcd_Init_DsPicPro3(); // initialize LCD
Lcd_Out(1,1,'tone is:'); // print message at first row
Lcd_Cmd(LCD_SECOND_ROW); // position cursor at second row
LATC.CS_PIN := 1; // set DAC CS to inactive
LATC.LOAD_PIN := 0; // set DAC LOAD to inactive
TRISC.LOAD_PIN := 0; // configure DAC LOAD pin as output
TRISC.CS_PIN := 0; // configure DAC CS pin as output
// Initialize SPI2 module
Spi2_Init_Advanced(_SPI_MASTER, _SPI_16_BIT, _SPI_PRESCALE_SEC_1, _SPI_PRESCALE_PRI_1,
_SPI_SS_DISABLE, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_HIGH,
_SPI_ACTIVE_2_IDLE);
TRISB.10 := 1; // configure RB10 pin as input
ADPCFG := $FBFF; // configure RB10 pin as analog
ADCON1 := $00E0; // auto-convert, auto-conversion
ADCON2 := $0000;
ADCON3 := $021A; // sampling time=2*Tad, minimum Tad selected
ADCHS := $000A; // sample input on RB10
ADCSSL := 0; // no input scan
// clear interrupt flags
IFS0 := 0;
IFS1 := 0;
IFS2 := 0;
INTCON1 := $8000; // disable nested interrupts
INTCON2 := 0;
IEC0 := $0808; // enable Timer1 and ADC interrupts
IPC0.12 := 1; // Timer1 interrupt priority level = 1
IPC2.13 := 1; // ADC interrupt priority level = 2
// Timer1 input clock is Fosc/4. Sampling frequency is 20kHz. Timer should
// raise interrupt every 50 microseconds. PR1 = (Fosc[Hz]/4) / 20000Hz = Fosc[kHz]/(4*20)
PR1 := Clock_kHz() div 80;
T1CON := $8000; // Enable Timer1
while true do // Infinite loop
nop;
end.
{ An example of the use of the microcontroller dsPIC30F6014A and Accel Extra Board.
The example shows how the signal from the sensor is sampled and how the information on the
accelerations along the X and Y axes are used for controlling the cursor on a GLCD.
The example also covers the calibration of the sensor (determination of zeroG
and 1G values for X and Y axes). Pin RC1 is used as user input. Pull-down PORTC and
put button jumper in Vcc position. }
program AccelerationPointer;
// --- GLCD Messages ---
const msg1 = 'Put board to pos ';
const msg2 = 'and press RC1';
var // Global variables
zeroG_x, zeroG_y : integer; // zero gravity values
oneG_x, oneG_y : integer; // 1G values
meas_x, meas_y : integer; // measured values
box_x, box_y : integer; // variables for drawing box on GLCD
positionNo : byte; // variable used in text messages
text : String[20]; // variable used for text messages
procedure Init();
begin
ADPCFG := $FCFF; // configure AN8(RB8) and AN9(RB9) as analog pins
TRISB.8 := 1; // configure RB8 and RB9 as input pins
TRISB.9 := 1;
Glcd_Init_DsPicPro3(); // init GLCD for dsPICPRO3 board
// Note: GLCD/LCD Setup routines are in the setup library files located in the Uses folder
// These routines will be moved into AutoComplete in the future.
Glcd_Fill(0); // clear GLCD
TRISC := $02; // pin PORTC.1 is input for calibration
positionNo := 1; // variable used in text messages
end;
procedure DoMeasureXY();
begin
meas_x := Adc_Read(8); // measure X axis acceleration
meas_y := Adc_Read(9); // measure Y axis acceleration
end;
procedure DrawPointerBox();
var x_real, y_real : real;
begin
x_real := (meas_x-zeroG_x)/(oneG_x-zeroG_x); // scale [-1G..1G] to [-1..1]
x_real := x_real * 64; // scale [-1..1] to [-64..64]
x_real := x_real + 64; // scale [-64..64] to [0..128]
y_real := (meas_y-zeroG_y)/(oneG_y-zeroG_y); // scale [-1G..1G] to [-1..1]
y_real := y_real * 32; // scale [-1..1] to [-32..32]
y_real := y_real + 32; // scale [-32..32] to [0..64]
// convert reals to integers
box_x := x_real;
box_y := y_real;
// force x and y to range [0..124] and [0..60] because of Glcd_Box parameters range
if (box_x>124) then box_x:=124;
if (box_x<0) then box_x:=0;
if (box_y>60) then box_y:=60;
if (box_y<0) then box_y:=0;
Glcd_Box(box_x, box_y, box_x+3, box_y+3, 2); // draw box pointer, color=2(invert ecah dot)
end;
procedure ErasePointerBox();
begin
Glcd_Box(box_x, box_y, box_x+3, box_y+3, 2); // draw inverted box at the same position
// (erase box)
end;
// --- Calibration procedure determines zeroG and 1G values for X and Y axes ---//
procedure DoCalibrate();
begin
// 1) Put the Accel board in the position 1 : PARALLEL TO EARTH'S SURFACE
// to measure Zero Gravity values for X and Y
text := msg1;
text[17] := positionNo + 48;
Glcd_Write_Text(text,5,1,1);
Inc(positionNo);
text := msg2;
Glcd_Write_Text(text,5,20,1);
while (PORTC.1 = 0) do // wait for user to press RC1 button
nop;
DoMeasureXY();
zeroG_x := meas_x; // save Zero Gravity values
zeroG_y := meas_y;
Delay_ms(1000);
// 2) Put the Accel board in the position 2 : X AXIS IS VERTICAL, WITH X LABEL UP
// to measure the 1G X value
text := msg1;
text[17] := positionNo + 48;
Glcd_Write_Text(text,5,1,1);
Inc(positionNo);
text := msg2;
Glcd_Write_Text(text,5,20,1);
while (PORTC.1 = 0) do // wait for user to press RC1 button
nop;
DoMeasureXY();
oneG_x := meas_x; // save X axis 1G value
Delay_ms(1000);
// 3) Put the Accel board in the position 3 : Y AXIS IS VERTICAL, WITH Y LABEL UP
// to measure the 1G Y value
text := msg1;
text[17] := positionNo + 48;
Glcd_Write_Text(text,5,1,1);
Inc(positionNo);
text := msg2;
Glcd_Write_Text(text,5,20,1);
while (PORTC.1 = 0) do // wait for user to press RC1 button
nop;
DoMeasureXY();
oneG_y := meas_y; // save Y axis 1G value
Delay_ms(1000);
end;
begin
Init(); // initialization
DoCalibrate(); // calibration
Glcd_Fill(0); // clear GLCD
Glcd_H_Line(0, 127, 32, 1); // draw X and Y axes
Glcd_V_Line(0, 63, 64, 1);
Glcd_Write_Char('X', 122, 3, 1);
Glcd_Write_Char('Y', 66, 0, 1);
while TRUE do // endless loop
begin
DoMeasureXY(); // measure X and Y values
DrawPointerBox(); // draw box on GLCD
Delay_ms(250); // pause
ErasePointerBox(); // erase box
end;
end.