Ðề tài: CCS C for PIC16F877A
View Single Post
Old 29-05-2007, 06:38 PM   #208
hawinter
Đệ tử 1 túi
 
hawinter's Avatar
 
Tham gia ngày: Dec 2006
Bài gửi: 20
:
Em làm mạch đo nhiệt độ sử dụng LM335Z để hiển thị LCD .
Code:
#include <16F877A.h>
#include <DEFS_16F877A.h>
#device*=16 adc=10
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#define RS RB3
#define RW RB4
#define E RB5
#byte lcd_data = PORTD   // Dia chi PORTD
int8 hight,low,i;
float value;
void convert_bcd(int8 a){
   low=a%10;
   hight=a/10;
   low+=0x30;//doi ra ma ASCII de hien thi LCD
   hight+=0x30;
}

byte lcd_read_byte()
{
   byte read_byte;
   set_tris_D(0xFF);       // PORTD = input
   RW = 1;
   delay_cycles(1);
   E  = 1;
   delay_cycles(1);
   read_byte = lcd_data;
   E  = 0;
   set_tris_D(0x00);       // PORTD = 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;
   delay_cycles(1);
   RW = 0;
   delay_cycles(1);
   E  = 0;
   lcd_data = n;
   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_D(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]);
      }
}
void lcd_gotoxy( BYTE x, BYTE y) {
   BYTE address;

   if(y!=1)
     address=0x40;
   else
     address=0;
   address+=x-1;
   lcd_send_byte(0,0x80|address);
}
void lcd_putc( char c) {
   switch (c) {
     case '\f'   : lcd_send_byte(0,1);
                   delay_ms(2);
                                           break;
     case '\n'   : lcd_gotoxy(1,2);        break;
     case '\b'   : lcd_send_byte(0,0x10);  break;
     default     : lcd_send_byte(1,c);     break;
   }
}
main()
{
   set_tris_B(0);
   set_tris_D(0);
   set_tris_A(0xFF);
   lcd_init();
   delay_ms(100);
   lcd_gotoxy(3,1);
   lcd_putc("hello");
   lcd_gotoxy(1,2);
   lcd_putc("Welcom Everybody");
   delay_ms(2000);
   lcd_send_byte(0,1);//xoa LCD
   lcd_send_byte(0,6);
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_adc_ports(AN0);
   set_adc_channel(0);
   delay_ms(100);
   value=(float)read_adc();
   value=(value-558.5)/2.048;
   convert_bcd((int8)value);
   delay_us(20);
   lcd_putc("nhiet do:");
   while(1)
   {
      value=(float)read_adc();
      value=(value-558.5)/2.048;
      convert_bcd((int8)value);
      delay_ms(1000);
      lcd_gotoxy(2,4);
      lcd_putc(hight);
      lcd_putc(low);
      lcd_putc(" do C");
      //delay_ms(1000);
   }
 }
Chương trình có tham khảo từ các bài viết trên Picvietnam và dientuvietnam.
khi chay chương trình thì giá trị nhiệt độ hiển thị chỉ quanh các giá trị 50,52,54,56,48,58 em cũng không biết tại sao .Xin các bậc tiền bối giải đáp hộ .
__________________
Học mà không yêu là phí hoài tuổi trẻ
Yêu mà không học là bán rẻ tương lai.

thay đổi nội dung bởi: hawinter, 30-05-2007 lúc 01:55 PM.
hawinter vẫn chưa có mặt trong diễn đàn