กันยายน 24, 2018, 07:27:08 pm *
ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน
ส่งอีเมล์ยืนยันการใช้งาน?

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น
   หน้าแรก   ช่วยเหลือ เข้าสู่ระบบ สมัครสมาชิก  
หน้า: [1]   ลงล่าง
  พิมพ์  
ผู้เขียน หัวข้อ: LPC2138 ต่อกับ LCD  (อ่าน 4909 ครั้ง)
0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้
secret07
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 11


| |
« เมื่อ: กุมภาพันธ์ 09, 2013, 03:11:34 am »

ขอโค๊ดในการแสดงข้อความที่หน้าจอ LCD หน่อยสิครับ
ลองหาโค๊ดมาใช้ปรับขาใหม่ให้ตรงกับบอร์ดที่มีมาให้ คือ 1.25 - 1.31 ก็ยังใช้ไม่ได้อยู่ดี
เวลาต่อหน้าจอเข้ากับบอร์ดขึ้นตามภาพ ยังงี้ถูกต้องแล้วใช่ไหมครับ



เพราะบัดกรีตรงตาม datasheet เลยนะ
แต่โค๊ดโหลดมาไม่รู้กี่อันต่อกี่อันก็ใช้ไม่ได้อ่ะ

Code: (c)
/***************************************/
/*                 LCD                 */
/* LCD Routines for "ET-ARM7 KIT V1.0" */
/* Character 16x2 4-Bit Mode Interface */
/***************************************/

#include <LPC213x.H>                         
#include <stdio.h>

/*************************/
/* Define LCD PinIO Mask */
/*************************/
#define  LCD_D4     (1<<28)                     // P1.28
#define  LCD_D5     (1<<29)                     // P1.29
#define  LCD_D6     (1<<30)                     // P1.30
#define  LCD_D7     (1<<31)                     // P1.31
#define  LCD_EN     (1<<27)                     // P1.27
#define  LCD_RS     (1<<25)                     // P1.25
#define  LCD_DATA   (LCD_D4|LCD_D5|LCD_D6|LCD_D7)
#define  LCD_IOALL  (LCD_D4|LCD_D5|LCD_D6|LCD_D7|LCD_EN|LCD_RS)

#define  lcd_rs_set() IOSET1 |= LCD_RS                // RS = 1 (Select Instruction)
#define  lcd_rs_clr() IOCLR1 |= LCD_RS               // RS = 0 (Select Data)
#define  lcd_en_set() IOSET1 |= LCD_EN               // EN = 1 (Enable)
#define  lcd_en_clr() IOCLR1 |= LCD_EN               // EN = 0 (Disable)

#define  lcd_clear()          lcd_write_control(0x01)   // Clear Display
#define  lcd_cursor_home()    lcd_write_control(0x02)   // Set Cursor = 0
#define  lcd_display_on()     lcd_write_control(0x0E)   // LCD Display Enable
#define  lcd_display_off()    lcd_write_control(0x08)   // LCD Display Disable
#define  lcd_cursor_blink()   lcd_write_control(0x0F)   // Set Cursor = Blink
#define  lcd_cursor_on()      lcd_write_control(0x0E)   // Enable LCD Cursor
#define  lcd_cursor_off()     lcd_write_control(0x0C)   // Disable LCD Cursor
#define  lcd_cursor_left()    lcd_write_control(0x10)   // Shift Left Cursor
#define  lcd_cursor_right()   lcd_write_control(0x14)   // Shift Right Cursor
#define  lcd_display_sleft()  lcd_write_control(0x18)   // Shift Left Display
#define  lcd_display_sright() lcd_write_control(0x1C)   // Shift Right Display

/********************/
/* Declare Function */
/********************/
void lcd_init();                              // Initial LCD
void lcd_wait();                              // Wait Busy LCD Complete
void lcd_out_data4(unsigned char);                  // Strobe 4-Bit Data to LCD
void lcd_write_byte(unsigned char);                  // Write 1 Byte Data to LCD
void lcd_write_control(unsigned char);                // Write Instruction
void lcd_write_ascii(unsigned char);                // Write LCD Display(ASCII)
void goto_cursor(unsigned char);                  // Set Position Cursor LCD
void lcd_print(unsigned char*);                     // Print Display to LCD
void delay(unsigned long int);                     // Delay Function

