using uart of pic16f877a to transfer sensor values

#define _XTAL_FREQ 16000000

#define RS RD2

#define EN RD3

#define D4 RD4

#define D5 RD5

#define D6 RD6

#define D7 RD7

#include <xc.h>

#pragma config FOSC = HS    // Oscillator Selection bits (HS oscillator)

#pragma config WDTE = OFF    // Watchdog Timer Enable bit (WDT disabled)

#pragma config PWRTE = ON    // Power-up Timer Enable bit (PWRT enabled)

#pragma config BOREN = ON    // Brown-out Reset Enable bit (BOR enabled)

#pragma config LVP = OFF    // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)

#pragma config CPD = OFF    // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)

#pragma config WRT = OFF    // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)

#pragma config CP = OFF     // Flash Program Memory Code Protection bit (Code protection off)


//LCD Functions Developed by Circuit Digest.

void Lcd_SetBit(char data_bit) //Based on the Hex value Set the Bits of the Data Lines

{

  if(data_bit& 1) 

    D4 = 1;

  else

    D4 = 0;


  if(data_bit& 2)

    D5 = 1;

  else

    D5 = 0;


  if(data_bit& 4)

    D6 = 1;

  else

    D6 = 0;


  if(data_bit& 8) 

    D7 = 1;

  else

    D7 = 0;

}


void Lcd_Cmd(char a)

{

  RS = 0;      

  Lcd_SetBit(a); //Incoming Hex value

  EN = 1;     

    __delay_ms(4);

    EN = 0;     

}


Lcd_Clear()

{

  Lcd_Cmd(0); //Clear the LCD

  Lcd_Cmd(1); //Move the curser to first position

}


void Lcd_Set_Cursor(char a, char b)

{

  char temp,z,y;

  if(a== 1)

  {

   temp = 0x80 + b - 1; //80H is used to move the curser

    z = temp>>4; //Lower 8-bits

    y = temp & 0x0F; //Upper 8-bits

    Lcd_Cmd(z); //Set Row

    Lcd_Cmd(y); //Set Column

  }

  else if(a== 2)

  {

    temp = 0xC0 + b - 1;

    z = temp>>4; //Lower 8-bits

    y = temp & 0x0F; //Upper 8-bits

    Lcd_Cmd(z); //Set Row

    Lcd_Cmd(y); //Set Column

  }

}

void Lcd_Start()

{

 Lcd_SetBit(0x00);

 for(int i=1065244; i<=0; i--) NOP();  

 Lcd_Cmd(0x03);

  __delay_ms(5);

 Lcd_Cmd(0x03);

  __delay_ms(11);

 Lcd_Cmd(0x03); 

 Lcd_Cmd(0x02); //02H is used for Return home -> Clears the RAM and initializes the LCD

 Lcd_Cmd(0x02); //02H is used for Return home -> Clears the RAM and initializes the LCD

 Lcd_Cmd(0x08); //Select Row 1

 Lcd_Cmd(0x00); //Clear Row 1 Display

 Lcd_Cmd(0x0C); //Select Row 2

 Lcd_Cmd(0x00); //Clear Row 2 Display

 Lcd_Cmd(0x06);

 }

void Lcd_Print_Char(char data) //Send 8-bits through 4-bit mode

{

  char Lower_Nibble,Upper_Nibble;

  Lower_Nibble = data&0x0F;

  Upper_Nibble = data&0xF0;

  RS = 1;       // => RS = 1

  Lcd_SetBit(Upper_Nibble>>4);

  

  EN = 1;

  for(int i=21304830; i<=0; i--) NOP(); 

  //__delay_ms(2);

  EN = 0;

  Lcd_SetBit(Lower_Nibble); //Send Lower half

  EN = 1;

 for(int i=21304830; i<=0; i--) NOP();

 // __delay_ms(2);

  EN = 0;

}



void Lcd_Print_String(char *a)

{

  int i;

   

  for(i=0;a[i]!='\0';i++)

    Lcd_Print_Char(a[i]); 

  __delay_ms(2);//Split the string using pointers and call the Char function 

}

void adcinitialize()

{

  ADCON0=0X00;

  ADCON1=(1<<7);

int AnalogRead(int a)

{

  ADCON0=((1<<0)|(a<<3));

  __delay_ms(2);

  GO=1;

  while(GO_DONE==1);

  return ((ADRESH<<8)+ADRESL);

  }

void uarton(int uartrate)

{

  TRISC=0X80;

  TXSTA=(1<<5);

  SPBRG=((16000000)/(64*uartrate))-1;

}

void uarttransmit(int data)

{

  while(TXIF==0);

  TXIF=0;

  TXREG= data;

}

int main()

{

 int adc=0;

  float volt;

  int j=0,f=0,g=0,h=0,i=0;

  TRISD = 0x00;

  Lcd_Start();

  adcinitialize();

   uarton(9600);

   

   

    adc=(AnalogRead(0));

    while(1)

    {

      adc=(AnalogRead(0));

    volt= (adc*5000)/1024;

    i=volt*1000;

  j=(adc/1000)%10;

 f=(adc/100)%10;

 g=(adc/10)%10;

 h=(adc/1)%10;

 Lcd_Clear();

 Lcd_Set_Cursor(1,1);

 Lcd_Print_String("DIGITALvalue");

 Lcd_Set_Cursor(2,1);

 Lcd_Print_Char(j+'0') ;    

 Lcd_Print_Char(f+'0');

 Lcd_Print_Char(g+'0');

 Lcd_Print_Char(h+'0');

__delay_ms(10);

//uarttransmit( volt);

  }

   uarttransmit(adc);

  return 0;

}

要查看或添加评论,请登录

Embedded enthusiastic的更多文章

社区洞察

其他会员也浏览了