Thông báo

Collapse
No announcement yet.

Làm sao printf ra LCD trong C18??

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Làm sao printf ra LCD trong C18??

    Trong C18 mặc định khi dùng Printf là nó xuất dữ liệu ra UART,giờ em muốn nó xuất ra LCD 16x2
    mọi người vào giúp em với!!
    phải sửa những file header nào ạ,nhiều file quá??
    em mò cả ngày mà chưa ra!!

  • #2
    Thông thường, ở các trình dịch C cho vi điều khiển, khi hàm printf được gọi, nó sẽ gọi hàm putchar() mỗi lần nó cần truyền kí tự trong chuỗi.
    Nếu người dùng không định nghĩa hàm putchar() thì nó sẽ gọi hàm putchar() mặc định của nó. Nếu bạn định nghĩa hàm putchar() rồi thì nó sẽ dùng hàm putchar() của bạn.

    Bạn tạo hàm mới có tên putchar hoặc putc... gì đó, đại loại như thế này:

    Code:
    
    void putchar(char c)
    {
         if(g_Mode == PUTCHAR_LCD)
         {
              uart_putchar(c);
         }
         else
         if(g_Mode == PUTCHAR_UART)
         {
              lcd_putchar(c);
         }
    }
    g_Mode là biến tổng thể dùng để chọn chế độ sử dụng hàm printf giữa UART và LCD.
    Các hàm lcd_putchar() và uart_puchar() bạn tự xây dựng để tương thích với phần cứng.

    Have Fun!

    Comment


    • #3
      Hàm printf() của C18 chỉ hoạt động khi cái đối tượng mà nó xuất ra có thể truy cập bằng con trỏ kiểu FILE (tức là đối tượng đó được coi như 1 FILE). UART là ngoại vi đơn giản nên có thể làm như vậy được, thực ra bản chất của việc truyền tin UART chỉ là ghi vào thanh ghi TXREG.

      LCD 16x2 là đối tượng phức tạp : điều khiển nó cần nhiều chân cổng, viết câu lệnh đúng tuần tự, có trễ ... nên không thể dùng hàm printf() được. Hack nó sẽ mất nhiều công mà chưa chắc đã làm được.

      Thông thường người ta xuất ra LCD bằng các lệnh trong thư viện Maestro của Microchip, ví dụ
      XLCDInit()
      XLCDGet()
      XLCDPut()
      ...
      Đọc mã nguồn các hàm trên sẽ thấy điều khiển LCD 16x2 phức tạp hơn nhiều so với UART.

      Thư viện Maestro là một bộ phận cài đặt cùng phần mềm MPLAB.
      Phần mềm tự do hoặc không dùng máy tính nữa !.

      Comment


      • #4
        Nguyên văn bởi bqviet Xem bài viết
        Hàm printf() của C18 chỉ hoạt động khi cái đối tượng mà nó xuất ra có thể truy cập bằng con trỏ kiểu FILE (tức là đối tượng đó được coi như 1 FILE). UART là ngoại vi đơn giản nên có thể làm như vậy được, thực ra bản chất của việc truyền tin UART chỉ là ghi vào thanh ghi TXREG.

        LCD 16x2 là đối tượng phức tạp : điều khiển nó cần nhiều chân cổng, viết câu lệnh đúng tuần tự, có trễ ... nên không thể dùng hàm printf() được. Hack nó sẽ mất nhiều công mà chưa chắc đã làm được.

        Thông thường người ta xuất ra LCD bằng các lệnh trong thư viện Maestro của Microchip, ví dụ
        XLCDInit()
        XLCDGet()
        XLCDPut()
        ...
        Đọc mã nguồn các hàm trên sẽ thấy điều khiển LCD 16x2 phức tạp hơn nhiều so với UART.

        Thư viện Maestro là một bộ phận cài đặt cùng phần mềm MPLAB.

        vậy là không nên hack hả anh ?
        nhưng nêu không hack thì khó mà xuất các dữ liệu kiểu số thực (float).
        Anh em có cách (hay biết hàm nào) chuyển từ kiểu số thực sang kiểu chuỗi không ạ?

        trong C18 có cấu trúc :

        sprintf(buf,"bien i = %d",i);
        LCD_puts(buf);

        hoạt động như hàm printf,nhưng tội cái nó không hỗ trợ kiểu float !!

        Comment


        • #5
          Dùng hàm ftoa() chuyển số thực thành một chuỗi ký tự ASCII, sau đó chuỗi này muốn làm gì tùy người lập trình : truyền qua UART, đưa ra LCD ...

          Các hàm ftoa(), itoa(), atoi() ... có trong thư viện chuẩn của ngôn ngữ C, trình biên dịch C18 cũng tuân thủ.
          Phần mềm tự do hoặc không dùng máy tính nữa !.

          Comment


          • #6
            Cái này không gọi là hack. Giới lập trình gọi nó là retarget.
            Mọi người vẫn thường sửa lại hàm putchar để làm việc với nhiều loại console khác nhau, từ module LCD, LED matrix, đến màn CRT.

            Chuyển kí tự ra cổng COM thì dùng 1 chân TX, chuyển kí tự ra LCD thì dùng nhiều chân I/O, chuyển kí tự ra LED matrix thì dùng nhiều chân output... Những cái đó không ảnh hưởng gì đến cách thức làm việc của hàm printf cả.
            Lí do là hàm printf() thuần túy là phần mềm. Nếu bạn muốn thay đổi đầu ra của hàm printf, thì chỉ cần retarget lại hàm putchar().
            Một khi bạn đã retarget hàm putchar(), bạn có thể hiển thị số float thoải mái, đại loại thế này: printf("%f", blablabla);

            Tiện ích của nó là bạn có thể tận dụng được các tính năng xử lý xâu mạnh mẽ vốn có của các trình dịch C, không cần phải dùng đến hàm itoa(), ftoa()... lắt nhắt, và mất thời gian
            Tuy vậy, nhiều người vẫn không dùng cách này. Một phần là vì họ không biết, một phần là vì code của hàm printf() chiếm khá nhiều tài nguyên.

            Mình thấy bạn đăng cái thread này 2 ngày rồi, lại còn lên hỏi lại là có nên làm hay không. Trong thời gian đấy bạn đã có thể làm và chạy xong xuôi rồi. Chỉ là sửa một chút code thôi, không hỏng máy, và cũng không phải cài lại phần mềm đâu.

            Comment


            • #7
              bạn có thư viện lcd sẵn rùi, bạn chỉ cần viết thêm 1 hàm convert từ float sang string thế là bạn có thể làm ok rồi!

              Comment


              • #8
                em đã làm được printf ra LCD với HT-PICC18 còn với MCC18 thì chịu,mò mãi chả thấy hàm putchar() (hay cái gì tương tự cả ) .

                Comment

                Về tác giả

                Collapse

                delta21 Tìm hiểu thêm về delta21

                Bài viết mới nhất

                Collapse

                Đang tải...
                X