Thông báo

Collapse
No announcement yet.

Đếm từ 0000 đến 9999 dùng LCD16x2 và AVR8 ?

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

  • Đếm từ 0000 đến 9999 dùng LCD16x2 và AVR8 ?

    - Chào các Bạn. Mình đang tự học AVR viết bằng C nên gặp không ít khó khăn. Mong các Bạn giúp đỡ.
    - Mình muốn làm bộ đếm từ 0000 đến 9999 dùng LCD16x2 và AVR8. Khi nhấn 1 phím D0 thì LCD hiển thị giá trị từ 0000 lên 00001 và cứ như vậy cho đến 9999. LCD mình dùng Port B.
    Attached Files

  • #2
    Cụ thể anh gặp khó khăn j?
    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


    • #3
      bạn dùng codevison sẽ rất nhanh và tiết kiệm thời gian . Còn ASM thì khá phức tạp nếu bạn là người mới thì nên học asm ( đề quen cách suy nghĩ , lập trình ) . Còn nếu không gắn bó lâu với vi điều khiển thì bạn học Codevision cũng dc . Mổi ngôn ngữ có ưu nhược điềm riêng.
      Mạch nạp Little Programmer
      MSC-51,AVR,EEPROM ... etc

      Site Fukusei shop :

      Comment


      • #4
        Nguyên văn bởi lackiuvn Xem bài viết
        - Chào các Bạn. Mình đang tự học AVR viết bằng C nên gặp không ít khó khăn. Mong các Bạn giúp đỡ.
        - Mình muốn làm bộ đếm từ 0000 đến 9999 dùng LCD16x2 và AVR8. Khi nhấn 1 phím D0 thì LCD hiển thị giá trị từ 0000 lên 00001 và cứ như vậy cho đến 9999. LCD mình dùng Port B.
        Chương trình này dùng codevisionC rất đơn giản đây là chương trình đếm từ 000 đến 256 còn từ 0000 đến 9999 bạn tự làm nhé rất dễ mà


        #include <mega8.h>

        // Alphanumeric LCD Module functions
        #asm
        .equ __lcd_port=0x18 ;PORTB
        #endasm
        #include <lcd.h>
        #include<delay.h>
        // Declare your global variables here
        void lcd_putnum(unsigned char so,unsigned char x,unsigned char y)
        {
        unsigned char a,b,c;
        a=so/100;
        // lay fan tram
        b=(so-100*a)/10;
        // lay fan chuc
        c=(so-100*a-10*b);
        // lay hang don vi
        lcd_gotoxy(x,y);
        // ve vi tri x,y
        lcd_putchar(a+48);
        // day ra hang tram, ma ascii
        lcd_putchar(b+48);
        // day ra hang chuc, ma ascii
        lcd_putchar(c+48);
        // day ra hang don vi, ma ascii
        }

        void main(void)
        {
        unsigned char i;
        PORTB=0xFF;
        DDRB=0xFF;
        PORTD=0xFF;
        DDRD=0x00;

        // LCD module initialization
        lcd_init(16);

        while (1)
        {
        if(PIND.0==0)
        {
        for(i=0;i<1000;i++)
        {
        lcd_putnum(i,0,0);
        delay_ms(50);
        }
        };
        if (PIND.1==0)
        lcd_clear();
        };
        }

        Comment


        • #5
          Chỉnh sửa chút từ code của huetkiem để khi nhấn PORTD.0 sẽ đếm 1 đơn vị. Đã test chạy ngon bạn thử xem sao:
          #include <mega8.h>

          // Alphanumeric LCD Module functions
          #asm
          .equ __lcd_port=0x18 ;PORTB
          #endasm
          #include <lcd.h>
          #include<delay.h>
          // Declare your global variables here
          void lcd_putnum(unsigned char so,unsigned char x,unsigned char y)
          {
          unsigned char a,b,c;
          a=so/100;
          // lay fan tram
          b=(so-100*a)/10;
          // lay fan chuc
          c=(so-100*a-10*b);
          // lay hang don vi
          lcd_gotoxy(x,y);
          // ve vi tri x,y
          lcd_putsf("Number:");
          lcd_putchar(a+48);
          // day ra hang tram, ma ascii
          lcd_putchar(b+48);
          // day ra hang chuc, ma ascii
          lcd_putchar(c+48);
          // day ra hang don vi, ma ascii
          }

          void main(void)
          {
          int m = 0;
          unsigned char i;
          PORTB=0xFF;
          DDRB=0xFF;
          PORTD=0xFF;
          DDRD=0x00;

          // LCD module initialization
          lcd_init(16);

          while (1)
          {
          if(PIND.0==0 & m ==0)
          {
          ++i;
          m=1;
          if ( i>999) i = 0;
          lcd_putnum(i,0,0);
          delay_ms(50);

          }
          if (PIND.0 == 1) m=0;
          };
          if (PIND.1==0)
          lcd_clear();

          }

          Comment


          • #6
            bạn có thẻ dùng lun mấy hàm trong thư vien stdlib.h của cv,nó đã tạo sẵn cho chúng ta rùi.ví dung như hàm
            void itoa(int n, char *str),áp dụng cho bài của bạn.
            và nên dùng trễ để khi bấn một phím trong khoảng 0.1s thì mới nhận định là nó có tác động,còn nếu phím đó nhỏ hơn khoảng thời gian đó mà phím đó đã nhả ra thì coi nó là nhiễu và bỏ qua.
            hãy quý những j hiện tại mình đang có

            Comment


            • #7
              Nguyên văn bởi sirdanhvt Xem bài viết
              Chỉnh sửa chút từ code của huetkiem để khi nhấn PORTD.0 sẽ đếm 1 đơn vị. Đã test chạy ngon bạn thử xem sao:
              Bác ơi em muốn xuất ra led 7 thanh thì phải làm sao ạh, rất mong được chỉ giáo.

              Comment


              • #8
                mình đang học asm hiển thị từ 0 đến 9999 lên LCD có ai chỉ dùm mình với

                Comment


                • #9
                  bác nào có code asm của chương trình này cho mình xin vs ,

                  Comment

                  Về tác giả

                  Collapse

                  lackiuvn Tìm hiểu thêm về lackiuvn

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

                  Collapse

                  Đang tải...
                  X