You are on page 1of 3

/**********************************************************

*This program reads an analog input on AN0(PORTA.B0)


*
*using Vcc as the reference. Both the ACD value (0-1023) *
*and the voltage (0.000-5.000) are displayed on a 2X16LCD *
*To change the input, turn the "ADC INPUT" for PORTA
*
*This is more for beginners, like me, starting to learn *
*the C programming language and MikroC Pro.
*
*Processor: 18F45K22
*
*Development Board: EasyPICv7
*
*RA0 jumper installed
*
*SW3 "PORT LED's" are set to off
*
*Author: Dennis Lepine
*
*email: dennis_lepine@sympatico.ca
*
*Date: 01/11/13
*
**********************************************************/
/***************GLOBAL VARIABLES**************************/
sbit LCD_RS_Direction at TRISB.B4;
//PORTB BIT DIRECTION
REGISTERS DEFINED FOR LCD INTERFACE
sbit LCD_EN_Direction at TRISB.B5;
sbit LCD_D4_Direction at TRISB.B0;
sbit LCD_D5_Direction at TRISB.B1;
sbit LCD_D6_Direction at TRISB.B2;
sbit LCD_D7_Direction at TRISB.B3;
sbit LCD_RS at LATB.B4;
//PORTB BIT INPUT/OUT
PUT PINS DEFINED FOR LCD INTERFACE
sbit LCD_EN at LATB.B5;
sbit LCD_D4 at LATB.B0;
sbit LCD_D5 at LATB.B1;
sbit LCD_D6 at LATB.B2;
sbit LCD_D7 at LATB.B3;
unsigned int ADCBITS;
unsigned int VOLTAGE;
unsigned int POSITION;
char ADCSTRG[7];
STRING ARRAY
char VSTRG[7];
TAGE STRING ARRAY

//AN0 DATA VARIABLE


//VOLTAGE VARIABLE
//POSITION POINTER
//7 (6+NULL) BYTE ADC
//7 (6+NULL) BYTE VOL

/********CONVERT ADCBITS TO VOLTAGE AND DISPLAY**********/


void LCD_VOLTAGE(){
Voltage=(long)ADCBITS*4888/1000;
//CONVERT AN0 TO VOLT
AGE. EACH BIT=4.888mV WITH A 5 VOLT REFERENCE (VREF/1023)
inttostr(Voltage,VSTRG);
//TAKE THE VOLTAGE IN
TEGER AND CONVERT THAT TO A VOLTAGE STRING
if (ADCBITS<=204){
//IF LESS THAN 1v
VSTRG[2]=48;
//THEN PLACE AN ASCII
"0" IN 1'S PLACEHOLDER
}
if (ADCBITS<=20){
//IF LESS THAN 100mV
VSTRG[3]=48;
//THEN PLACE AN ASCII
"0" IN TENTH PLACEHOLDER
}
if (ADCBITS<=2){
//IF LESS THAN 10mV
VSTRG[4]=48;
//THEN PLACE AN ASCII
"0" IN HUNDREDTH PLACEHOLDER
}
Lcd_Out(2,11,VSTRG+2);
//AND DISPLAY ONLY 4

OF THE 6 CHARACTERS IN THE VOLTAGE STRING


Lcd_Out(2,12,".");
S DISPLAYED AFTER THE FIRST VOLTAGE CHARACTER
Lcd_Out(2,13,VSTRG+3);
AGE CHARACTORS ARE DISPLAYED NEXT
}

//THE DECIMAL POINT I


//AND THE LAST 3 VOLT

/***************DISPLAYS THE ADC VALUE********************/


void LCD_ADC() {
inttostr(ADCBITS,ADCSTRG);
//CONVERT THE ADC REA
D VALUE IT TO A STRING
if(ADCBITS<9){
//IF AN0 IS LESS THAN
9
POSITION=5;
//POINT TO THE LAST[0
] CHARACTER IN THE ADC STRING ARRAY
Lcd_Out(2,6, " ");
//THEN CLEAR 3 POSITI
ONS OUT OF THE 4 (ONE'S ONLY)
}
if(ADCBITS>9 && ADCBITS<99){
//IF AN0 IS GREATER T
HAN 9 BUT LESS THAN 99
POSITION=4;
//POINT TO THE SECOND
[1] LAST CHARACTER IN THE ADC STRING ARRAY
Lcd_Out(2,7, " ");
//THEN CLEAR 2 POSITI
ONS OUT OF THE 4 (TEN'S ONLY)
}
if(ADCBITS>99 && ADCBITS<999){
//IF AN0 IS GREATER T
HAN 99 BUT LESS THAN 999
POSITION=3;
//POINT TO THE THIRD[
2] LAST CHARACTER IN THE ADC STRING ARRAY
Lcd_Out(2,8, " ");
//THEN CLEAR 1 POSITI
ON OUT OF THE 4 (HUNDRED'S ONLY)
}
if(ADCBITS>999){
//IF AN0 IS GREATER T
HAN 999
POSITION=2;
//POINT TO THE FOURTH
[3] LAST CHARACTER IN THE ADC STRING ARRAY
}
Lcd_Out(2,5,ADCSTRG+POSITION);
//DISPLAY THE ADC VAL
UE USING THE ADC STRING ARRAY AND THE POSITION OFFSET
}
/*********************MAIN ENTRY**************************/
void main() {
Lcd_Init();
//AFTER THE LCD INTIA
LIZATION
Lcd_Cmd(_LCD_CLEAR);
//CLEAR THE LCD
Lcd_Cmd(_LCD_CURSOR_OFF);
//AND REMOVE THE CURS
OR
Lcd_Out(1,5,"ADC Voltage");
//DISPLAY TITLES FOR
ADC AND VOLTAGE ON FIRST ROW
Lcd_Out(2,1,"AN0:");
//AND AN0 ON THE SECO
ND ROW
do {
ADCBITS = ADC_Read(0);
//GO READ ANALOG VALU
E ON AN0
LCD_ADC();
//DO THE ROUTINE FOR
DISPLAYING AN0
LCD_VOLTAGE();
//DO THE ROUTINE FOR
CONVERTING ANO TO VOLTAGE AND DISPLAYING
delay_ms(50);
//DELAY IS TO SLOW DO

WN THE DISPLAY TIME TO PREVENT FLICKER BECAUSE OF SPEED


}
while(1);
}

You might also like