You are on page 1of 11

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

* Project : EX9 - ADCR LAB

* MCU : PIC16F887

* Xtal : 4Mhz

* Complier: Hitech PIC C V9.83

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

#include <pic.h>

#include "adc.h"

#include "lcd_4bit.h"

#include <xc.h>

__CONFIG(FOSC_HS & WDTE_OFF & PWRTE_ON & MCLRE_ON & LVP_OFF & DEBUG_OFF &

BOREN_OFF & CP_OFF & CPD_OFF & FCMEN_OFF & IESO_OFF); //1st config. word

__CONFIG(BOR4V_BOR21V); //2nd config.


word

#define _XTAL_FREQ 4000000 // Xtal: 4MHz

//--------------------------------------------------

char const line_1[]=" BUI VAN BA ";

char const line_3[]=" 21124391 ";

void Port_Init()

//set all pins as digital

ANSEL = 0;

ANSELH = 0;

//set pin RA3 as analog input

TRISA3 = 1;
ANS3 = 1;

//set RB0 - RB7 as digital input

nRBPU = 0; //use pull-up resistor

//IOCB = 0x07; //pull-up pin RB0 - RB2

TRISB = 0xff;

TRISB = 0xff;

//-----------------------------------------------

void delay_x100ms(char time)

while(time--)

__delay_ms(100);

//------------------------------------------------

void sang_led_begin()

TRISB3=0; TRISB4=0; TRISB5=1;

RB3=1; RB4=0; __delay_ms(100);

RB3=0; RB4=1; __delay_ms(100);

RB3=1; RB4=1; RB5=1;

TRISB3=1; TRISB4=0; TRISB5=0;

RB4=1; RB5=0; __delay_ms(100);


RB4=0; RB5=1; __delay_ms(100);

RB3=1; RB4=1; RB5=1;

TRISB3=0; TRISB4=1; TRISB5=0;

RB5=1; RB3=0; __delay_ms(100);

RB5=0; RB3=1; __delay_ms(100);

RB3=1; RB4=1; RB5=1;

TRISB3=0; TRISB4=0; TRISB5=0;

RB3=1; RB4=1; RB5=1;

//--------------------------------------------------

void sang_led_end()

TRISB3=0; TRISB4=1; TRISB5=0;

RB5=0; RB3=1; __delay_ms(100);

RB5=1; RB3=0; __delay_ms(100);

RB3=1; RB4=1; RB5=1;

TRISB3=1; TRISB4=0; TRISB5=0;

RB4=0; RB5=1; __delay_ms(100);

RB4=1; RB5=0; __delay_ms(100);

RB3=1; RB4=1; RB5=1;

TRISB3=0; TRISB4=0; TRISB5=1;

RB3=0; RB4=1; __delay_ms(100);

RB3=1; RB4=0; __delay_ms(100);


RB3=1; RB4=1; RB5=1;

TRISB3=0; TRISB4=0; TRISB5=0;

RB3=1; RB4=1; RB5=1;

//----------------------------------------------------

//char scan_button()

///{

// char key=0;

// if(RB0==0){while(!RB0);key=4;} //start

// if(RB1==0){while(!RB1);key=5;} //Exit

// if(RB2==0){while(!RB2);key=6;} // Restart

// return key;

//}

//----------------------------------------------------

void volt()

lcd_command(_LCD_CLEAR);

lcd_write_string("bui van ba");

lcd_goto_row_col(1,0);

lcd_write_string("Vin= Volt");

void volt_meter()

unsigned long adc_value=0;


unsigned int temp=0;

unsigned int kq=0;

unsigned char filter=60; //so MAU duoc lay va tinh TRUNG BINH

char volt[4]; //de SAVE 4 gia tri : dvi, chuc, tram, nghin

char i;

//--------

for(i=0;i<filter;i++) //lay 60 mau

