Thông báo

Collapse
No announcement yet.

Tập lập trình LCD 2x16 trên AVR vô đây!

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

  • #16
    Nguyên văn bởi thangktvta Xem bài viết
    Nếu dùng thư việc có sẵn của CV thì chúng ta chỉ có thể đấu LCD vào một Port cố định của LCD mà thôi. Và chúng ta cũng chẳng bao giờ hiểu được nguyên lý, hoạt động và cách điều khiển của LCD cả.
    Còn nếu dùng thư viện tự viết thì không nhất thiết phải nối LCD vào một PORT mà các chân điều khiển có thể nối vào các chân của PORT khác --> Linh hoạt hơn.
    Bác nói rất đúng.Thế mới là cái lợi của việc sài thư viện tự viết.Rất linh hoạt
    The goal of power electronics is control the flow of energy from an electrical source to an electrical load with high efficiency, high availability, high reliability, light weight and low cost.

    Comment


    • #17
      Đâu có, mình dùng port nào cho LCD cũng được mà! Bạn nói kg hiểu nguyên lý hoạt động là đúng nhưng tìm hiểu thì cũng ra, mình kg cần đi sâu về phần đó.

      Comment


      • #18
        Nguyên văn bởi bijusi@ Xem bài viết
        Đâu có, mình dùng port nào cho LCD cũng được mà! Bạn nói kg hiểu nguyên lý hoạt động là đúng nhưng tìm hiểu thì cũng ra, mình kg cần đi sâu về phần đó.
        Bác có thể dùng 4 chân data của PortA và 3 chân đều khiển của PortB được với thư viện CV được không?
        Làm như vậy giúp ta linh hoạt hơn trong thiết kế mạch khi chân cẳng hạn chế hay là một chân nhiều chức năng trong mạch!
        Chúc vui vẻ!
        Nỏ biết chữ mần răng ký được??!! Thôi nhé.

        Comment


        • #19
          Nguyên văn bởi bijusi@ Xem bài viết
          Đâu có, mình dùng port nào cho LCD cũng được mà! Bạn nói kg hiểu nguyên lý hoạt động là đúng nhưng tìm hiểu thì cũng ra, mình kg cần đi sâu về phần đó.
          Quan trọng là mình mục đích sử dụng thôi.
          The goal of power electronics is control the flow of energy from an electrical source to an electrical load with high efficiency, high availability, high reliability, light weight and low cost.

          Comment


          • #20
            Thông thường tôi dùng thẳng thư viện lcd trong codevision nhưng lắm lúc cũng phải dùng cái của mình như ở đây: http://dientuvietnam.net/forums/show...02&postcount=4


            Nguyên văn bởi Le Thi Bich Xem bài viết
            để hiển thị một giá trị data (adc_data) chẳng hạn em làm thế này:
            char lcd_buffer[33];
            unsigned int data0;
            data0=adc_data[0];
            sprintf(lcd_buffer,"Gia tri la: %d",data0);
            lcd_gotoxy(0,0);
            lcd_puts(lcd_buffer);
            delay_ms(50);
            lcd_clear();

            hôm trước anh VNarmy cho em em làm để hiện thị giá trị adc0 lên lcd chạy tốt lắm nhưng em chẳng hiểu j cả
            char lcd_buffer[33];để làm j?
            tại sao lại là [33]?
            sao em dùng đoạn code như thế này:
            lcd_gotoxy(0,0);
            lcd_puts(adc_data(0));
            delay_ms(50);
            lcd_clear();
            lại không chạy được nhỉ?
            các anh cùng bàn luận cho em vỡ!
            Nhiều bạn cứ nghĩ chả cần biết gì về C chuẩn nhưng vẫn có thể lập trình C dẫn đến cái lỗi như ở trên đây. Cái tham số của hàm lcd_puts là chuỗi (con trỏ *char) mà lại đút một tham số kiểu char hay int vào thì có mà chạy vào mắt.

            Lại nữa, một vài hàm của Codevision thực ra viết lại theo hàm C chuẩn ví dụ như cái sprintf ở trên chẳng hạn. Có thể dễ dàng tra cứu trong help của codevision để biết tính năng nhưng nếu kém tiếng Anh thì hoàn toàn có thể tra cứu thông tin từ một quyển dạy lập trình C tiếng Việt như cuốn của GS Phạm Văn Ất chẳng hạn.
            Last edited by VNarmy; 20-11-2008, 16:59.
            AVR đã quay trở lại: ATMEGA32: 66k, ATMEGA8A: 30k, ATMEGA48: 30k.
            Xem thêm tại Online Store ---> Click here
            Mob: 0982.083.106

            Comment


            • #21
              Mới tìm hiểu và không có thời gian thì dùng sẵn thư viện của CVAVR là tiện nhất. Nhưng đã dùng nhiều rồi và muốn tuỳ biến theo ứng dụng thì thế nào chả phải lập thư viện riêng.
              Chịu khó xem lại đoạn mã CVAVR viết cho LCD mình thấy nhiều cái hay lắm. Bữa nào rảnh sẽ viết bài cùng chia sẻ.
              !e

              Comment


              • #22
                Nguyên văn bởi VNarmy Xem bài viết
                Thông thường tôi dùng thẳng thư viện lcd trong codevision nhưng lắm lúc cũng phải dùng cái của mình như ở đây: http://dientuvietnam.net/forums/show...02&postcount=4




                Nhiều bạn cứ nghĩ chả cần biết gì về C chuẩn nhưng vẫn có thể lập trình C dẫn đến cái lỗi như ở trên đây. Cái tham số của hàm lcd_puts là chuỗi (con trỏ *char) mà lại đút một tham số kiểu char hay int vào thì có mà chạy vào mắt.

                Lại nữa, một vài hàm của Codevision thực ra viết lại theo hàm C chuẩn ví dụ như cái sprintf ở trên chẳng hạn. Có thể dễ dàng tra cứu trong help của codevision để biết tính năng nhưng nếu kém tiếng Anh thì hoàn toàn có thể tra cứu thông tin từ một quyển dạy lập trình C tiếng Việt như cuốn của GS Phạm Văn Ất chẳng hạn.
                anh VNarmy nóng tính thế, anh có vợ chưa đấy ạ?
                giá em có thật nhiều thời jan để được nghiên cứu và học hỏi các anh thì tốt biết mấy. ngày nào xếp em cũng giao cho đủ mọi chuyện, ngày xua đi học thì còn chăm bây giờ khó quá cứ làm việc bí ở đâu lại lên diễn đàn hỏi các anh chỉ bảo kinh nghiệm tích lũy dần dần anh ạ.
                bớt nóng anh nhé
                Thiết kế chế tạo các loại máy xoáy nắp, chiết rót định lượng dùng trong dược phẩm và thực phẩm.

                Comment


                • #23
                  Nguyên văn bởi Le Thi Bich Xem bài viết
                  anh VNarmy nóng tính thế, anh có vợ chưa đấy ạ?
                  giá em có thật nhiều thời jan để được nghiên cứu và học hỏi các anh thì tốt biết mấy. ngày nào xếp em cũng giao cho đủ mọi chuyện, ngày xua đi học thì còn chăm bây giờ khó quá cứ làm việc bí ở đâu lại lên diễn đàn hỏi các anh chỉ bảo kinh nghiệm tích lũy dần dần anh ạ.
                  bớt nóng anh nhé
                  Anh VNarmy nói vậy để mọi người quan tâm hơn đến việc học lập trình C chuẩn thôi mà
                  The goal of power electronics is control the flow of energy from an electrical source to an electrical load with high efficiency, high availability, high reliability, light weight and low cost.

                  Comment


                  • #24
                    Có bác nào biết lập trinh tạo dòng chữ quận hiển thị trên LCD không? Em mới học vi điều khiển AVR lập trình bằng ngôn ngữ Codevision rất mong các bác giúp đỡ.

                    Comment


                    • #25
                      Tôi có viết 1 đoạn code để hiển thị giá trị 1 biến ra LCD:
                      #include <mega8.h>
                      #include <stdio.h>
                      #include <lcd.h>
                      ...
                      char buffer[20];
                      long f=123456;
                      sprintf(buffer," f=%6f Hz \n",f);
                      lcd_gotoxy(0,0);
                      lcd_puts(buffer);
                      ...
                      Lý ra ở LCD sẽ hiện ra: f=123456Hz . Nhưng nó chỉ hiện: f= Hz
                      Lỗi ở đâu tôi tìm chưa ra, các bác chỉ giúp. Tôi dùng CodeVision 2.3.9, rồi dùng 1.24.6...thử lại đều không được...

                      Comment


                      • #26
                        Tôi sợ do chưa biết sử dụng hàm sprintf(), nên viết kiểu khác:
                        ...
                        char num[]={"0","1",....,"9"};
                        for(i=0;i<10;i++)
                        { buffer[i]=num[f%10]; //Lấy số lẻ thứ 1
                        f=f/10; //bỏ số lẻ...
                        }
                        lcd_puts(buffer); //Đưa kết quả ra LCD
                        ...

                        Dùng CV 2.3.9 thì nó báo lỗi ở khai báo mảng num[]... missing '}' - mà có thiếu đâu
                        Dùng CV 1.24.6 thì không báo lỗi gì nhưng chạy thì LCD trống trơn. Không hiển thị nên chưa làm ra cái gì...
                        Nhờ các bác giúp...

                        Comment


                        • #27
                          Có bác nào lập trình LCD bằng asm chỉ giúp em với ,em viết 1 đoạn chương trình hiện thị dòng chữ " DHBKHN k51' nhưng ko thấy ji??.đây là đoạn code của em
                          ;*************************************************
                          ; LCD module 8bit
                          ;Nguyen thanh khiem
                          ;DBO-PC0
                          ;DB1-PC1
                          ;..............
                          ;DB7-PC7
                          ;RS-PD7
                          ;R/W-PD6
                          ;ENABLE-PD5
                          ;*************************************************
                          .include "8535def.inc"
                          ;=================================================
                          ; Khai bao bien ,cac hang so
                          .def temp =R16
                          ;=================================================
                          ;Khai bao ngat
                          .CSEG
                          .ORG 0x00
                          Rjmp Reset
                          ;=================================================
                          Reset:
                          ; initial Stack
                          LDI temp,high(RAMEND)
                          OUT SPH,temp
                          LDI temp,low(RAMEND)
                          OUT SPL,temp
                          SER temp
                          OUT DDRC, temp ;PortC out put
                          OUT DDRD, temp
                          SBI DDRD,7 ;PortD.7 out put
                          SBI DDRD,6 ;PortD.7 out put
                          ; SBI DDRD,5 ;PortD.7 out put
                          ;================================================= =======
                          LCDinit:
                          LDI temp,0X38 ; LCD 2 DONG MATRAN 5X7
                          RCALL COMMAND
                          LDI temp,0X01
                          RCALL COMMAND
                          LDI temp,0X0F ;bat hien thi con tro nhap nhay
                          RCALL COMMAND
                          LDI temp,0X06
                          RCALL COMMAND
                          LDI temp,'B' ;
                          RCALL DATA_DISPLAY
                          LDI temp,'K' ;
                          RCALL DATA_DISPLAY
                          LDI temp,'H' ;
                          RCALL DATA_DISPLAY
                          LDI temp,'N' ;
                          RCALL DATA_DISPLAY
                          LDI temp,'K' ;
                          RCALL DATA_DISPLAY
                          LDI temp,'5' ;
                          RCALL DATA_DISPLAY
                          LDI temp,'1' ;
                          RCALL DATA_DISPLAY
                          HERE:
                          RJMP HERE
                          ;================================================= =======
                          ; CHUONG TRINH CON XUAT LENH
                          COMMAND:
                          RCALL Check_BF
                          ; OUT PortC,temp
                          CBI PortD,7 ;RS=0 XUAT LENH
                          CBI PortD,6 ;R/W =0 GHI DU LIEU
                          OUT PortC,temp
                          SBI PortD,5 ;ENEBLE =1 XUNG CAO XUONG THAP
                          CBI PortD,5 ;ENABLE =0 CHOT DU LIEU
                          RET
                          ;================================================= =========
                          ;CHUONG TRINH CON XUAT DU LIEU
                          DATA_DISPLAY:
                          RCALL Check_BF
                          ; OUT PortC,temp ;
                          SBI PortD,7; RS=1 XUAT DU LIEU
                          CBI PortD,6 ;R/W =0 GHI DU LIEU
                          OUT PortC,temp
                          SBI PortD,5 ;ENEBLE =1 XUNG CAO XUONG THAP
                          CBI PortD,5 ;ENABLE =0 CHOT DU LIEU
                          RET
                          ;================================================= ========
                          ; KIEM TRA CO BAN
                          Check_BF:
                          CBI DDRC,7 ; PortC,7 as input
                          CBI PortD,7 ; RS =0
                          SBI PortD,6 ;R/W=1
                          ; SBI DDRD,5 ;PortD.5 as output
                          ; DOC TRANG THAI THANH GHI LENH
                          BACK:
                          CBI PortD,5 ;ENABLE =0 CHOT DU LIEU
                          SBI PortD,5
                          ; CBI PortD,5
                          SBIC PortD,7
                          RJMP BACK
                          RET
                          ;================================================= ===

                          Comment


                          • #28
                            Check hộ lỗi hiển thị lên LCD

                            Các bác check hộ em lỗi hiển thị lên LCD chữ "Hello!" với .Sao bài đơn giản thế mà em làm mãi mà không biết sai ở đâu.Khi chạy mô phỏng trên Proteus thì toàn báo Watchdog setup sequence is timed out.Do nothing. Thậm chí em copy Code của một bác rồi mô phỏng như bác ây mà vẫn lỗi . Lỗi này là lỗi gì vậy ạ?

                            Code của em đây ạ:

                            /************************************************** ***
                            This program was produced by the
                            CodeWizardAVR V2.03.4 Standard
                            Automatic Program Generator
                            © Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
                            http://www.hpinfotech.com

                            Project :
                            Version :
                            Date : 3/20/2010
                            Author :
                            Company :
                            Comments:


                            Chip type : ATmega16
                            Program type : Application
                            Clock frequency : 8.000000 MHz
                            Memory model : Small
                            External RAM size : 0
                            Data Stack size : 256
                            ************************************************** ***/

                            #include <mega16.h>

                            // Alphanumeric LCD Module functions
                            #asm
                            .equ __lcd_port=0x12 ;PORTD
                            #endasm
                            #include <lcd.h>

                            // Declare your global variables here

                            void main(void)
                            {
                            // Declare your local variables here

                            // Input/Output Ports initialization
                            // Port A initialization
                            // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
                            // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
                            PORTA=0x00;
                            DDRA=0x00;

                            // Port B initialization
                            // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
                            // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
                            PORTB=0x00;
                            DDRB=0x00;

                            // Port C initialization
                            // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
                            // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
                            PORTC=0x00;
                            DDRC=0x00;

                            // Port D initialization
                            // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
                            // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
                            PORTD=0x00;
                            DDRD=0x00;

                            // Timer/Counter 0 initialization
                            // Clock source: System Clock
                            // Clock value: Timer 0 Stopped
                            // Mode: Normal top=FFh
                            // OC0 output: Disconnected
                            TCCR0=0x00;
                            TCNT0=0x00;
                            OCR0=0x00;

                            // Timer/Counter 1 initialization
                            // Clock source: System Clock
                            // Clock value: Timer 1 Stopped
                            // Mode: Normal top=FFFFh
                            // OC1A output: Discon.
                            // OC1B output: Discon.
                            // Noise Canceler: Off
                            // Input Capture on Falling Edge
                            // Timer 1 Overflow Interrupt: Off
                            // Input Capture Interrupt: Off
                            // Compare A Match Interrupt: Off
                            // Compare B Match Interrupt: Off
                            TCCR1A=0x00;
                            TCCR1B=0x00;
                            TCNT1H=0x00;
                            TCNT1L=0x00;
                            ICR1H=0x00;
                            ICR1L=0x00;
                            OCR1AH=0x00;
                            OCR1AL=0x00;
                            OCR1BH=0x00;
                            OCR1BL=0x00;

                            // Timer/Counter 2 initialization
                            // Clock source: System Clock
                            // Clock value: Timer 2 Stopped
                            // Mode: Normal top=FFh
                            // OC2 output: Disconnected
                            ASSR=0x00;
                            TCCR2=0x00;
                            TCNT2=0x00;
                            OCR2=0x00;

                            // External Interrupt(s) initialization
                            // INT0: Off
                            // INT1: Off
                            // INT2: Off
                            MCUCR=0x00;
                            MCUCSR=0x00;

                            // Timer(s)/Counter(s) Interrupt(s) initialization
                            TIMSK=0x00;

                            // Analog Comparator initialization
                            // Analog Comparator: Off
                            // Analog Comparator Input Capture by Timer/Counter 1: Off
                            ACSR=0x80;
                            SFIOR=0x00;

                            // LCD module initialization
                            lcd_init(16);
                            lcd_gotoxy(0,0);
                            lcd_putsf("Hello!");
                            while (1)
                            {
                            // Place your code here

                            };
                            }
                            File mô phỏng đây :
                            Link Mediafire
                            Không hiểu sao em dùng chức năng đính kèm file của diễn đàn ko đc

                            Đây là Code + mô phỏng của một bác mà em chỉ copy & paste --> dịch rồi mô phỏng như bác ấy mà vẫn lỗi như trên
                            .
                            Các bác check hộ cho.Em nghĩ nó dễ mà không làm đc thì cay cú tự xử mất mấy ngày nay rồi.Nay thì phải hỏi vậy.Cảm ơn các bác nhiều,

                            Comment


                            • #29
                              Mình chạy thử vẫn OK mà. Bạn cài Proteus bản khác xem.

                              Comment


                              • #30
                                Mình đang có bài hiển thị 2 từ " Hello World" trên LCD, mình làm trên 8bit thì ok, nhưng khi làm trên 4bit thi ko làm duoc, . Mong mọi ngưoi giúp mình.
                                Dứoi đây là code cho 8bit (chạy ok) nhưng khi chuyển sang 4 bit thi ko chạy duoc.
                                #include <avr/io.h>
                                #include <avr/interrupt.h>
                                #include <avr/pgmspace.h>
                                #define F_CPU 12000000UL /* CPU frequency, required for delay library */
                                #include <util/delay.h>
                                #include <string.h>
                                #include <usbdrv/main.h>

                                /*======================================
                                Atmega32 to LCD
                                ======================================
                                PB7 -> D7
                                PB6 -> D6
                                PB5 -> D5
                                PB4 -> D4
                                PB3 -> D3
                                PB2 -> D2
                                PB1 -> D1
                                PB0 -> D0

                                PC2 -> RS
                                PC1 -> RW
                                PC0 -> E
                                ======================================*/

                                // Function prototype
                                void init8LCD(void);
                                void ePulse(void);
                                void send8Cmd(unsigned char);
                                void send8Char(unsigned char);
                                void send8String(unsigned char[]);
                                void goto8LCD(unsigned char line, unsigned char position);

                                //=============== SYSTEM hooks, leave and ignore =================================

                                void user_system_500us_interrupt()
                                {}

                                void user_command( uint8_t* get_ctrl, uint16_t* get_addr, uint16_t* val)
                                {}

                                //============== Executive Loop ==================================================

                                void user_forever_loop()
                                {//--- User initializations.

                                init8LCD(); // Initialise LCD

                                goto8LCD(1, 6);
                                send8String("Hello\nWorld");

                                while(1)
                                {//--- put your tasks here.

                                }

                                }

                                void init8LCD(void)
                                {
                                DDRB = 0b11111111; // Set PORTB to be output
                                DDRC = 0b11111111; // Set PORTC to be output
                                PORTB = 0;
                                PORTC = 0;

                                send8Cmd(0b00111000); // 2 lines, 5x7 char size
                                send8Cmd(0b00001100); // display on, cursor off, blink off
                                }

                                void ePulse(void)
                                {
                                // E = 0
                                PORTC = PORTC & 0b11111110;

                                _delay_us(1);

                                // E = 1
                                PORTC = PORTC | 0b00000001;

                                _delay_us(1);

                                // E = 0
                                PORTC = PORTC & 0b11111110;
                                }

                                void send8Cmd(unsigned char command)
                                {
                                // Wait
                                _delay_us(40);

                                // RS=0, RW=0 and E=0
                                PORTC = PORTC & 0b11111000;

                                // Send command to PORTB
                                PORTB = command;

                                // Pulse E
                                ePulse();

                                // Wait
                                _delay_us(40);

                                // RS=0, RW=0 and E=0
                                PORTC = PORTC & 0b11111000;
                                }

                                void send8Char(unsigned char character)
                                {
                                // Wait
                                _delay_us(40);

                                // RS=0, RW=0 and E=0
                                PORTC = PORTC & 0b11111000;

                                // Set RS = 1
                                PORTC = PORTC | 0b00000100;

                                // Send letter to PORTB
                                PORTB = character;

                                // Pulse E
                                ePulse();

                                // Wait
                                _delay_us(40);

                                // RS=0, RW=0 and E=0
                                PORTC = PORTC & 0b11111000;
                                }

                                void send8String(unsigned char str[])
                                {
                                unsigned char i;
                                unsigned char length;

                                length = (unsigned char) strlen(str);

                                for (i=0; i<length; i++)
                                {
                                if (str[i] == '\n')
                                goto8LCD(2, 4);
                                else
                                send8Char(str[i]);
                                }
                                }

                                void goto8LCD(unsigned char line, unsigned char position)
                                {
                                if (line == 1)
                                {
                                send8Cmd(0x80 + position - 1);
                                }
                                else if (line == 2)
                                {
                                send8Cmd(0xc0 + position - 1);
                                }
                                }

                                Comment

                                Về tác giả

                                Collapse

                                bijusi@ Tìm hiểu thêm về bijusi@

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

                                Collapse

                                Đang tải...
                                X