หน้าเว็บ

วันอาทิตย์ที่ 28 กรกฎาคม พ.ศ. 2556

LCD display บน PIC18F2550

บทความนี้เป็นตัวอย่างโค้ดสำหรับ PIC เชื่อมต่อกับ LCD 16x2 โดยเราจะพิมพ์ข้อความไปที่จอ LCD คะ ซึ่งขาของตัว LCD Module ดูตามข้อมูลด้านล่างคะ

Pin NoSymbolLevelDescription
1VSS0VGround
2VDD5VSupply Voltage for logic
3VO(Variable)Operating voltage for LCD
4RSH/LH: DATA, L: Instruction code
5R/WH/LH: Read(MPU?Module) L: Write(MPU?Module)
6EH,H->LChip enable signal
7DB0H/LData bus line
8DB1H/LData bus line
9DB2H/LData bus line
10DB3H/LData bus line
11DB4H/LData bus line
12DB5H/LData bus line
13DB6H/LData bus line
14DB7H/LData bus line
15A5VLED +
16K0VLED-



โดยขั้นตอนในการติดต่อกับตัว LCD Module ดูได้จาก flowchart ของโปรแกรมด้านล่างคะ



จากนั้นทำการต่อวงจรในโปรแกรม proteus ตามวงจรข้างล่างเลยคะ



ขึ้นตอนต่อไป คือการเขียนโปรแกรม ผู้เขียนจะใช้ CCS C คอมไพเลอร์ร่วมกับ MPLAB IDE  ซึ่งในโค้ดข้างล่างเราต้องทำการ add library "lcd.c" ซึ่ง library นี้ผู้เขียนได้ทำการแก้ไขจากไลบราลี่เดิมที่มีอยู่แล้ว โดยเพื่อนๆ สามารถดาวน์โหลดไลบราลี่ได้จากลิ้งนี้คะ (link here) เมื่อดาวน์โหลดมาแล้วให้เอาไปแทนไลบราลี่ตัวเดิมซึ่งอยูใน  "C:\Program Files (x86)\PICC\Drivers" จากนั้นเขียนโปรแกรมตามโค้ดข้างล่างเลยคะ


//******************************************************
//Project        : LCD print out
//Purpose        : Test LCD Module
//Auther         : JUMP start innovation
//Email          : jumpstartinnovation@gmail.com
//Complier       : CCS.PCWH.v4.134
//Hardware       : PIC18F2550
//**********************************************************

#include <18f2550.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// *** Device Specification ***
#fuses HS            // use Oscillator mode HS
#fuses NOWDT // doesn't use watch dog
#fuses NOLVP         // doesn't use Low Voltage for program
#fuses NOPROTECT     // No program detect

#use delay (clock=20M, crystal)
// use built-in function: delay_ms() & delay_us() by crytal 20MHz

#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,stream=HOSTPC,errors)

#define _FLEX_LCD216_H  //  LCD Type 16x2
//#define _FLEX_LCD416_H  //  LCD Type 16x4
// Assign MCU's pin to LCD
#define LCD_DB4   PIN_B2
#define LCD_DB5   PIN_B3
#define LCD_DB6   PIN_B4
#define LCD_DB7   PIN_B5
#define LCD_RS    PIN_B0
#define LCD_E     PIN_B1
//#define LCD_RW    PIN_B1  // Doesn't use RW connect to GND
#include <lcd.c> // include LCD library CCS C

/*******************************************************************************
*  Function prototypes
********************************************************************************/
void headle(void);

/***********************************************************************
 * FUNCTION:    headle
 * DESCRIPTION: Show headle title though rs232
 * PARAMETERS:  nothing
 * RETURNED:    nothing
 ***********************************************************************/
void headle(void){
                fprintf(HOSTPC,"\n\r******************************************************\n\r");
                fprintf(HOSTPC,"Project        : LCD print out\n\r");
                fprintf(HOSTPC,"Purpose        : Test LCD Module\n\r");
                fprintf(HOSTPC,"Auther         : JUMP start innovation\n\r");
                fprintf(HOSTPC,"Email          : jumpstartinnovation@gmail.com\n\r");
                fprintf(HOSTPC,"Complier       : CCS.PCWH.v4.134\n\r");
                fprintf(HOSTPC,"Hardware       : PIC18F2550\n\r");
                fprintf(HOSTPC,"**********************************************************\n\r");
    }


/***********************************************************************
 * FUNCTION:    main
 * DESCRIPTION: main function
 * PARAMETERS:  nothing
 * RETURNED:    nothing
 ***********************************************************************/
void main(void){

headle(); //show message output to serial port

        lcd_init(); //Initial LCD
        fprintf(HOSTPC,">> LCD Initial ... DONE\n\r");

        while(true){

            printf(lcd_putc,"\f");  //clear LCD screen

            lcd_gotoxy(4,1); //goto lcd position x=1, y=1
            printf(lcd_putc,"Hello World");

            lcd_gotoxy(2,2); //goto lcd position x=2, y=2
            printf(lcd_putc,"* JUMP START *");
            
            delay_ms(1000);

            // clear LCD screen line 1
            lcd_gotoxy(16, 1); //goto lcd position x=16, y=1
            for(int i=0; i < 16; i++){
                printf(lcd_putc," \b\b"); //back space
                delay_ms(100);
            }

            // clear LCD screen line 2
            lcd_gotoxy(16, 2); //goto lcd position x=16, y=1
            for(i=0; i < 16; i++){
                printf(lcd_putc," \b\b"); //back space
                delay_ms(100);
            }

        }
}




เมื่อทำการคอมไพล์เสร็จเรียบร้อยแล้ว ทดลองรันดูเลยคะ จะได้ผลตาม Video ข้างล่างคะ







ไม่มีความคิดเห็น:

แสดงความคิดเห็น