/*****************/                                          
/* Main Function */
/*****************/
int main(void)

   PINSEL2 = 0x00000000;

   IODIR1 |= LCD_D4;                        // P1.25 - P1.31 = Output
   IODIR1 |= LCD_D5;                        // P1.25 - P1.31 = Output
   IODIR1 |= LCD_D6;                        // P1.25 - P1.31 = Output
   IODIR1 |= LCD_D7;                        // P1.25 - P1.31 = Output
   IODIR1 |= LCD_RS;                        // P1.25 - P1.31 = Output
   IODIR1 |= LCD_EN;                        // P1.25 - P1.31 = Output

   lcd_init();

   while(1)
   {
      goto_cursor(0x00);               // ROW 1   
               //0123456789ABCDEF
      lcd_print("** My Project **");
                                 // ROW 2
      goto_cursor(0x40);   
               //0123456789ABCDEF
      lcd_print("**  TEST LCD  **");

   }                                       
}

/**************************/
/* Wait Bysy LCD Complete */
/**************************/
void lcd_wait()
{
   int loop=500;                                // Busy Delay Time     
   while(loop--);                             // Busy Loop
}

/****************************/
/* Strobe 4-Bit Data to LCD */
/****************************/
void lcd_out_data4(unsigned char val)
{
   IOCLR1 |= (LCD_DATA);                          // Reset 4-Bit Pin Data
   IOSET1 |= (val<<16);                          // 0000 0000 00,EN,RS DDDD 0000 0000 0000 0000
}

/****************************/
/* Write Data 1 Byte to LCD */
/****************************/
void lcd_write_byte(unsigned char val)

   lcd_out_data4((val>>4)&0x0F);                  // Strobe 4-Bit High-Nibble to LCD
   lcd_en_set();                              // EN = 1 = Strobe Signal 
   lcd_en_clr();                              // EN = 0
   lcd_wait();                                 // Wait LCD Execute Complete
   
   lcd_out_data4((val)&0x0F);                     // Strobe 4-Bit Low-Nibble to LCD
   lcd_en_set();                              // EN = 1 = Strobe Signal   
   lcd_en_clr();                              // EN = 0   
   lcd_wait();                                 // Wait LCD Execute Complete
}

/****************************/
/* Write Instruction to LCD */
/****************************/
void lcd_write_control(unsigned char val)
{
   lcd_rs_clr();                              // RS = 0 = Instruction Select
   lcd_write_byte(val);                        // Strobe Command Byte    
   delay(50000);                                // Approx. 2mS Delay
}

/****************************/
/* Write Data(ASCII) to LCD */
/****************************/
void lcd_write_ascii(unsigned char c)
{
   lcd_rs_set();                              // RS = 1 = Data Select
   lcd_write_byte(c);                              // Strobe 1 Byte to LCD   
}

/*******************************/
/* Initial 4-Bit LCD Interface */
/*******************************/
void lcd_init()
{
   lcd_rs_clr();                              // RS = 0 = Instruction Select
   lcd_en_clr();                              // EN = 0 
   delay(50000);                              // wait VDD raise > 4.5V
   
   lcd_write_control(0x33);                      // Initial (Set DL=1 3 Time, Reset DL=0 1 Time)
   lcd_write_control(0x32);
   lcd_write_control(0x28);                       // Function Set (DL=0 4-Bit,N=1 2 Line,F=0 5X7)
   lcd_write_control(0x0C);                       // Display on/off Control (Entry Display,Cursor off,Cursor not Blink)
   lcd_write_control(0x06);                       // Entry Mode Set (I/D=1 Increment,S=0 Cursor Shift)
   lcd_write_control(0x01);                       // Clear Display  (Clear Display,Set DD RAM Address=0)
}

/***************************/
/* Set LCD Position Cursor */
/***************************/
void goto_cursor(unsigned char i)
{
   i |= 0x80;                                 // Set DD-RAM Address Command
   lcd_write_control(i); 
}

/************************************/
/* Print Display Data(ASCII) to LCD */
/************************************/
void lcd_print(unsigned char* str)
{
   int i;
   
   for (i=0;i<16 && str!=0;i++)                 // 16 Character Print
   {
      lcd_write_ascii(str);                  // Print Byte to LCD
   }
}

/***********************/
/* Delay Time Function */
/*    1-4294967296     */
/***********************/
void delay(unsigned long int count1)
{
   while(count1 > 0) {count1--;}                  // Loop Decrease Counter   
}



