*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
/********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