hellongaymoi
18-01-2010, 02:26 AM
Em đang làm mạch điều khiển sạc, cần hiển thị điên áp lên lcd. Em viết xong code nhưng ko hiển thị đc điện áp lên lcd. Giúp em với tai thứ 5 phai bảo vệ rồi.huhu.chương trình đây.
#include <16F877A.h>
#include <DEFS_16F877A.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#define E RC6
#define RS RC5
#define RW RC4
#byte lcd_data = 0x06 // Dia chi PORTB
#bit dk = 0x07.2
//-------------------------------------------------
/* Khai bao nguyen mau cac ham su dung */
byte lcd_read_byte();
void lcd_send_byte( byte address, byte n );
void lcd_init();
void lcd_gotoxy( byte x, byte y);
void lcd_putc( char c);
int1 control_sac(int8 x);
void doiso(int16 x);
//--------------------------------------------------
/* Doc mot byte tu LCD */
byte lcd_read_byte()
{
byte read_byte;
set_tris_B(0xFF); // PORTB = input
RW = 1; // LCD O CHE DO DOC
delay_cycles(1);
E = 1; // E TU 1 XUONG 0 XUAT 1 BYTE
delay_cycles(1);
read_byte = lcd_data; // lcd_data= PORTB
E = 0;
set_tris_B(0x00); // PORTB = output
return(read_byte);
}
/* Goi 1byte den LCD */
void lcd_send_byte( byte address, byte n )
{
RS = 0;
while ( bit_test(lcd_read_byte(),7) ) ;
RS = address; // ADDRESS =0 OR 1
delay_cycles(1);
RW = 0; // LCD O CHE DO GHI
delay_cycles(1);
E = 0; // E TU 0 LEN 1 GHI 1 BYTE
lcd_data = n; // LAY DU LIEU TU PORTB
delay_cycles(1);
E = 1;
delay_us(2);
E = 0;
}
/* Khoi tao ban dau cho LCD */
void lcd_init()
{
byte const lcd_init_string[4] = {0x38, 0x0C, 1 , 6};
byte i;
set_tris_B(0x00);
RS = 0;
RW = 0;
E = 0;
delay_ms(15);
for(i=1;i<=3;++i)
{
lcd_data = 3;
delay_cycles(1);
E = 1;
delay_us(2);
E = 0;
delay_ms(5);
}
lcd_data = 2;
delay_cycles(1);
E = 1;
delay_us(2);
E = 0;
delay_ms(5);
for(i=0;i<=3;++i)
{
lcd_send_byte(0,lcd_init_string[i]);
}
}
/* Nhay den vi tri (x,y) tren LCD,nhay nham y se bao loi */
void lcd_gotoxy( byte x, byte y)
{
byte address;
switch(y)
{
case 1: address=0;
address+=x-1;
lcd_send_byte(0,0x80|address);
break;
case 2: address=0x40;
address+=x-1;
lcd_send_byte(0,0x80|address);
break;
default :lcd_init();
lcd_putc("ERROR Y POSITION");
while(true); // Dung tai day!
}
}
/* Hien thi ki tu hoac chuoi ra LCD */
void lcd_putc( char c)
{
lcd_send_byte(1,c); // GUI 1 BYTE DU LIEU
}
/* Hien thi ki tu hoac chuoi ra LCD */
int1 control_sac(float x)
{
int1 dk;
if(x>=12)
dk=0;
else
dk=1;
return(dk);
}
/*kiem tra dien ap accu*/
//---------------------------------------------
void doiso(int16 x)
{
int8 chuc,donvi,le;
int8 tam;
chuc=x/100 + 0x30;
tam=x%100;
donvi=tam/10 + 0x30;
le=tam%10;
}
/* Ham main */
void main()
{
float adc1,adc2;
int16 v_bat,v_solar;
int8 chuc,donvi,le;
while(TRUE)
{
setup_adc_ports(all_analog); //RA0,RA1,RA2,RA3:LA ANALOG V_REF=Vcc
set_ADC_channel(0); // DOC V_BAT
delay_ms(10);
adc1 =(float) read_adc();
adc1 = adc1/20.46; // sai so 100mV--->muc luong tu 20.46
v_bat =adc1*10;
set_ADC_channel(1); // DOC V_solar
delay_ms(10);
adc2 =(float) read_adc();
adc2 = adc2/20.46;
v_solar = adc2*10; // sai so 100mV--->muc luong tu 20.46
output_bit(PIN_C2,control_sac(adc1));
set_tris_B(0); //PORTB = output
set_tris_C(0); //PORTC = output
lcd_init(); // HIEN THI LEN LCD
doiso(v_solar);
lcd_gotoxy(0,1);
lcd_putc("Vs=");
lcd_gotoxy(3,1);
lcd_putc(chuc);
lcd_gotoxy(4,1);
lcd_putc(donvi);
lcd_gotoxy(5,1);
lcd_putc(".");
lcd_gotoxy(6,1);
lcd_putc(le);
lcd_gotoxy(7,1);
lcd_putc("V");
doiso(v_bat);
lcd_gotoxy(0,2);
lcd_putc("Vb=");
lcd_gotoxy(3,2);
lcd_putc(chuc);
lcd_gotoxy(4,2);
lcd_putc(donvi);
lcd_gotoxy(5,2);
lcd_putc(".");
lcd_gotoxy(6,2);
lcd_putc(le);
lcd_gotoxy(7,2);
lcd_putc("V");
delay_ms(1000);
}
}
#include <16F877A.h>
#include <DEFS_16F877A.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#define E RC6
#define RS RC5
#define RW RC4
#byte lcd_data = 0x06 // Dia chi PORTB
#bit dk = 0x07.2
//-------------------------------------------------
/* Khai bao nguyen mau cac ham su dung */
byte lcd_read_byte();
void lcd_send_byte( byte address, byte n );
void lcd_init();
void lcd_gotoxy( byte x, byte y);
void lcd_putc( char c);
int1 control_sac(int8 x);
void doiso(int16 x);
//--------------------------------------------------
/* Doc mot byte tu LCD */
byte lcd_read_byte()
{
byte read_byte;
set_tris_B(0xFF); // PORTB = input
RW = 1; // LCD O CHE DO DOC
delay_cycles(1);
E = 1; // E TU 1 XUONG 0 XUAT 1 BYTE
delay_cycles(1);
read_byte = lcd_data; // lcd_data= PORTB
E = 0;
set_tris_B(0x00); // PORTB = output
return(read_byte);
}
/* Goi 1byte den LCD */
void lcd_send_byte( byte address, byte n )
{
RS = 0;
while ( bit_test(lcd_read_byte(),7) ) ;
RS = address; // ADDRESS =0 OR 1
delay_cycles(1);
RW = 0; // LCD O CHE DO GHI
delay_cycles(1);
E = 0; // E TU 0 LEN 1 GHI 1 BYTE
lcd_data = n; // LAY DU LIEU TU PORTB
delay_cycles(1);
E = 1;
delay_us(2);
E = 0;
}
/* Khoi tao ban dau cho LCD */
void lcd_init()
{
byte const lcd_init_string[4] = {0x38, 0x0C, 1 , 6};
byte i;
set_tris_B(0x00);
RS = 0;
RW = 0;
E = 0;
delay_ms(15);
for(i=1;i<=3;++i)
{
lcd_data = 3;
delay_cycles(1);
E = 1;
delay_us(2);
E = 0;
delay_ms(5);
}
lcd_data = 2;
delay_cycles(1);
E = 1;
delay_us(2);
E = 0;
delay_ms(5);
for(i=0;i<=3;++i)
{
lcd_send_byte(0,lcd_init_string[i]);
}
}
/* Nhay den vi tri (x,y) tren LCD,nhay nham y se bao loi */
void lcd_gotoxy( byte x, byte y)
{
byte address;
switch(y)
{
case 1: address=0;
address+=x-1;
lcd_send_byte(0,0x80|address);
break;
case 2: address=0x40;
address+=x-1;
lcd_send_byte(0,0x80|address);
break;
default :lcd_init();
lcd_putc("ERROR Y POSITION");
while(true); // Dung tai day!
}
}
/* Hien thi ki tu hoac chuoi ra LCD */
void lcd_putc( char c)
{
lcd_send_byte(1,c); // GUI 1 BYTE DU LIEU
}
/* Hien thi ki tu hoac chuoi ra LCD */
int1 control_sac(float x)
{
int1 dk;
if(x>=12)
dk=0;
else
dk=1;
return(dk);
}
/*kiem tra dien ap accu*/
//---------------------------------------------
void doiso(int16 x)
{
int8 chuc,donvi,le;
int8 tam;
chuc=x/100 + 0x30;
tam=x%100;
donvi=tam/10 + 0x30;
le=tam%10;
}
/* Ham main */
void main()
{
float adc1,adc2;
int16 v_bat,v_solar;
int8 chuc,donvi,le;
while(TRUE)
{
setup_adc_ports(all_analog); //RA0,RA1,RA2,RA3:LA ANALOG V_REF=Vcc
set_ADC_channel(0); // DOC V_BAT
delay_ms(10);
adc1 =(float) read_adc();
adc1 = adc1/20.46; // sai so 100mV--->muc luong tu 20.46
v_bat =adc1*10;
set_ADC_channel(1); // DOC V_solar
delay_ms(10);
adc2 =(float) read_adc();
adc2 = adc2/20.46;
v_solar = adc2*10; // sai so 100mV--->muc luong tu 20.46
output_bit(PIN_C2,control_sac(adc1));
set_tris_B(0); //PORTB = output
set_tris_C(0); //PORTC = output
lcd_init(); // HIEN THI LEN LCD
doiso(v_solar);
lcd_gotoxy(0,1);
lcd_putc("Vs=");
lcd_gotoxy(3,1);
lcd_putc(chuc);
lcd_gotoxy(4,1);
lcd_putc(donvi);
lcd_gotoxy(5,1);
lcd_putc(".");
lcd_gotoxy(6,1);
lcd_putc(le);
lcd_gotoxy(7,1);
lcd_putc("V");
doiso(v_bat);
lcd_gotoxy(0,2);
lcd_putc("Vb=");
lcd_gotoxy(3,2);
lcd_putc(chuc);
lcd_gotoxy(4,2);
lcd_putc(donvi);
lcd_gotoxy(5,2);
lcd_putc(".");
lcd_gotoxy(6,2);
lcd_putc(le);
lcd_gotoxy(7,2);
lcd_putc("V");
delay_ms(1000);
}
}