Saturday, May 24, 2014

Giao tiếp MSP430 và LCD16x2


          LCD16x2 là một công cụ hiển thị hết sức cơ bản và quen thuộc với tất cả các bạn đã và đang học điện tử.Vì vậy trong bài này mình không đi sâu giải thích nguyên lý hoạt động của nó nữa.Ở đây mình chỉ hướng dẫn cơ bản cách sử dụng thư viện LCD16x2.h ,các hàm và cách viết chương trình.Bộ thư viện này chỉ là giao tiếp I/O nên dùng được cho mọi dùng MSP430.


1.  Sơ đồ mạch
Có LCD có 2 chế độ điều khiển đó là có phản hồi và không có phản hồi(cờ bận RW),việc dùng chân RW sẽ tốn thêm 1 chân VĐK tuy nhiêu tốc độ giao tiếp sẽ rất cao,ít xảy ra lỗi(khuyến khích sử dụng).Ngoài ra còn có kiểu truyền dữ  liệu 4 bit hoặc 8 bit,nhưng hầu hết mọi người đều sử dụng mode 4 bit để giảm số chân điều khiển của VĐK.

Sơ đồ nối dây trong mô phỏng(dùng với MSP430F2272)
Bộ thư viện chúng ta sử dụng yêu cầu dùng mode truyền dữ liệu 4 bit,4 chân truyền dữ liệu bắt buộc phải liền nhau trong 1 Port ,theo đúng thứ tự từ thấp đến cao ,tuy nhiên không nhất thiết phải là 4 bit cao của port có mà có thêm lựa chọn  dịch xuống(tức là như hình các bạn nối(D4-P1.4 D5-P1.5 D6-P1.6 D7-P1.7 nhưng cũng có thể nối D4-P1.1 D5-P1.2 D6-P1.3 D7-P1.4).Cấu hình như vậy nhằm giảm số dòng code và tăng tốc độ hoạt động.Khi sử dụng nhất thiết phải cấu hình lại chân trong thư viện cho đúng với mạch.

2.  Chương trình



Một số chú ý :

-       Khi chạy trên mô phỏng các bạn có thể gặp warning hoặc có thể không chạy nếu dùng bit RW,tuy nhiên trên mạch thật sẽ không gặp vấn đề gì cả.
-       Nếu không dùng bit RW thì phải xóa khai báo #define USE_WAIT còn dùng thì để khai báo này.
-       Nếu không sử dụng bit RW thì phải cài đặt lcd_delay cho phù hợp với tốc độ hoạt động của chip sao cho thời gian thực của số lcd_delay chu kỳ máy ít nhất là 40micros
-       4 bit data ở vị trí mặc định là 4 bit cao của 1 port,nếu các bạn muốn dùng 4 bit thấp hơn của port đấy thì phải sửa lại define SHIFT_DATA bằng đúng số bit dịch(ví dụ nếu D7-P1.5 thì SHIFT_DATA=2
-   Khi mô phỏng thì các bạn cần tạo file hex,có thể vào Properties > Build > Step > Apply predefined Step chọn hex



Các hàm cần biết:
-       LCD_Init();         Hàm khởi tạo các chân điều khiển,gọi ra khi muốn sử dụng LCD.
-       LCD_Clear();       Xóa trắng dữ liệu trên màn hình
-       LCD_Home();      Đưa con trỏ về vị trí đầu tiên hàng trên cùng
-       LCD_Goto(x,y);   Đưa con trỏ đến vị trí hàng x cột y (Các bạn có thể sử dụng thư viện này cho LCD20x4,tuy nhiên phải sửa lại hàm này để nhảy được đến cả 4 dòng).
-       LCD_Wait();        Hàm chờ LCD rảnh
-       LCD_Display(‘ ’);  In ra ký tự trong dấu ‘ ’
-       LCD_PrintString(“ “);       In ra chuỗi trong dấu “ “
-       LCD_PrintDecimal(n,length);      In ra số nguyên có dấu n với độ dành length
-       LCD_PrintFloat(x,length,coma)   In ra số thực x với độ dành length(tính cả dấu chấm) và làm trong coma chữ số sau dấu phẩy.
Ví dụ tham khảo:
////////////////////////////////////////////////////////////////////
// CHUONG TRINH TEST LCD16x2
// VIET BOI : PHAM VAN THUAN      DTVT07-K55
// Email:     terran991992@gmail.com
// Blog :     http://thuanbk55.blogspot.com/
// .................................................................
// AP DUNG CHO MACH UNG DUNG MSP430
//******************************************************************/
#include "msp430f2272.h"
#include "stdio.h"
#include "LCD_16x2.h"

void main()
{
       unsigned int x=100;
       float y=1.2347;
       WDTCTL = WDTPW | WDTHOLD;  //Stop Watchdog
       DCOCTL = CALDCO_1MHZ;             // Clock=1Mhz
       BCSCTL1 = CALBC1_1MHZ;

       LCD_Init();
       while(1)
       {
              LCD_Clear();
              LCD_Home();
              LCD_PrintString("Test LCD_16x2");
              LCD_Goto(2,0);
              LCD_PrintDecimal(x,4);
              LCD_Goto(2,8);
              LCD_PrintFloat(y,5,3);
              _delay_cycles(1000000);
       }
}

Kết quả chương trình:

Thư viện LCD các bạn có thể download tại đây

12 comments:

  1. bạn ơi con LCD16x2 này chạy 5v mà con msp430 này chạy 3.3v mà bạn nối dây này thì có làm sao không?

    ReplyDelete
    Replies
    1. Có loại LCD 3.3V đấy bạn ạ.Còn nếu bạn vẫn dùng LCD 5V thì bạn cấp nguồn 5V cho LCD cũng được,các chân tín hiệu vẫn dùng được 3.3V bình thường,nối trực tiếp với MSP430

      Delete
    2. cho mình hỏi câu nữa : sao m add thư viên LCD_16x2 của bạn vào mà nó lỗi tùm lum ấy nhỉ, m dùng ccs 6.0.1

      Delete
    3. bạn để ý là thư viện này viết đặc thù cho MSP430G2553,khi dùng với chip khác kể cả cùng dòng chip cũng phải để ý vì có thể cấu hình chân IO vẫn không đúng.Khác dòng nhưng thuộc họ MSP thì vẫn dùng bình thường nhưng phải cấu hình lại chân.Một chú ý khác là một số chip cũ ko có thanh ghi PxSEL2 ,nên thường báo lỗi chỗ này

      Delete
    4. ok, cảm ơn bạn đã reply lại nhé! m cũng dùng MSP430G2553 trên kit launchpad mà, m xem nó k phải lỗi I/O đâu, nó lỗi gì gì ấy .....
      VD: PSELLCD &=~(0xF0>>SHIFT_DATA); //Chon chuc nang I/O
      //PSEL2LCD &=~(0xF0>>SHIFT_DATA);
      DDRLCD|=0xF0>>SHIFT_DATA; //Chon xuat du lieu cho 4 chan data
      PRENLCD &=~(0xF0>>SHIFT_DATA); //Khong co dien tro noi keo len
      PORTLCD &=~(0xF0>>SHIFT_DATA); //Dau ra muc thap

      Delete
    5. Có thể bạn xóa mất mấy cái define rồi,còn thư viện này mình chạy bình thường không thấy có vấn đề gì,bạn có thể trỏ chuột vào biểu tượng error của từng dòng,nó sẽ hiện lỗi cụ thể,chứ bạn nói chung chung thế mình cũng chịu thôi

      Delete
  2. bài của anh hay quá anh học bk đúng ko a

    ReplyDelete
  3. Gán quảng cáo ức chế vcl, có tải được đâu.

    ReplyDelete
  4. bài này của anh hay mà thư viện LCD_16x2.h ko tải đc
    mong a giúp đỡ

    ReplyDelete
  5. Em không đọc được giá trị nhiệt độ dht11 lên lcd 16x2 anh có thể giúp em được không ?
    Em cảm ơn.

    ReplyDelete
  6. xuống hàng thì sài lệnh gì vậy anh,với lại lệnh LCD_goto(x,y); sử dụng như thế nào vậy

    ReplyDelete

END COMMENT FACEBOOK-->