Thông báo

Collapse
No announcement yet.

ATMega64 với LCD

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

  • ATMega64 với LCD

    Các bạn giúp dùm,
    Củng lưu đồ đó, viết cho 89c52 thì chạy chạy trơn tru (ASM)
    nhưng khi viết cho Mega64 thì bị chặn khi đọc cờ bận (busy), không qua được.
    Chu kỳ máy 1MHz ~ 89c (12Mhz), thử thêm nop, nop .. giữa các xung RS,RW,E cũng không ăn thua.
    data = portA ; E = portB,7 ; RW = portG,3 ; RS = portG 4
    Sử dụng RW & RS ở portG có vấn đề gì không, chân này nằm ở RAM mở rộng xuất nhập giống thanh ghi RAM, không như cổng I/O. Tuy nhiên vẩn thấy điều khiền được.
    Mong được giúp.

  • #2
    bạn dùng LCD gì ? 2x16 hay GLCD ?

    Comment


    • #3
      LCD:2x16
      doi RW & RS qua portB thì không vướng cờ busy nữa.(có vấn đề ở portG ??)
      LCD không hiểu lệnh.
      giãn lệnh bằng nop + nop 4 lần không hiệu quả.

      Comment


      • #4
        Dưới là cod ASM, không khởi động được LCD, các bạn giúp dùm.
        ; LCD Test
        ;====================
        .include "m64def.inc"
        ;==LCD 2x16========
        .equ Data = $8ff ;RAM
        .equ Data_out = PortA
        .equ LCD_E = 7 ;portB, LCD_E
        .equ LCD_RW = 5 ;portB, LCD_RW
        .equ LCD_RS = 6 ;portB, LCD_RS
        .equ LCD_L = 6 ;portD, LCD_L
        ;***************
        jmp reset
        .org $02A
        ;+++++++++
        reset:
        ;======SET POINTER======
        ldi r16, low(RAMEND);
        out SPL, r16
        ldi r16, high(RAMEND) ;
        out SPH, r16
        ;==set portA;Data ======
        ldi r16, $ff
        out data_out, r16
        ldi r16, $ff
        out ddrA, r16
        ;==set port B
        ldi r16, $ff
        out portB, r16
        ldi r16, $ff
        out ddrB, r16
        ;==set port D
        ldi r16, 0b10111111
        out portD, r16
        ldi r16, $ff
        out ddrD, r16
        ;==========================
        call LCD_intall
        ;====MAIM PROGRAM==========
        ;==Row 1 =====
        ldi r16, $80 ;0b10000000 LCD_ROW1
        sts data, r16 ;data ad_ram $8ff
        call LCD_send
        ;+++load data++++
        LDI ZH,HIGH(Datarow1*2)
        LDI ZL,LOW (Datarow1*2)
        call LCD_Print
        ;==Row 2 =====
        ldi r16, $C0 ;0b11000000 LCD_ROW2
        sts data, r16 ;data ad_ram $8ff
        call LCD_send
        ;+++load data++++
        LDI ZH,HIGH(Datarow2*2)
        LDI ZL,LOW (Datarow2*2)
        call LCD_Print
        main: jmp main
        ;+++++
        ;==sub program==========
        ;==Khoi dong LCD========
        LCD_intall:
        cbi portB, LCD_RS ;clr RS
        sbi portB, LCD_E ;set E
        call wait_intall
        ;===repeat 3 times===
        ldi r18, $3
        inll_1:
        ldi r16, 0b00111000 ;LCD_Interface $38(function)
        sts data, r16 ;data ad_ram $8ff
        call LCD_send1
        call wait_intall
        dec r18
        brne inll_1
        ;===LCD ON=====
        ldi r16, 0b00001100 ;1000:$8 LCD_ON
        sts data, r16 ;data ad_ram $8ff
        call LCD_send
        ;===LCD CLEAR===
        ldi r16, 0b00000001 ;0b00000001 LCD_Clear
        sts data, r16 ;data ad_ram $8ff
        call LCD_send
        ;===LCD MODE====
        ldi r16, 0b00000110 ;$06;0b00000110 LCD_mode
        sts data, r16 ;data ad_ram $8ff
        call LCD_send
        ;===LCD HOME====
        ldi r16, 0b00000010 ;$02 LCD_home return
        sts data, r16 ;data ad_ram $8ff
        call LCD_send
        RET
        ;==Wait intall =5ms=====
        Wait_intall:
        ldi r16, $8
        w_in_1:
        ldi r17, $ff
        w_in_2: dec r17
        brne w_in_2
        dec r16
        brne w_in_1
        RET
        ;===LCD send data========
        LCD_send1:
        cbi portB, LCD_RS ;clr RS
        cbi portB, LCD_RW ;clr RW
        lds r16, data ;LCD_Data
        out data_out, r16 ;out portA (2 command)
        nop
        nop
        sbi portB, LCD_E ;set Enable
        nop
        nop
        cbi portB, LCD_E ;clr Enable
        RET
        ;===================
        LCD_send:
        cbi portB, LCD_RS ;clr RS
        send_1:
        cbi portB, LCD_RW ;clr RW
        lds r16, data ;LCD_Data
        out data_out, r16 ;out portA (2 command)
        nop
        nop
        sbi portB, LCD_E ;set Enable
        nop
        nop
        cbi portB, LCD_E ;clr Enable
        call LCD_busy
        RET
        ;===LCD Busy===
        LCD_busy:
        ldi r16,$ff
        out portA, r16
        ldi r16,$0
        out ddrA, r16
        cbi portB, LCD_RS ;clr RS
        sbi portB, LCD_RW ;set RW
        busy:
        nop
        nop
        sbi portB, LCD_E ;set Enable
        nop
        nop
        in r16, pinA
        rol r16
        cbi portB, LCD_E ;clr Enable
        nop
        nop
        sbi portB, LCD_E ;set Enable
        nop
        nop
        cbi portB, LCD_E ;clr Enable
        nop
        nop
        brcs busy
        sbi portB, LCD_RS ;set RS
        cbi portB, LCD_E ;clr Enable
        lds r16,data
        out portA, r16
        ldi r16,$ff
        out ddrA, r16
        RET
        ;====LCD PRINT=============
        LCD_Print:
        LPM r16, Z+
        cpi r16, $99
        brne print_LCD
        RET
        Print_LCD:
        sts data, r16
        call send_1
        jmp LCD_Print
        ;================================================= ====
        DataRow1:
        .DB "0123456789ABCDEF",$99
        DataRow2:
        .DB "0123456789abcdef",$99

        Comment


        • #5
          nhân đây các bạn cho mình hỏi với mình mới tìm hiểu avr thui,mình đang test thử chương trình với 8 led đơn giản thui nhưng gặp rắc rối với lệnh (RCALL offset).nó không gọi chương trình con được.mong các bạn rành về avr giúp mình với.mình đưa code các bạn sửa dùm mình luôn nhé.

          .include<m32def.inc>

          .org 00
          rjmp reset

          reset: ldi r17,9
          ldi r16,0b11111111
          out DDRC,r16

          loop:
          di r16,0b11111111
          qqq: out portC,r16
          rcall trihoan
          ror r16
          dec r17
          brne qqq
          clc
          di r17,9


          qqq1: out portC,r16
          call trihoan
          rol r16
          dec r17
          brne qqq1
          clc
          ddd: rjmp reset


          trihoan:
          ldi r21,6
          aaa:
          ldi r22,255
          bbb:
          ldi r23,255
          ccc:

          dec r23
          brne ccc
          dec r22
          brne bbb
          dec r21
          brne aaa
          ret

          Comment


          • #6
            Nguyên văn bởi boyvui Xem bài viết
            gặp rắc rối với lệnh (RCALL offset).nó không gọi chương trình con được.mong các bạn rành về avr giúp mình với
            Bạn đưa đoạn code này vô đầu chương trình, thì call được.
            ;=================
            di r16, low(RAMEND)
            out SPL, r16
            ldi r16, high(RAMEND)
            out SPH, r16
            ;=================
            Con trỏ SP mặc định khi khởi động có địa chỉ Ram = 0, dời nó về cuối Ram (Ram-end) cho chắc.

            Comment


            • #7
              thanks bác ducthang nha.mình đã làm được rùi,cảm ơn nhiều nhé.thử viết bằng c thấy cũng hay hay.bác có biết cách nào xoay bit 0 trong c khong
              ví dụ: mình viết trong codevision
              portc|=(1<<5);
              bit 1 sẽ được lấp vào vị trí chỉ định còn các bit khác giữ nguyên(|= phép toán or)
              mình thử xoay bit 0 thế này
              portc &=(0<<5); nhưng không được.nếu cái này xuất không được đâu có quét phím,hay quét led được.

              Comment


              • #8
                Nguyên văn bởi boyvui Xem bài viết
                thanks bác ducthang nha.mình đã làm được rùi,cảm ơn nhiều nhé.thử viết bằng c thấy cũng hay hay.bác có biết cách nào xoay bit 0 trong c khong
                ví dụ: mình viết trong codevision
                portc|=(1<<5);
                bit 1 sẽ được lấp vào vị trí chỉ định còn các bit khác giữ nguyên(|= phép toán or)
                mình thử xoay bit 0 thế này
                portc &=(0<<5); nhưng không được.nếu cái này xuất không được đâu có quét phím,hay quét led được.
                portc &=~(1<<5);
                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

                Về tác giả

                Collapse

                duc thang Tìm hiểu thêm về duc thang

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

                Collapse

                Đang tải...
                X