ช่วยดูแก้ให้หน่อยสิครับ หรือไม่ก็ขอโค๊ดที่มันแสดงข้อความได้อ่ะครับ ไม่รู้ว่าโค๊ดที่ให้ดูมันผิดพลาดตรงไหน
บันทึกการเข้า
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8272


ShadowWares


| |
« ตอบ #1 เมื่อ: กุมภาพันธ์ 09, 2013, 04:25:23 pm »

อ้างถึง
ขอโค๊ดในการแสดงข้อความที่หน้าจอ LCD หน่อยสิครับ
ให้ code ไปก็ไม่ได้หมายความว่าคุณจะใช้มันได้โดยที่ยังไม่มีความรู้พื้นฐาน code ของ lcd ก็เหมือนๆ กันหมด สิ่งที่แตกต่างคือต้องปรับแก้ให้ตรงกับ hardware ตรงนี้ต้องการความรู้ของคนใช้เพื่อปรับเปลี่ยนแก้ไข คุณมีหรือยัง? ถ้ายัง จะต้องหาหนังสืออ่าน

อ้างถึง
ลองหาโค๊ดมาใช้ปรับขาใหม่ให้ตรงกับบอร์ดที่มีมาให้ คือ 1.25 - 1.31 ก็ยังใช้ไม่ได้อยู่ดี
ไม่ใช่เรื่องแปลก ถ้าลอกของเขามาใช้โดยที่ไม่รู้ว่า code แต่ละบรรทัดมันทำอะไร แล้วทำงานได้ตามที่ต้องการ นี่สิแปลก

อ้างถึง
เวลาต่อหน้าจอเข้ากับบอร์ดขึ้นตามภาพ ยังงี้ถูกต้องแล้วใช่ไหมครับ
สิ่งที่เห็นในรูปมันบอกว่ามีไฟเลี้ยง LCD แล้ว แต่ LCD ยังไม่ถูก Initialized
บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
secret07
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 11


| |
« ตอบ #2 เมื่อ: กุมภาพันธ์ 09, 2013, 09:10:07 pm »

 ถ้า LCD ถูก Initialized

จะแสดงเป็นไงถึงจะรู้ครับ
ผมเซ็ตตามล่างนี้แล้วก็เหมือนเดิมนะ

1).หากเป็นการเริ่มจ่ายไฟให้ LCD   เพื่อให้ LCD Internal Reset   
        ให้รออย่างน้อย 15ms       
    2). กำหนดขาควบคุม       
        ให้ขา E = 0       
        ให้ขา RS= 0   กำหนดเป็นคำสั่ง   
        ให้ขา R/W = 0   เขียนข้อมูล   
    3).ส่งข้อมูลค่ำสั่ง Function Set 3 ครั้ง    ข้อมูล D4-D7 จะถูกส่งไปที่ bus   
         3.1) data = 00110000       
        E=1,delay(450ns),E=0   E    
        รออย่างน้อย 4.1ms       
         3.2) data = 00110000       
        E=1,delay(450ns),E=0   E    
        รออย่างน้อย 100 us       
         3.3) data = 00110000       
        E=1,delay(450ns),E=0   E     ตอนนี้ยังเป็น 8 bit อยู่
    4).กำหนดการทำงานของ LCD ให้เป็น 4 bit       
        data= 00100000   Function Set (BIT5=1) [001DNF00 ],Sets buss size 4bit (D=0)ข้อมูลเฉพาะ D4-D7 จะถูกส่งออกไปที่บัส
        E=1,delay(450ns),E=0   E 
            ตอนนี้เป็น 4 bit แล้ว
        เมื่อเป็น 4 bit ต้องส่งข้อมูลคำสั่งสองครั้งๆ ละ 4 bit   
    5).   Function Set (BIT5=1)   กำหนด ขนาดข้อมูล,จำนวนบรรทัด, ขนาดตัวอักษร
        เตรียมข้อมูลค่ำสั่ง 00101000   [001DNF00 ],Sets buss size 4bit (D=0),number of lines=2 (N=1),font size =5x7(F=0)
        ส่งข้อมูลไบท์สูงออกไปก่อน data =00101000       
        E=1,delay(450ns),E=0   E    
        สลับไบท์สูง-ต่ำ 10000010   
        ส่งข้อมูลไบท์ต่ำ data =10000010   
        E=1,delay(450ns),E=0   E
บันทึกการเข้า
secret07
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 11


