#define _XTAL_FREQ 20000000
int read_adc(unsigned char channel);
int read_adc(unsigned char channel)
{
ADCON0=0b00000001; //Turn on A/D module
ADCON1=0b10000000; //Right Justify
if(channel<=7) ANSEL=ANSEL|(0b00000001<<channel);
else ANSELH=ANSELH|(0b00000001<<(channel-8));
ADCON0=(ADCON0&0xC3)|(channel<<2); //select analog input channel
__delay_ms(2);
ADON=1; //initiate conversion on the selected channel
while(ADON==1) continue; //wait until conversion done
return(256*ADRESH+ADRESL);
}
#include <htc.h>
#include <stdio.h>
#include "lcd16f887.c"
#include "adc16f887.c"
/*******************************************************************************
* DEVICE CONFIGURATION WORDS FOR PIC16F887 *
*******************************************************************************/
// If PIC16F887 is being selected as device
//******************************************************************************/
#define _XTAL_FREQ 20000000
main()
{
TRISD=0;
RD7=1;
TRISA=0B11111111;
unsigned char i;
unsigned int an1; //read analog voltage at RA0;
lcd_init();
printf("Temperature");
here:
lcd_2ndline();
an1=(int)(4.888*read_adc(1)); //10 mV per celcius. Convert 4.88V to 5Volt( 4.888x 1023=5000mV)
// an1=(an1/10);
printf("%d",an1);
printf(".");
printf("%d",an1%10);
printf("Celcius ");
__delay_ms(1000);
goto here;
}
adc16f887
#define _XTAL_FREQ 20000000
int read_adc(unsigned char channel);
int read_adc(unsigned char channel)
{
ADCON0=0b00000001; //Turn on A/D module
ADCON1=0b10000000; //Right Justify
if(channel<=7) ANSEL=ANSEL|(0b00000001<<channel);
else ANSELH=ANSELH|(0b00000001<<(channel-8));
ADCON0=(ADCON0&0xC3)|(channel<<2); //select analog input channel
__delay_ms(2);
ADON=1; //initiate conversion on the selected channel
while(ADON==1) continue; //wait until conversion done
return(256*ADRESH+ADRESL);
}
lcd16f887
#include <htc.h>
#include "pic16f887_config.h"
#define _XTAL_FREQ 20000000
// 16x2 LCD controller
// (max characters is 40)
// Initialization: lcd_init();
// To print a string: printf("Hello World");
// A few more formatting subroutines are available.
// See towards the end of this page.
// macros to isolate interface dependencies
// LCD is connected to PORTD
#define LCDPort PORTD
#define LCDTris TRISD
#define Epin 6
#define RWpin 5
#define RSpin 4
#define BUSYpin 3
#define DATA0pin 0
#define DATA1pin 1
#define DATA2pin 2
#define DATA3pin 3
#define EHIGH bitset(LCDPort, Epin)
#define ELOW bitclr(LCDPort, Epin)
#define E_OUTPUT bitclr(LCDTris, Epin)
#define RSHIGH bitset(LCDPort, RSpin)
#define RSLOW bitclr(LCDPort, RSpin)
#define RS_OUTPUT bitclr(LCDTris, RSpin)
#define RWHIGH bitset(LCDPort, RWpin)
#define RWLOW bitclr(LCDPort, RWpin)
#define RW_OUTPUT bitclr(LCDTris, RWpin)
#define BUSY_FLAG bittst(LCDPort, BUSYpin)
#define DATA_DIR_RD {bitset(LCDTris,DATA3pin);bitset(LCDTris,DATA2pin);bitset(LCDTris,DATA1pin);bitset(LCDTris,DATA0pin);}
#define DATA_DIR_WR {bitclr(LCDTris,DATA3pin);bitclr(LCDTris,DATA2pin);bitclr(LCDTris,DATA1pin);bitclr(LCDTris,DATA0pin);}
#define OUTPUT_DATA(x) {int aval=LCDPort&0xF0; x = x & 0x0F; LCDPort=aval+x;}
void epulse(void){
__delay_us(1);
EHIGH;
__delay_us(1);
ELOW;
__delay_us(1);
}
void lcd_write(
unsigned char cmd, unsigned char data_flag, unsigned char chk_busy, unsigned char dflag){
char bflag,c;
if (chk_busy) {
RSLOW; //RS = 0 to check busy
// check busy
DATA_DIR_RD; //set data pins all inputs
RWHIGH; // R/W = 1, for read
do {
EHIGH;
__delay_us(1); // upper 4 bits
bflag = BUSY_FLAG;
ELOW;
__delay_us(1);
epulse();
} while(bflag);
} else {
__delay_ms(10); // don't use busy, just delay
}
DATA_DIR_WR;
if (data_flag) RSHIGH; // RS=1, data byte
else RSLOW; // RS=0, command byte
// device is not busy
RWLOW; // R/W = 0, for write
c = cmd >> 4; // send upper 4 bits
OUTPUT_DATA(c);
epulse();
if (dflag) {
c = cmd & 0x0F; //send lower 4 bits
OUTPUT_DATA(c);
epulse();
}
}
void lcd_init(void) {
// configure, see control pins as outputs
// initialize as low
E_OUTPUT; RS_OUTPUT; RW_OUTPUT;
ELOW; RSLOW; RWLOW;
__delay_ms(25); //wait for device to settle
__delay_ms(25);
lcd_write(0x20,0,0,0); // 4 bit interface
lcd_write(0x28,0,0,1); // 2 line display, 5x7 font
lcd_write(0x28,0,0,1); // repeat
lcd_write(0x06,0,0,1); // enable display
lcd_write(0x0C,0,0,1); // turn display on; cursor, blink is off
lcd_write(0x01,0,0,1); // clear display, move cursor to home
__delay_ms(3); // wait for busy flag to be ready
}
// send 8 bit char to LCD
void putch (char c) {
lcd_write(c,1,1,1);
}
void lcd_clear(void){
lcd_write(0x01,0,0,1); // clear display, move cursor to home
}
void lcd_2ndline(void){
lcd_write(0xC0,0,1,1); // cursor to 2nd line
}
void lcd_shiftleft(void){
lcd_write(0x18,0,1,1); // shift left
}
void lcd_shiftright(void){
lcd_write(0x1C,0,1,1); // shift right
}
void lcd_blinkcursor(void){
lcd_write(0x0F,0,1,1); // displays and blink a cursor
}
void lcd_printbar(int bar){
for(int i=0; i<bar; i++){
lcd_write(0xFF,1,1,1); // print bars on the LCD
}
}
void lcd_printstring(const char *s) //send a string to display in the lcd
{
unsigned char i=0;
while (s && *s)lcd_write(*s++,1,1,1);
}
#include <htc.h>
#include <stdio.h>
#include <pic16f887.h>
/*******************************************************************************
* DEVICE CONFIGURATION WORDS FOR PIC16F887 *
*******************************************************************************/
// Configuration Bits
//__CONFIG(HS&WDTDIS&PWRTEN&BORDIS&LVPDIS&DEBUGDIS&UNPROTECT);
#define _XTAL_FREQ 20000000
#define bitset(var,bitno) ((var) |= (1 << (bitno)))
#define bitclr(var,bitno) ((var) &= ~(1 << (bitno)))
#define bittst(var,bitno) (var & (1 << (bitno)))
// If PIC16F887 is being selected as device
// 16x2 LCD controller
// (max characters is 40)
// Initialization: lcd_init();
// To print a string: printf("Hello World");
// A few more formatting subroutines are available.
// See towards the end of this page.
// macros to isolate interface dependencies
// LCD is connected to PORTD
#define LCDPort PORTD
#define LCDTris TRISD
#define Epin 6
#define RWpin 5
#define RSpin 4
#define BUSYpin 3
#define DATA0pin 0
#define DATA1pin 1
#define DATA2pin 2
#define DATA3pin 3
#define EHIGH bitset(LCDPort, Epin)
#define ELOW bitclr(LCDPort, Epin)
#define E_OUTPUT bitclr(LCDTris, Epin)
#define RSHIGH bitset(LCDPort, RSpin)
#define RSLOW bitclr(LCDPort, RSpin)
#define RS_OUTPUT bitclr(LCDTris, RSpin)
#define RWHIGH bitset(LCDPort, RWpin)
#define RWLOW bitclr(LCDPort, RWpin)
#define RW_OUTPUT bitclr(LCDTris, RWpin)
#define BUSY_FLAG bittst(LCDPort, BUSYpin)
#define DATA_DIR_RD {bitset(LCDTris,DATA3pin);bitset(LCDTris,DATA2pin);bitset(LCDTris,DATA1pin);bitset(LCDTris,DATA0pin);}
#define DATA_DIR_WR {bitclr(LCDTris,DATA3pin);bitclr(LCDTris,DATA2pin);bitclr(LCDTris,DATA1pin);bitclr(LCDTris,DATA0pin);}
#define OUTPUT_DATA(x) {int aval=LCDPort&0xF0; x = x & 0x0F; LCDPort=aval+x;}
//******************************************************************************/
long read_adc(unsigned char channel);
void epulse(void);
void lcd_write(unsigned char cmd, unsigned char data_flag, unsigned char chk_busy, unsigned char dflag);
void lcd_init(void);
void putch(char c);
void lcd_clear(void);
void lcd_2ndline(void);
void lcd_shiftleft(void);
void lcd_shiftright(void);
void lcd_blinkcursor(void);
void lcd_printbar(int bar);
void lcd_printstring(const char *s);
void epulse(void){
__delay_us(1);
EHIGH;
__delay_us(1);
ELOW;
__delay_us(1);
}
void lcd_write(unsigned char cmd, unsigned char data_flag, unsigned char chk_busy, unsigned char dflag){
char bflag,c;
if (chk_busy) {
RSLOW; //RS = 0 to check busy
// check busy
DATA_DIR_RD; //set data pins all inputs
RWHIGH; // R/W = 1, for read
do {
EHIGH;
__delay_us(1); // upper 4 bits
bflag = BUSY_FLAG;
ELOW;
__delay_us(1);
epulse();
} while(bflag);
} else {
__delay_ms(10); // don't use busy, just delay
}
DATA_DIR_WR;
if (data_flag) RSHIGH; // RS=1, data byte
else RSLOW; // RS=0, command byte
// device is not busy
RWLOW; // R/W = 0, for write
c = cmd >> 4; // send upper 4 bits
OUTPUT_DATA(c);
epulse();
if (dflag) {
c = cmd & 0x0F; //send lower 4 bits
OUTPUT_DATA(c);
epulse();
}
}
void lcd_init(void) {
// configure, see control pins as outputs
// initialize as low
E_OUTPUT; RS_OUTPUT; RW_OUTPUT;
ELOW; RSLOW; RWLOW;
__delay_ms(25); //wait for device to settle
__delay_ms(25);
lcd_write(0x20,0,0,0); // 4 bit interface
lcd_write(0x28,0,0,1); // 2 line display, 5x7 font
lcd_write(0x28,0,0,1); // repeat
lcd_write(0x06,0,0,1); // enable display
lcd_write(0x0C,0,0,1); // turn display on; cursor, blink is off
lcd_write(0x01,0,0,1); // clear display, move cursor to home
__delay_ms(3); // wait for busy flag to be ready
}
// send 8 bit char to LCD
void putch(char c) {
lcd_write(c,1,1,1);
}
void lcd_clear(void){
lcd_write(0x01,0,0,1); // clear display, move cursor to home
}
void lcd_2ndline(void){
lcd_write(0xC0,0,1,1); // cursor to 2nd line
}
void lcd_shiftleft(void){
lcd_write(0x18,0,1,1); // shift left
}
void lcd_shiftright(void){
lcd_write(0x1C,0,1,1); // shift right
}
void lcd_blinkcursor(void){
lcd_write(0x0F,0,1,1); // displays and blink a cursor
}
void lcd_printbar(int bar){
for(int i=0; i<bar; i++){
lcd_write(0xFF,1,1,1); // print bars on the LCD
}
}
void lcd_printstring(const char *s) //send a string to display in the lcd
{
unsigned char i=0;
while (s && *s)lcd_write(*s++,1,1,1);
}
long read_adc(unsigned char channel)
{
long result;
ADRESL = 0x00;
ADRESH = 0x00;
//__delay_ms(2);
ADON = 1;
while(ADON == 1)
continue;
result = ADRESH; // copy high byte to result
result <<= 8; // shift low byte to 2nd byte
result |= ADRESL; // OR result with ADRESL to get both the bytes into one var.
//__delay_ms(5);
return result;
}
main()
{
TRISD = 0x00;
TRISA = 0xFF;
ANSEL = 0x02; // 00000010
ANSELH = 0x00; // 00000000
ADCON0 = 0x84; // 10000100
ADCON1 = 0x80; // 10000000
unsigned char i;
long an1;
lcd_init();
printf("Temperature");
while(1) {
//an1 = read_adc(1);
//an1 = (4.888 * an1);
lcd_2ndline();
printf("%f",12.3);
//printf("%f",an1);
//printf(".");
//printf("%f",an1%10);
//printf("Celcius ");
//__delay_ms(1000);
}
}
#include <htc.h>
#include <stdio.h>
#include <pic16f887.h>
/*******************************************************************************
* DEVICE CONFIGURATION WORDS FOR PIC16F887 *
*******************************************************************************/
// Configuration Bits
//__CONFIG(HS&WDTDIS&PWRTEN&BORDIS&LVPDIS&DEBUGDIS&UNPROTECT);
#define _XTAL_FREQ 20000000
#define bitset(var,bitno) ((var) |= (1 << (bitno)))
#define bitclr(var,bitno) ((var) &= ~(1 << (bitno)))
#define bittst(var,bitno) (var & (1 << (bitno)))
// If PIC16F887 is being selected as device
// 16x2 LCD controller
// (max characters is 40)
// Initialization: lcd_init();
// To print a string: printf("Hello World");
// A few more formatting subroutines are available.
// See towards the end of this page.
// macros to isolate interface dependencies
// LCD is connected to PORTD
#define LCDPort PORTD
#define LCDTris TRISD
#define Epin 6
#define RWpin 5
#define RSpin 4
#define BUSYpin 3
#define DATA0pin 0
#define DATA1pin 1
#define DATA2pin 2
#define DATA3pin 3
#define EHIGH bitset(LCDPort, Epin)
#define ELOW bitclr(LCDPort, Epin)
#define E_OUTPUT bitclr(LCDTris, Epin)
#define RSHIGH bitset(LCDPort, RSpin)
#define RSLOW bitclr(LCDPort, RSpin)
#define RS_OUTPUT bitclr(LCDTris, RSpin)
#define RWHIGH bitset(LCDPort, RWpin)
#define RWLOW bitclr(LCDPort, RWpin)
#define RW_OUTPUT bitclr(LCDTris, RWpin)
#define BUSY_FLAG bittst(LCDPort, BUSYpin)
#define DATA_DIR_RD {bitset(LCDTris,DATA3pin);bitset(LCDTris,DATA2pin);bitset(LCDTris,DATA1pin);bitset(LCDTris,DATA0pin);}
#define DATA_DIR_WR {bitclr(LCDTris,DATA3pin);bitclr(LCDTris,DATA2pin);bitclr(LCDTris,DATA1pin);bitclr(LCDTris,DATA0pin);}
#define OUTPUT_DATA(x) {int aval=LCDPort&0xF0; x = x & 0x0F; LCDPort=aval+x;}
//******************************************************************************/
long read_adc();
void epulse(void);
void lcd_write(unsigned char cmd, unsigned char data_flag, unsigned char chk_busy, unsigned char dflag);
void lcd_init(void);
void putch(char c);
void lcd_clear(void);
void lcd_2ndline(void);
void lcd_shiftleft(void);
void lcd_shiftright(void);
void lcd_blinkcursor(void);
void lcd_printbar(int bar);
void lcd_printstring(const char *s);
void Delay_ms(unsigned int time);
void epulse(void){
__delay_us(1);
EHIGH;
__delay_us(1);
ELOW;
__delay_us(1);
}
void lcd_write(unsigned char cmd, unsigned char data_flag, unsigned char chk_busy, unsigned char dflag){
char bflag,c;
if (chk_busy) {
RSLOW; //RS = 0 to check busy
// check busy
DATA_DIR_RD; //set data pins all inputs
RWHIGH; // R/W = 1, for read
do {
EHIGH;
__delay_us(1); // upper 4 bits
bflag = BUSY_FLAG;
ELOW;
__delay_us(1);
epulse();
} while(bflag);
} else {
__delay_ms(10); // don't use busy, just delay
}
DATA_DIR_WR;
if (data_flag) RSHIGH; // RS=1, data byte
else RSLOW; // RS=0, command byte
// device is not busy
RWLOW; // R/W = 0, for write
c = cmd >> 4; // send upper 4 bits
OUTPUT_DATA(c);
epulse();
if (dflag) {
c = cmd & 0x0F; //send lower 4 bits
OUTPUT_DATA(c);
epulse();
}
}
void lcd_init(void) {
// configure, see control pins as outputs
// initialize as low
E_OUTPUT; RS_OUTPUT; RW_OUTPUT;
ELOW; RSLOW; RWLOW;
__delay_ms(25); //wait for device to settle
__delay_ms(25);
lcd_write(0x20,0,0,0); // 4 bit interface
lcd_write(0x28,0,0,1); // 2 line display, 5x7 font
lcd_write(0x28,0,0,1); // repeat
lcd_write(0x06,0,0,1); // enable display
lcd_write(0x0C,0,0,1); // turn display on; cursor, blink is off
lcd_write(0x01,0,0,1); // clear display, move cursor to home
__delay_ms(3); // wait for busy flag to be ready
}
// send 8 bit char to LCD
void putch(char c) {
lcd_write(c,1,1,1);
}
void lcd_clear(void){
lcd_write(0x01,0,0,1); // clear display, move cursor to home
}
void lcd_2ndline(void){
lcd_write(0xC0,0,1,1); // cursor to 2nd line
}
void lcd_shiftleft(void){
lcd_write(0x18,0,1,1); // shift left
}
void lcd_shiftright(void){
lcd_write(0x1C,0,1,1); // shift right
}
void lcd_blinkcursor(void){
lcd_write(0x0F,0,1,1); // displays and blink a cursor
}
void lcd_printbar(int bar){
for(int i=0; i<bar; i++){
lcd_write(0xFF,1,1,1); // print bars on the LCD
}
}
void lcd_printstring(const char *s) //send a string to display in the lcd
{
unsigned char i=0;
while (s && *s)lcd_write(*s++,1,1,1);
}
void Delay_ms(unsigned int time)
{
unsigned int i,j;
for(i = 0 ; i < time ; i++);
for(j = 0; j < 165 ; j++);
}
long read_adc()
{
long result;
ADCON0 = 0x88; // 10000100
ADCON1 = 0x80; // 10000000
ADRESL = 0x00;
ADRESH = 0x00;
Delay_ms(5);
ADCON0bits.ADON = 1;
Delay_ms(1);
ADCON0bits.GO = 1;
while(ADCON0bits.GO);
ADCON0bits.ADON = 0;
result = ADRESH;
result <<= 8;
result |= ADRESL;
Delay_ms(5);
return result;
}
main()
{
TRISD = 0x00;
TRISA = 0xFF;
PORTA = 0x00;
PORTD = 0x00;
ANSEL = 0x04; // 00000010
ANSELH = 0x00; // 00000000
C1ON = 0;
C2ON = 0;
unsigned char i;
long an1;
lcd_init();
printf("Temperature");
while(1) {
an1 = read_adc();
an1 = (4.888 * an1);
lcd_2ndline();
printf("%f",an1);
//printf(".");
//printf("%f",an1%10);
printf("Celcius ");
//__delay_ms(1000);
Delay_ms(1000);
}
}
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?