{ if (RB0==0 || RB1==0 || RB2 ==0) break;

temp = ADC_Read(3);

__delay_ms(4);

adc_value += temp;

//-----------------------

adc_value /=filter; //chia 60 lay trung binh

kq=(5*adc_value*1000)/1023; //5 = Vref; 1000 = he so nhan ( hien thi kq = 4 ki tu)

//------HIEN THI len LCD16x2 --------

for(i=0;i<4;i++)

{ if (RB0==0 || RB1==0 || RB2 ==0) break;

volt[i]=(kq % 10) | 0x30; //bat buoc fai OR voi 03H moi ra KQ dung (=ky tu).

kq /= 10;

//kq=2497 for_1 -> dvi =2497%10= 7; kq=2497/10 =249

// for_2 -> chuc =kq%10 = 9; kq= kq/10 = 24

// for_3 -> tram =kq%10 = 4; kq= kq/10 = 2 = nghin


//volt[3]=nghin; volt[2]=tram; volt[1]=chuc; volt[0]=dvi;

lcd_goto_row_col(1,4);

lcd_write_char(volt[3]); // ngan

lcd_write_char('.');

lcd_write_char(volt[2]); // tram

lcd_write_char(volt[1]); // chuc

lcd_write_char(volt[0]); // don vi

//--------------------------------------------------------

void disp_move_Line_13()

unsigned char inc3=0, inc1=0;

unsigned char i,j, leng_line3, leng_line1;

lcd_command(_LCD_CLEAR);

lcd_goto_row_col(0,0);

leng_line3=sizeof(line_3);

leng_line1=sizeof(line_1);

while(1)

for(i=0;i<16;i++)

{ if (RB0==0 || RB1==0 || RB2 ==0) break;

lcd_goto_row_col(0,i);

lcd_write_char(line_3[i+inc3]); //line 3
//-------------------------------------------------

j = leng_line1-i-inc1-2; //

lcd_goto_row_col(1,15-i);

lcd_write_char(line_1[j]); //line 1

delay_x100ms(3);

inc3++;

inc1++;

if(inc3>=leng_line3 - 16) inc3=0;

if(inc1>=leng_line1 - 16) inc1=0;

//----------------------------------

void main() //Phim 6= Restart; Phim 5=End; Phim 4= Begin Convert A/D

char i;

char button=0;

Port_Init();

lcd_4bit_init();

ADC_Init();

nRBPU = 0;

TRISB=0XFF;

PORTB=0XFF;

WPUB = 0xFF;

//INTF = 0;

//GIE = 1;
//INTE = 1;

//INTEDG = 0;

RBIF = 0; // xoa co ngat

RBIE = 1; //cho phep ngat portb

GIE = 1; //cho phep ngat toan cuc

//IOCB0=1;

IOCB0 = 1; //ch?n ng?t t?i RB4

IOCB1 = 1; //ch?n ng?t t?i RB5

IOCB2 = 1; //ch?n ng?t t?i RB6

disp_move_Line_13();

// while(1)

// {

// lcd_command(_LCD_CLEAR);

/// lcd_write_string("** ADC TESTING**");

// lcd_goto_row_col(1,0);

// lcd_write_string(" DC Voltmeter ");

//

// for(i=0;i<3;i++)

// {

// sang_led_begin();

// }

//

// //-----------------------------

// lcd_command(_LCD_CLEAR);

// lcd_write_string(" Press SW4");

// lcd_goto_row_col(1,0);

// lcd_write_string(" to begin");

//
// do

// {

// button=scan_button(); //kiem tra Phim

// }

// while(button!=4);

//

//-----------------------------

// lcd_command(_LCD_CLEAR);

// lcd_write_string("bui van ba");

// lcd_goto_row_col(1,0);

// lcd_write_string("Vin= Volt");

//

// do

// {

// volt_meter(); //thuc hien - AD convertion-------QUAN TRONG

// button=scan_button(); //kiem tra Phim

// }

// while(button!=5); // Exit (khong phai la 5 chay vong do<> là 5 thuc hien lenh tiep theo)

// //-----------------------------

// lcd_command(_LCD_CLEAR);

// lcd_write_string(" GOODBYE");

// lcd_goto_row_col(1,0);

// lcd_write_string(" See You Again ");

// sang_led_end();

// delay_x100ms(10);

// lcd_command(_LCD_CLEAR);
// do

// {

// button=scan_button(); //kiem tra Phim

// }

// while(button!=6); //Restart system

// }

while(1)

if (RB0==0 || RB1==0 || RB2 ==0) break;

// LEDSANGDAN();

// sanghaiben();

void interrupt ISR()

if (RBIF==1 && RBIE==1)

// if (RB4==0)

if (RB0==0)

while (RB0==0) {}

volt();

volt_meter();

// if (RB5==0) SANGDUOINLED();

// if (RB6==0) {}
RBIF=0;

You might also like