| |
« ตอบ #3 เมื่อ: กุมภาพันธ์ 09, 2013, 11:58:39 pm »

ช่วยดูให้หน่อยครับว่ามันยังผิดพลาดตรงไหนอยู่
ยังไม่ออกเลยครับ
ผมดูของเว็บนี้เป็นตัวอย่างอ่ะ http://www.thaimicrotron.com/Referrence/LCD/LCD-Module3.htm

 cry cry cry

Code:
/***************************************/
/*                 LCD                 */
/* LCD Routines for "ET-ARM7 KIT V1.0" */
/* Character 16x2 4-Bit Mode Interface */
/***************************************/

#include <LPC213x.H>
#include <stdio.h>

/*************************/
/* Define LCD PinIO Mask */
/*************************/
#define  LCD_D4     (1<<28)    // P1.28
#define  LCD_D5     (1<<29)    // P1.29
#define  LCD_D6     (1<<30)    // P1.30
#define  LCD_D7     (1<<31)    // P1.31
#define  LCD_EN     (1<<27)    // P1.27
#define  LCD_RS     (1<<25)    // P1.25
#define  LCD_DATA   (LCD_D4|LCD_D5|LCD_D6|LCD_D7)
#define  LCD_IOALL  (LCD_D4|LCD_D5|LCD_D6|LCD_D7|LCD_EN|LCD_RS)

#define  lcd_rs_set() IOSET1 |= LCD_RS // RS = 1 (Select Instruction)
#define  lcd_rs_clr() IOCLR1 |= LCD_RS // RS = 0 (Select Data)
#define  lcd_en_set() IOSET1 |= LCD_EN // EN = 1 (Enable)
#define  lcd_en_clr() IOCLR1 |= LCD_EN // EN = 0 (Disable)

#define  lcd_clear()          lcd_write_control(0x01) // Clear Display
#define  lcd_cursor_home()    lcd_write_control(0x02) // Set Cursor = 0
#define  lcd_display_on()     lcd_write_control(0x0E) // LCD Display Enable
#define  lcd_display_off()    lcd_write_control(0x08) // LCD Display Disable
#define  lcd_cursor_blink()   lcd_write_control(0x0F) // Set Cursor = Blink
#define  lcd_cursor_on()      lcd_write_control(0x0E) // Enable LCD Cursor
#define  lcd_cursor_off()     lcd_write_control(0x0C) // Disable LCD Cursor
#define  lcd_cursor_left()    lcd_write_control(0x10) // Shift Left Cursor
#define  lcd_cursor_right()   lcd_write_control(0x14) // Shift Right Cursor
#define  lcd_display_sleft()  lcd_write_control(0x18) // Shift Left Display
#define  lcd_display_sright() lcd_write_control(0x1C) // Shift Right Display

/********************/
/* Declare Function */
/********************/
void lcd_init(); // Initial LCD
void lcd_wait(); // Wait Busy LCD Complete
void lcd_out_data4(unsigned char); // Strobe 4-Bit Data to LCD
void lcd_write_byte(unsigned char); // Write 1 Byte Data to LCD
void lcd_write_control(unsigned char); // Write Instruction
void lcd_write_ascii(unsigned char); // Write LCD Display(ASCII)
void goto_cursor(unsigned char); // Set Position Cursor LCD
void lcd_print(unsigned char*); // Print Display to LCD
void delay(unsigned long int); // Delay Function

/*****************/
/* Main Function */
/*****************/
int main(void)

PINSEL2 = 0x00000000;

IODIR1 |= 0xFA000000; // P1.25 - P1.31 = Output
lcd_init();

while(1)
{
      goto_cursor(0x00); // ROW 1     
               //0123456789ABCDEF 
      lcd_print("** My Project **"); 

      goto_cursor(0x40);      // ROW 2
               //0123456789ABCDEF 
      lcd_print("**  TEST LCD  **");  }
}

/**************************/
/* Wait Bysy LCD Complete */
/**************************/
void lcd_wait()
{
int loop=500;  // Busy Delay Time     
while(loop--);  // Busy Loop
}

/****************************/
/* Strobe 4-Bit Data to LCD */
/****************************/
void lcd_out_data4(unsigned char val)
{
IOCLR1 |= (LCD_DATA);   // Reset 4-Bit Pin Data
IOSET1 |= (val<<28);  // DDDD EN,0,RS,0 0000 0000 0000 0000 0000 0000
}

