บทความนี้เป็นตัวอย่างโค้ดสำหรับ PIC เชื่อมต่อกับ LCD 16x2 โดยเราจะพิมพ์ข้อความไปที่จอ LCD คะ ซึ่งขาของตัว LCD Module ดูตามข้อมูลด้านล่างคะ
Pin No | Symbol | Level | Description |
1 | VSS | 0V | Ground |
2 | VDD | 5V | Supply Voltage for logic |
3 | VO | (Variable) | Operating voltage for LCD |
4 | RS | H/L | H: DATA, L: Instruction code |
5 | R/W | H/L | H: Read(MPU?Module) L: Write(MPU?Module) |
6 | E | H,H->L | Chip enable signal |
7 | DB0 | H/L | Data bus line |
8 | DB1 | H/L | Data bus line |
9 | DB2 | H/L | Data bus line |
10 | DB3 | H/L | Data bus line |
11 | DB4 | H/L | Data bus line |
12 | DB5 | H/L | Data bus line |
13 | DB6 | H/L | Data bus line |
14 | DB7 | H/L | Data bus line |
15 | A | 5V | LED + |
16 | K | 0V | LED- |
โดยขั้นตอนในการติดต่อกับตัว LCD Module ดูได้จาก flowchart ของโปรแกรมด้านล่างคะ
จากนั้นทำการต่อวงจรในโปรแกรม proteus ตามวงจรข้างล่างเลยคะ
ขึ้นตอนต่อไป คือการเขียนโปรแกรม ผู้เขียนจะใช้ CCS C คอมไพเลอร์ร่วมกับ MPLAB IDE ซึ่งในโค้ดข้างล่างเราต้องทำการ add library "lcd.c" ซึ่ง library นี้ผู้เขียนได้ทำการแก้ไขจากไลบราลี่เดิมที่มีอยู่แล้ว โดยเพื่อนๆ สามารถดาวน์โหลดไลบราลี่ได้จากลิ้งนี้คะ (link here) เมื่อดาวน์โหลดมาแล้วให้เอาไปแทนไลบราลี่ตัวเดิมซึ่งอยูใน "C:\Program Files (x86)\PICC\Drivers" จากนั้นเขียนโปรแกรมตามโค้ดข้างล่างเลยคะ
Source code (ไฟล์.hex ดาวน์โหลดได้จากลิ้งนี่คะ)
//******************************************************//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 ข้างล่างคะ
ไม่มีความคิดเห็น:
แสดงความคิดเห็น