//This is a Test Program to read analog i/p CH_0 Pin_2
//and display the binary equivalent on PORTB LEDs. Also,
//the value is converted to DECimal & ASCII respectively
//to be displayed on a 16x2 LCD.
//Pin_5 Vref+ must be connected to +5V.
//Header file for PIC Micro’s
#include<htc.h>
//Set Configuration Fuses PIC16F877 from Software
__CONFIG (0x3F72);
//define ports for easier reading
#define LEDS PORTB
#define LCD PORTD
#define RS RC0
#define R_W RC1
#define EN RC2
//Prototype Functions declared here
void swait(unsigned char itime);
void cmnd(unsigned char *patt, unsigned char lenght);
void dat(unsigned char *patt, unsigned char lenght);
void dat_2(unsigned char value);
void USDELAY(unsigned char utime);
void MSDELAY(unsigned char mtime);
//Main Function Block
void main(void)
{
unsigned char cmds[4]={0x38,0x0C,0x01,0x80};
unsigned char mess_1[12]="TEMPERATURE:";
//line 2,pos.5
unsigned char cmdl2p5[1]={0xC5};
//line 2,pos.6
unsigned char cmdl2p6[1]={0xC6};
//line 2,pos.7
unsigned char cmdl2p7[1]={0xC7};
//line 2,pos.8
unsigned char cmdl2p8[1]={0xC8};
//line 2,pos.9
unsigned char cmdl2p9[1]={0xC9};
//8bit data-type variables
//store of ADC low byte
unsigned char x;
//store of ADC high byte
unsigned char y;
//store final ADC result
unsigned char value;
unsigned char value2,a,n;
unsigned char dec1,dec2,dec3;
unsigned char units,tens,hundreds;
//make Port B o/ps
TRISB=0x00;
//make Port A i/ps
TRISA=0xFF;
//make Port D o/ps
TRISD=0x00;
//make Port C o/ps
TRISC=0b00000000;
//clear/switch off LEDS
LEDS=0xFF;
//Initialise LCD
//4 elements in cmds array
cmnd(cmds,0x04);
//Send message to LCD
dat(mess_1,0x0C);
//display deg
cmnd(cmdl2p8,0x01);
dat_2(0xDF);
//display Celcius C
cmnd(cmdl2p9,0x01);
dat_2('C');
//repeat forever loop
while(1)
{
//ADFM=1, all i/ps analog, +VREF enabled
//Configure the functions of the Port bits
ADCON1=0x81;
//clock/channel select & enable bits
//controls the operation of the A/D module
ADCON0=0xC1;
//no.of loops of 255 loops
//wait for acquire time
swait(1);
//Start a2d conversion
//Set GO bit (ADCON0=ADCON0|1;)
GODONE=1;
//wait end-of-conversion (conversion complete)
while(GODONE==1);
//store low byte
x=ADRESL;
//shift 1bit to the right
x=x>>1;
//store high byte
y=ADRESH;
//shift left 7 bit positions
y=y<<7;
//combine high & low bytes
value=x+y;
//output result on PortB LEDs
LEDS=~value;
//make 1st division by ten
//a is first quotion
a=value/10;
//take the 1st remainder LSB
//Units in decimal
dec1=value%10;
//take the 2nd digit/middle
//remainder Tens in decimal
dec2=a%10;
//take the 3rd digit MSB
//Hundreds in decimal
dec3=a/10;
//make units digit ASCII
units=dec1|0x30;
//make tens digit ASCII
tens=dec2|0x30;
//make hundreds digit ASCII
hundreds=dec3|0x30;
//display
cmnd(cmdl2p7,0x01);
dat_2(units);
//display
cmnd(cmdl2p6,0x01);
dat_2(tens);
//display
cmnd(cmdl2p5,0x01);
dat_2(hundreds);
//micro stop here
//while(1){};
}
}
//Function to send Commands to LCD
void cmnd (unsigned char *patt, unsigned char lenght)
{
unsigned char i;
for(i=0;i<lenght;i++)
{
LCD=patt[i]; //get value from array
RS=0; //for command
R_W=0; //for write
//H-to-L Pulse required
EN=1;
USDELAY(70); //?us delay
EN=0;
MSDELAY(100); //give display some time
}
}
//Function to send Data to LCD
void dat (unsigned char *patt, unsigned char lenght)
{
unsigned char i;
for(i=0;i<lenght;i++)
{
LCD=patt[i]; //get value from array
RS=1; //for data
R_W=0; //for write
//H-to-L Pulse required
EN=1;
USDELAY(70); //?us delay
EN=0;
MSDELAY(10); //give display some time
}
}
//Function to send Data to LCD
void dat_2 (unsigned char value)
{
LCD=value;
RS=1; //for data
R_W=0; //for write
//H-to-L Pulse required
EN=1;
USDELAY(70); //?us delay
EN=0;
MSDELAY(10); //give display some time
}
//some delay needed
void swait(unsigned char itime)
{
unsigned char i,j;
for(i=0;i<itime;i++)
for(j=0;j<255;j++);
}
//used for LCD ENable Pulse
void USDELAY (unsigned char utime)
{
//8-bit data type variables
unsigned char i;
//single-loop
for(i=0;i<utime;i++);
}
//used for in between Characters
void MSDELAY (unsigned char mtime)
{
//8-bit data type variables
unsigned int i,j;
//nested for-loops
for(i=0;i<mtime;i++)
for(j=0;j<455;j++);
}