/****************************/
/* Write Data 1 Byte to LCD */
/****************************/
void lcd_write_byte(unsigned char val)

lcd_out_data4((val>>4)&0x0F); // Strobe 4-Bit High-Nibble to LCD
lcd_en_set(); // EN = 1 = Strobe Signal 
lcd_en_clr(); // EN = 0
lcd_wait(); // Wait LCD Execute Complete

lcd_out_data4((val)&0x0F); // Strobe 4-Bit Low-Nibble to LCD
lcd_en_set(); // EN = 1 = Strobe Signal   
lcd_en_clr(); // EN = 0   
lcd_wait(); // Wait LCD Execute Complete
}

/****************************/
/* Write Instruction to LCD */
/****************************/
void lcd_write_control(unsigned char val)
{
lcd_rs_clr(); // RS = 0 = Instruction Select
lcd_write_byte(val); // Strobe Command Byte  
delay(50000);   // Approx. 2mS Delay
}

/****************************/
/* Write Data(ASCII) to LCD */
/****************************/
void lcd_write_ascii(unsigned char c)
{
lcd_rs_set(); // RS = 1 = Data Select
lcd_write_byte(c);     // Strobe 1 Byte to LCD   
}

/*******************************/
/* Initial 4-Bit LCD Interface */
/*******************************/
void lcd_init()
{
lcd_rs_clr(); // RS = 0 = Instruction Select
lcd_en_clr(); // EN = 0 
delay(50000); // wait VDD raise > 4.5V

lcd_write_control(0x33); // Initial (Set DL=1 3 Time, Reset DL=0 1 Time)
lcd_write_control(0x32);
lcd_write_control(0x28);  // Function Set (DL=0 4-Bit,N=1 2 Line,F=0 5X7)
lcd_write_control(0x0C);  // Display on/off Control (Entry Display,Cursor off,Cursor not Blink)
lcd_write_control(0x06);  // Entry Mode Set (I/D=1 Increment,S=0 Cursor Shift)
lcd_write_control(0x01);  // Clear Display  (Clear Display,Set DD RAM Address=0)
}

/***************************/
/* Set LCD Position Cursor */
/***************************/
void goto_cursor(unsigned char i)
{
i |= 0x80; // Set DD-RAM Address Command
lcd_write_control(i); 
}

/************************************/
/* Print Display Data(ASCII) to LCD */
/************************************/
void lcd_print(unsigned char* str)
{
int i;

for (i=0;i<16 && str[i]!=0;i++)  // 16 Character Print
{
lcd_write_ascii(str[i]); // Print Byte to LCD
}
}

/***********************/
/* Delay Time Function */
/*    1-4294967296     */
/***********************/
void delay(unsigned long int count1)
{
while(count1 > 0) {count1--;} // Loop Decrease Counter
}
บันทึกการเข้า
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8272


ShadowWares


| |
« ตอบ #4 เมื่อ: กุมภาพันธ์ 10, 2013, 06:35:45 pm »

อ้างถึง
ถ้า LCD ถูก Initialized

จะแสดงเป็นไงถึงจะรู้ครับ
ทั้งสองบรรทัดจะมีความเข้มเท่ากันครับ

อ้างถึง
ผมเซ็ตตามล่างนี้แล้วก็เหมือนเดิมนะ
จริงหรือ? งั้นขอถามว่า จาก
อ้างถึง
1).หากเป็นการเริ่มจ่ายไฟให้ LCD   เพื่อให้ LCD Internal Reset   
        ให้รออย่างน้อย 15ms       
ตรงไหนในโปรแกรมของคุณที่บอกว่ามันได้ทำสิ่งนี้แล้วจริง?

ข้ออื่นๆ ก็ถามตัวเองด้วยวิธีการเดียวกัน "สิ่งที่ Datasheet บอกมา โปรแกรมมันทำให้เกิดสิ่งนั้นได้แล้วหรือยัง?"
บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
secret07
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 11


| |
« ตอบ #5 เมื่อ: กุมภาพันธ์ 10, 2013, 11:08:54 pm »

ขอบคุณมากครับ ทำได้แระครับ
บันทึกการเข้า
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8272


ShadowWares


| |
« ตอบ #6 เมื่อ: กุมภาพันธ์ 11, 2013, 08:05:40 am »

ยอดเยี่ยมมากครับ  wink
บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
หน้า: [1]   ขึ้นบน
  พิมพ์  
 
กระโดดไป: