Thông báo

Collapse
No announcement yet.

Em có bài lập trình sau mong các huynh sửa giúp

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

  • Em có bài lập trình sau mong các huynh sửa giúp

    EM =m dùng codevision lập trình bài toán giao tiếp atmega32 với lcd 16x2 và keypad 4x4 mà khi check syntax thì không có lỗi nhưng nhấn shift+F9 thì báo lỗi sau em không biết sau:" Errors occur during asembly", em không biết bài viết của em đã đúng chưa và làm sao sửa lỗi đó. Mong các huynh sửa giúp em
    //lap trinh giao tiep Atmega32 voi LCD 16x2 va Keypad 4x4, khi bam nut se hien so tren LCD, nhan input doc gia tri tren LCD co chong doi phim

    #include<mega32.h>
    #include<lcd.h>
    #include<stdio.h>
    unsigned char k;
    int i;
    int m;
    char num[10];
    //================================================== ==================================================
    char chongdoi(void)
    {
    DDRB=0x0F; //nua byte thap ngo ra, nua byte cao ngo vao
    loinhan:;
    for (i=0;i<=50;i++) //kiem tra phim con duoc duy tri muc 0 kg trong 50 lan
    {
    if ((PINB&0xF0)==0xF0) goto loinhan; //neu co lan kg duy tri se kiem lai tu dau
    }
    k=PINB; // xong phan doi nhan luu lai gia tri hang va cot
    loinha:;
    while(1)
    {
    if ((PINB&0xF0)==0xF0) //doi den khi co tin hieu nha ra
    {
    for (i=0;i<=50;i++) //kiem tra phim da dc nha chua trong 50 lan
    {
    if ((PINB&0xF0)!=0xF0) goto loinha; //neu co lan kg duy tri nha se quay lai tu dau
    }
    break;
    }
    }
    return(k);
    }
    //================================================== ==================================================
    int giaima(void)
    {
    switch (k)
    {
    case 0b00010001:
    m=7;
    break;
    case 0b00010010:
    m=8;
    break;
    case 0b00010100:
    m=9;
    break;
    case 0b00100001:
    m=4;
    break;
    case 0b00100010:
    m=5;
    break;
    case 0b00100100:
    m=6;
    break;
    case 0b01000001:
    m=1;
    break;
    case 0b01000010:
    m=2;
    break;
    case 0b01000100:
    m=3;
    break;
    case 0b10000001:
    m=10; //nhan input
    break;
    case 0b10000010:
    m=11; //nhan clear
    break;
    }
    return(m);
    }

    //================================================== ==================================================
    int scan_key(void)
    {
    DDRB=0x0F; //nua byte thap ngo ra, nua byte cao ngo vao

    //================================================== ===========
    PORTB=0XFF;
    PORTB.0=0; // cho cot 1 bang 0 kiem tra cac hang
    if ((PINB&0xF0)!=0xF0) //co phim nhan trong hang mot 1
    {
    k=chongdoi();
    m=giaima();
    }
    //================================================== ===========
    PORTB=0XFF;
    PORTB.1=0;
    if ((PINB&0xF0)!=0xF0) //co phim nhan trong hang mot 2
    {
    k=chongdoi();
    m=giaima();
    }
    //================================================== ============
    PORTB=0XFF;
    PORTB.2=0;
    if ((PINB&0xF0)!=0xF0) //co phim nhan trong hang mot 3
    {
    k=chongdoi();
    m=giaima();
    }
    //================================================== =============
    PORTB=0XFF;
    PORTB.3=0;
    if ((PINB&0xF0)!=0xF0) //co phim nhan trong hang mot 4
    {
    k=chongdoi();
    m=giaima();
    }
    //================================================== ==============
    return(m);
    }
    //================================================== ==================================================
    void hienthi(void)
    {
    #asm
    .equ _lcd_port=0x18
    #endasm
    lcd_init(16);
    lcd_gotoxy(0,0);
    lcd_putsf("nhap tien");
    lcd_gotoxy(0,1);
    sprintf(num,"%d",m);
    lcd_puts(num);
    }
    //================================================== ================================================== =
    void main(void)
    {
    m=scan_key();
    if (m==10) //nhan input doc chan lcd vao sram va xu li tiep
    ;
    if (m==11)//nhan clear lcd quay ve dau
    ;
    hienthi();
    }

  • #2
    Nguyên văn bởi bijusi@ Xem bài viết
    #asm
    .equ _lcd_port=0x18
    #endasm
    }
    Bạn xem thử lại dòng code này nhé. Chỗ __lcd_port phải có 2 dấu gạch dưới(__).

    Thêm nữa, theo mình nghĩ thì bạn nên khai báo khối này lên trước #include<lcd.h>.

    Comment


    • #3
      ok dc rùi cám ơn anh rất nhiều, không biết anh có ý kiến gì về bài của em không, nó đúng yêu cầu không anh

      Comment


      • #4
        Nguyên văn bởi bijusi@ Xem bài viết
        ok dc rùi cám ơn anh rất nhiều, không biết anh có ý kiến gì về bài của em không, nó đúng yêu cầu không anh
        Híc! Bạn thông cảm, mình ngại ngồi dò code lắm.

        Comment


        • #5
          ah vậy anh cho em hỏi làm sao mình đọc dữ liệu từ lcd vào atmega được ạ?

          Comment


          • #6
            Nguyên văn bởi bijusi@ Xem bài viết
            ah vậy anh cho em hỏi làm sao mình đọc dữ liệu từ lcd vào atmega được ạ?
            Nếu bạn dùng CodeVisionAVR thì có hàm:

            unsigned char lcd_read_byte(unsigned char addr);

            Đọc một byte từ LCD.

            Comment


            • #7
              Ok đợi em làm xong bài này rồi em sẽ post lên cho mọi người xài, chứ tìm hoài chẳng có trên mạng chẳng ai thèm chia sẻ hết, làm xong xài ròi mà không cho người ta thật hoang phí!!!!

              Comment


              • #8
                Em chỉ mới học lập trình C trên Avr có 2 ngày mà viết dc nhiu đó!

                Comment


                • #9
                  Bác này nóng tính quá nhể?

                  Comment


                  • #10
                    huynh chỉ em sử dụng hàm lcd_read_byte với em đọc hàm em chẳng hiểu, em "gà" lắm có ví dụ trực quan em mới biết

                    Comment


                    • #11
                      Nguyên văn bởi bijusi@ Xem bài viết
                      huynh chỉ em sử dụng hàm lcd_read_byte với em đọc hàm em chẳng hiểu, em "gà" lắm có ví dụ trực quan em mới biết
                      Trong LCD có một thanh RAM để lưu trữ dữ liệu đẩy vào trước khi hiển thị. Tuỳ vào loại LCD, tuỳ hãng sản xuất mà cấu trúc của thanh RAM này có thể khác nhau.
                      Bạn muốn đọc dữ liệu từ LCD trước tiên nên tìm hiểu qua về thanh RAM này.
                      Còn về cấu trúc của lệnh trên: Bạn chỉ cần khai báo một biến kiểu Unsigned Char để lưu giá trị đọc được từ LCD, biến addr ở đây là địa chỉ của dữ liệu chứa trong thanh RAM của LCD. Mình ví dụ thử:

                      Unsigned Char bien;
                      bien=lcd_ready_byte(địa chỉ dữ liệu cần đọc);

                      Comment


                      • #12
                        em dùng atmega32 vậy thanh RAM đó là gì anh!!! giúp em cho trót

                        Comment


                        • #13
                          Nguyên văn bởi bijusi@ Xem bài viết
                          em dùng atmega32 vậy thanh RAM đó là gì anh!!! giúp em cho trót
                          Ặc ặc. Bạn không chịu đọc kĩ bài trả lời của mình! Ko phải là thanh RAM của AVR mà là thanh RAM của LCD cơ. Gọi là gì nhỉ, thanh ghi đệm thì phải!
                          Chịu khó đọc datasheet của lcd trước đã.

                          Comment


                          • #14
                            Trước đây khi viết bằng ASM cho 8051 mình cũng đã từng đọc giá trị từ LCD để kiểm tra cờ bận. Nhưng khi viết C cho AVR mình thường ko để ý đến việc này nữa nên không có code cho bạn. Nếu thấy dùng C khó thì có thể dùng ASM lẫn vào chương trình cũng được mà bạn?

                            Comment


                            • #15
                              Nguyên văn bởi bijusi@ Xem bài viết
                              em dùng atmega32 vậy thanh RAM đó là gì anh!!! giúp em cho trót
                              có lẽ bạn chưa đọc kỹ da ta sheet của LCD rồi, nhưng mà nếu bàn xài Codevision thì cũng ko khó lắm đâu, vì CodeVision sẽ tự sinh mã mà, hàm thì kcung cấp rất nhiều, bạn cố gắng đọc kỹ nhé. mình không biết bạn đọc da ta của LCD để làm gì, thông thường khi ta cần kiểm tra cờ bận mới sử dụng làm đọc này. bạn có thể nói rõ hơn là bạn muốn đọc vì mục đích gì, thì mọi người sẽ giúp bạn.
                              hãy cố gắng dù vướn phải thất bại!!!!!!!!

                              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