toilet

Giao tiếp LCD 16x2 trên KIT NUC220 của Nuvoton

Thảo luận trong 'Thùng Rác - Recyle Bin'

Đang xem chủ đề này ( Thành viên: 0, Khách: 0)

  1. Đăng 11/6/14 #1

    xaxa9ztb Kỹ sư

    Số bài viết: 207
    Đã được thích: 195
    Giao tiếp với LCD 16x2 có hai chế độ 4 bit và 8 bit.
    Chi tiết về LCD 16x2 thì các bác xem trên diễn đàn, có nhiều bài nói rất kĩ rồi
    Bài này mình viết theo chế độ 4bit giao tiếp GPIO của NUC220.
    Schematic
    Screenshot - 7_17_2014 , 6_48_33 PM.
    Thư viện lcd

    Mã:
    
    #include <stdio.h>
    #include <string.h>
    #include "NUC200Series.h"
    #include "GPIO.h"
    #include "SYS.h"
    #ifndef _LCD_H
    #define _LCD_H
    #define CONTROL_PORT PE
    #define DATA_PORT PA
    #define RS_pin 15
    #define RW_pin 14
    #define E_pin 13
    #define D4_pin 0
    #define D5_pin 1
    #define D6_pin 2
    #define D7_pin 3
    #define LCD_RS_ON() PE15 = 1
    #define LCD_RS_OFF() PE15 = 0
    #define LCD_RW_ON() PE14 = 1 
    #define LCD_RW_OFF() PE14 = 0
    #define LCD_EN_ON()  PE13 = 1 
    #define LCD_EN_OFF()  PE13 = 0
    #define LCD_D4_ON() PA0 = 1
    #define LCD_D4_OFF() PA0 =0
    #define LCD_D5_ON() PA1 = 1
    #define LCD_D5_OFF() PA1 =0
    #define LCD_D6_ON() PA2 = 1
    #define LCD_D6_OFF() PA2 = 0
    #define LCD_D7_ON() PA3 =1
    #define LCD_D7_OFF() PA3 =0
    /************************************
                         *    define some LCD command value        *
                         ************************************/
                        #define DoubleLine_4bits            0x28
                        #define LCD_OFF                                0x08
                        #define LCD_ON                                0x0C
                        #define LCD_ON_Cursor                    0x0E
                        #define    LCD_ON_CursorBlink        0x0f
                        #define LCD_line1                         0x00
                        #define LCD_line2                         0x40
                        #define LCD_line3                         0x14
                        #define LCD_line4                         0x54
                        #define LCD_Normal                        0x06
                        #define    LCD_BusyTime                    400
    
    /*****************************************************/
                        void LCD_Delay_ms(uint32_t time)
                        {
                                    while (time--)
                                    {
                                      SYS_SysTickDelay(1000);
                                     }
                        }
                        //***************************************/
                        void LCD_Delay_us(uint32_t time){
                                SYS_SysTickDelay(time);
                        }
    void LCD_PULSE()
    {
        LCD_EN_ON();
        LCD_Delay_us(1);
        LCD_EN_OFF();
    }
    
    
                        void LCD_PutCmd ( unsigned char cx )
                        {
    
                        //RS and RW is low
                            LCD_RS_OFF();
                            LCD_RW_OFF();
    
                        //high nible
                            if( cx & 0x80) LCD_D7_ON();
                            else    LCD_D7_OFF();
    
                            if( cx & 0x40) LCD_D6_ON();
                            else    LCD_D6_OFF();
    
                            if( cx & 0x20) LCD_D5_ON();
                            else    LCD_D5_OFF();
    
                            if( cx & 0x10) LCD_D4_ON();
                            else    LCD_D4_OFF();
                        //pulse
                            LCD_PULSE();
    
                        //Low nible
                            if( cx & 0x08) LCD_D7_ON();
                            else    LCD_D7_OFF();
    
                            if( cx & 0x04) LCD_D6_ON();
                            else    LCD_D6_OFF();
    
                            if( cx & 0x02) LCD_D5_ON();
                            else    LCD_D5_OFF();
    
                            if( cx & 0x01) LCD_D4_ON();
                            else    LCD_D4_OFF();
                        //pulse
                            LCD_PULSE();
                            LCD_Delay_us(LCD_BusyTime);
                        }
                        //**********************di chuyen den 1 vi tri**********************************
                        void LCD_GotoXY(unsigned char row,unsigned char col)
                        {
                            uint8_t  address;
                                if(!row)
                                    address = (0x80+col);
                                else
                                    address = (0xC0+col);
                                LCD_Delay_ms(1);
                                LCD_PutCmd(address);
                                LCD_Delay_ms(5);
    
                        }
                        //*********************xoa lcd***********************************
                        void LCD_Clear(){
                            LCD_PutCmd(0x01);
                            LCD_PutCmd(LCD_Normal);
                            LCD_PutCmd(LCD_ON);
                            LCD_GotoXY(1,1);
                        }
    /*******************khoi tao lcd**************/
                        void LCD_Init(void)
                        {
    
                          _GPIO_SET_PIN_MODE(CONTROL_PORT,(RS_pin|RW_pin|E_pin),GPIO_PMD_OUTPUT);
                          _GPIO_SET_PIN_MODE(DATA_PORT,(D4_pin|D5_pin|D6_pin|D7_pin),GPIO_PMD_OUTPUT);
                        //
                            LCD_EN_OFF();
                            LCD_RW_OFF();
                            LCD_RS_OFF();
                            LCD_D4_OFF();
                            LCD_D5_OFF();
                            LCD_D6_OFF();
                            LCD_D7_OFF();
    
                        //******finish initial IO pin. Now Init LCD
    
                        //03.wait for LCD_Power Stable
                            LCD_Delay_ms(50);
    
                        //04.LCD 4bit interface init routine
                        //data port is 0x3~H , and RS,EN,RW hold at low level
    
                            LCD_RS_OFF();
                            LCD_RW_OFF();
                            LCD_D4_ON();
                            LCD_D5_ON();
    
                        //pulse1
                                LCD_PULSE();
                                LCD_Delay_ms(6);
                        //pulse2
                                LCD_PULSE();
                                LCD_Delay_us(LCD_BusyTime);
                        //pulse3
                             LCD_PULSE();
                                LCD_Delay_us(LCD_BusyTime);
    
                        //Init LCD 4bit Interface (0x2~)
                                LCD_D4_OFF();
                                LCD_D5_ON();
                                LCD_D6_OFF();
                             LCD_D7_OFF();
                        //pulse
                             LCD_PULSE();
                                LCD_Delay_us(LCD_BusyTime);
    
                        //init mode 4bit 2line
                            LCD_PutCmd(DoubleLine_4bits);
                          LCD_PutCmd(LCD_Normal);
                            LCD_PutCmd(LCD_ON);
                            LCD_Clear();
                        }
                        /******************in 1 ky  tu ra man hinh*************************/
                        void LCD_PutC(unsigned char cx ){
    
                        //RS is high and RW is low
                          LCD_RS_ON();
                          LCD_RW_OFF();
    
                       //high nible
                          if( cx & 0x80) LCD_D7_ON();
                          else    LCD_D7_OFF();
    
                          if( cx & 0x40) LCD_D6_ON();
                          else    LCD_D6_OFF();
    
                          if( cx & 0x20) LCD_D5_ON();
                          else    LCD_D5_OFF();
    
                          if( cx & 0x10) LCD_D4_ON();
                          else    LCD_D4_OFF();
                       //pulse
                          LCD_PULSE();
                       //Low nible
                          if( cx & 0x08) LCD_D7_ON();
                          else    LCD_D7_OFF();
    
                          if( cx & 0x04) LCD_D6_ON();
                          else    LCD_D6_OFF();
    
                          if( cx & 0x02) LCD_D5_ON();
                          else    LCD_D5_OFF();
    
                          if( cx & 0x01) LCD_D4_ON();
                          else    LCD_D4_OFF();
                       //pulse
                          LCD_PULSE();
                          LCD_Delay_us(LCD_BusyTime);
                       }
                       //***********************************************************
                       void LCD_PutS(unsigned char * str)
                       {
                          unsigned int i=0;
                              while ( *(str+i) !=0)
                              {
                                  LCD_PutC(*(str+i));
                                  i++;
                              }
                       }
                       /**************in  1 so co do dai toi da 10 ki tu*****************/
                       void LCD_PutInt(int val,unsigned int field_length)
                       {
                       
                      
                          char str[10]={0,0,0,0,0,0,0,0,0,0};
                              int i=9,j=0;
                              while(val)
                              {
                              str[i]=val%10;
                              val=val/10;
                              i--;
                              }
                              if(field_length==-1)
                                  while(str[j]==0) j++;
                              else
                                  j=10-field_length;
    
                              if(val<0) LCD_PutC('-');
                              for(i=j;i<10;i++)
                              {
                              LCD_PutC(48+str[i]);
                              }
                       }
                       #endif
    
    
    Video
    chandiendaotruongpro thích bài này.
    #1
  2. Đăng 12/6/14 #2

    thangbt Học sinh phổ thông

    Số bài viết: 2
    Đã được thích: 0
    cái này hay đấy!
    #2
  3. Đăng 12/6/14 #3

    xaxa9ztb Kỹ sư

    Số bài viết: 207
    Đã được thích: 195
    kimtinh mình screenshot từ thư viện chuẩn. mấy con nuvoton khác đời nhau thì cú pháp trong thư viện chuẩn nó lại khai báo khác 1 chút.
    Screenshot - 6_12_2014 , 1_27_50 PM.
    kimtinh thích bài này.
    #3
  4. Đăng 12/6/14 #4

    kimtinh Sinh viên cao đẳng

    Số bài viết: 20
    Đã được thích: 34
    Dòng này hay đấy ... Cú pháp như này thì tiện cho mình sử dụng... Mình cũng đang tìm xây dựng thư viên LCD cho dòng Nano100 nhưng mình muốn giao tiếp chế độ 4bit và các chân mình có thể kết nối với chip là bất kỳ IO nào có thể khong nhất thiết cùng 1 cổng khi dùng chỉ khai báo lại 7 chân với LCD. Để tiện cho việc tận dụng các IO khi làm mạch. Có gì bạn chỉ bảo thêm xaxa9ztb
    BQT: Lần sau bạn còn viết không dấu thì Delete forever.
    #4
  5. Đăng 12/6/14 #5

    daotruongpro http://vtechpro.vn

    Số bài viết: 386
    Đã được thích: 502
    Chú Test chạy ngọn chưa :)
    xaxa9ztb thích bài này.
    #5
  6. Đăng 12/6/14 #6

    xaxa9ztb Kỹ sư

    Số bài viết: 207
    Đã được thích: 195
    nó cũng có nhược điểm là khi bên hãng ngta xây dựng thư viện chung họ không thống nhất cú pháp cho tất cả các dòng với nhau nên muốn tìm hiểu của nhau lại mất công đọc lại một chút
    kimtinh thích bài này.
    #6
  7. Đăng 12/6/14 #7

    xaxa9ztb Kỹ sư

    Số bài viết: 207
    Đã được thích: 195
    sắp ngon a ơi :D
    daotruongpro thích bài này.
    #7
  8. Đăng 13/6/14 #8

    daotruongpro http://vtechpro.vn

    Số bài viết: 386
    Đã được thích: 502
    Việc hãng xây dựng thư viện như vậy cũng hơi khó sử dụng, để mình thử góp ý với hãng xem sao :)
    kimtinhxaxa9ztb thích bài này.
    #8
  9. Đăng 17/7/14 #9

    xaxa9ztb Kỹ sư

    Số bài viết: 207
    Đã được thích: 195
    update...
    #9
  10. Đăng 19/11/14 #10

    Bac Lee Học sinh phổ thông

    Số bài viết: 4
    Đã được thích: 4
    Em cũng đang bắt đầu học về dòng NU140 . Các anh có thể hướng dẫn tạo thư viện lcd cho em được không ạ. Anh nào có rồi thì share luôn thì tốt quá. Em cám ơn ạ :)
    #10

Chia sẻ trang này