![]() |
![]() |
#1 |
Nhập môn đệ tử
Tham gia ngày: Sep 2008
Bài gửi: 9
: |
![]() 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); } } |
![]() |
![]() |
![]() |
#2 |
Nhập môn đệ tử
Tham gia ngày: Jun 2006
Bài gửi: 10
: |
Post cả mạch lên may ra các cao thủ xem xét chứ chỉ mỗi đoạn code làm sao mọi người giúp được.
Chúc bạn thành công. |
![]() |
![]() |
![]() |
|
|