PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Các ngôn ngữ lập trình khác (CCS C, HT PIC,...) (http://www.picvietnam.com/forum/forumdisplay.php?f=12)
-   -   Giao tiếp MCU và LCD (http://www.picvietnam.com/forum/showthread.php?t=7372)

ducdn 14-11-2010 07:07 PM

Giao tiếp MCU và LCD
 
Em mới bắt đầu viết code CCS C cho PIC nên còn gà lắm. Cả ngày hôm nay viết code giao tiếp vs LCD mà test hoài chưa chạy được. Có đọc qua nhiều bài của các bác trên diễn đàn nhưng vẫn chưa giải quyết được nên mạo muội post code lên cho các bác xem dùm em. CCS vẫn biên dịch bình thường nhưng mà khi nạp ko chạy

Đây là code của em:

Code:

#include <16f877a.h>
#fuses NOWDT,XT,NOPUT,NOPROTECT,NODEBUG,NOBROWNOUT,NOLVP,NOCPD,NOWRT
#use delay(clock=4000000)
//--------------------------------------
//Dinh nghia chan
#byte PORTA=0x05
#byte TRISA=0x85
#byte PORTD=0x08
#byte TRISD=0x88
#define rs PIN_A1
#define rw PIN_A2
#define e  PIN_A3

//---------------------------------------
//Khai bao ham
void init();                    //I/O init
void lcd_init();                //LCD init
void lcd_WrDt(char c);              //Ghi Data
void lcd_Str(char* Str);              //Ghi chuoi 
void lcd_WrCm();                    //Ghi Comand
void lcd_gotoxy(int8 x, int8 y);  //Di chuyen con tro toi hang x, cot y

//---------------------------------------
//main
void main()
 {
 char* dd="Hello World";
 init();
 lcd_init();
 lcd_Str(dd);
 while(1);
 
 }
 
//---------------------------------------
//I/O init
void init()
 {
    TRISA=0x00;                //a port as output.
    TRISD=0x00;                //d port as output.
 }

//---------------------------------------
//LCD init
void lcd_init()
 {
  PORTD=0x30;
  LCD_WrCm();  //   
  PORTD=0x30;  //
  LCD_WrCm();  //    reset
  PORTD=0x30;  //
  LCD_WrCm();  //   
 
    PORTD=0x01;                //Xoa Man Hinh
    lcd_WrCm();
    PORTD=0x38;                //che do 8 bits 2 lines, 5*7 mode. 
    lcd_WrCm();
    PORTD=0x0e;                //Bat LCD,hien con tro,blink off.
    lcd_WrCm();
    PORTD=0x06;                //Con tro tu dong dich fai khi gui 1 ky tu.
    lcd_WrCm();
    PORTD=0x80;                //Vi tri dau tien LCD
    lcd_WrCm();
 }
 
//--------------------------------------
//Xuat Chuoi
void lcd_Str(char* Str)
{
int8 i;
while(Str[i]!=0)
{
lcd_WrDt(Str[i]);
i++;
delay_ms(50);
}
}

//--------------------------------------
//Ghi data vao lcd.
void lcd_WrDt(char c)
 {
  output_high(rs);  //rs=1 Ghi vao thanh ghi Data
  output_low(rw);  //rw=0 Thuc hien viec ghi
  PORTD=c;
  output_low(e);    //e=0 
  output_high(e);    //e=1 Tao xung canh len de lcd nhan lenh
  delay_ms(50);
 }

//--------------------------------------
//Ghi lenh vao lcd
void lcd_WrCm(void)
 {
  output_low(rs); //rs=0 Ghi vao thanh ghi Lenh
  output_low(rw); // rw=0 Thuc hien viec ghi
  output_low(e);  // e=0 
  output_high(e);  // e=1 Tao xung canh len de LCD nhan data
  delay_ms(50); 
 }

//--------------------------------------
//Di chuyen con tro
void lcd_gotoxy(int8 x, int8 y)
{
switch(x)
{
case 1:
  {
      PORTD=0x80 + y;
      lcd_WrCm();
      break;
  }
case 2:
  {
      PORTD=0xC0 + y;
      lcd_WrCm();
      break;
  }
default: break;
}

}


hcmut.khoamaisi 14-11-2010 07:53 PM

Cái này nhớ không rõ lắm !hình như là trong CCS phải khai báo tất cả các hàm con phía trên hàm main.Chứ viết phía dứoi hàm main nó không hiểu!Bạn thử dời các hàm lên trên hàm main xem sao.Còn nữa hàm lcd_init() theo mình là có vấn đề tốt nhất là bạn chỉ khai báo 3 cái cơ bản thôi:
Code:

void initLCD(void)            //Khoi tao gia tri dau cho LCD
  {
  LCD=0x38;
  comwrt();
  LCD=0x0C;
  comwrt();
  LCD=0x06;
  comwrt();
  delay_ms(1);
  }

còn lênh tắt màn hình ,và các lệnh khác nên khai báo trong main
hàm gửi lệnh và data của bạn không có vấn đề nhưng không cần dùng output_high(),output_low() làm gì cứ ghi chẳn hạn như rw=1;rw=0 vậy là đơn giản nhất!

ducdn 14-11-2010 08:18 PM

Trích:

Nguyên văn bởi hcmut.khoamaisi (Post 40111)
Cái này nhớ không rõ lắm !hình như là trong CCS phải khai báo tất cả các hàm con phía trên hàm main.Chứ viết phía dứoi hàm main nó không hiểu!Bạn thử dời các hàm lên trên hàm main xem sao.Còn nữa hàm lcd_init() theo mình là có vấn đề tốt nhất là bạn chỉ khai báo 3 cái cơ bản thôi:
Code:

void initLCD(void)            //Khoi tao gia tri dau cho LCD
  {
  LCD=0x38;
  comwrt();
  LCD=0x0C;
  comwrt();
  LCD=0x06;
  comwrt();
  delay_ms(1);
  }

còn lênh tắt màn hình ,và các lệnh khác nên khai báo trong main
hàm gửi lệnh và data của bạn không có vấn đề nhưng không cần dùng output_high(),output_low() làm gì cứ ghi chẳn hạn như rw=1;rw=0 vậy là đơn giản nhất!

Em thử rồi mà vẫn ko đc.
Còn cái rw=1;rw=0 khi viết vầy thì nó ko chịu (báo lỗi), do đó em mới fai dùng chiêu trên. Hình như là do kiểu định dạng nó là theo bit.


Múi giờ GMT. Hiện tại là 12:34 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam