Thông báo

Collapse
No announcement yet.

LED Matrix và các loại module Trung Quốc

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

  • LED Matrix và các loại module Trung Quốc

    Chúc mừng năm mới đến toàn thể các bạn.
    Chào anh em!
    Chào tất cả mọi người và những bạn yêu ARV hay quảng cáo.
    Hôm nay có chút thời gian rảnh rỗi và cũng là thời điểm phuongmd giải nghệ nghề QC, chỉ mong muốn chia sẻ cùng anh em những gì đã làm và dang dở sau 2 năm bước vào ngành điện tử (để tìm nghề khác).
    Chưa thể nói là một sản phẩm hoàn hảo nhưng trong cuộc sống thì việc chia sẻ là một sự kế thừa, đóng góp hoặc điều gì mang lại sự bổ ích cho người khác cũng là rất tốt rồi.
    Có những gì các bạn phật ý hoặc không vừa lòng xin chém nhẹ.
    TEL: 098.3603646
    QUADROTOR QUADCOPTER MULTIROTOR QUAD QUAD Made in Vietnam

  • #2
    1. Sơ đồ mạch điều khiển

    Tại sao sơ đồ của nó lại như thế. Các bạn hãy nghiên cứu! Mình muốn phân tích từng phần nên cần thiết phải đi từ gốc rễ của nó trước.
    Attached Files
    Last edited by phuongmd; 19-02-2011, 22:14. Lý do: cái theme mới này chán quá, để như cũ thì hay hơn
    TEL: 098.3603646
    QUADROTOR QUADCOPTER MULTIROTOR QUAD QUAD Made in Vietnam

    Comment


    • #3
      2. Chuơng trình AVR

      Mình viết bằng ASM
      anh em chịu khó xem
      Code:
      // Chuong trinh quet LED matran 8 banks
      // Nguoi viet: Mai Duy Phuong
      // Phien ban: 5.2
      // Ngay: 29/7/2010
      // - Nhan file du lieu tu PC roi ghi vao FLASH
      // + Cau truc du lieu: 1 header 256 byte va cac block 256 byte data
      // + 2 byte dau cua header la so block data
      // Vi du: [chr(1)chr(5)...][block0][block1][block2]...
      // thi se co 1*256 + 5 block du lieu
      // hien tai dang lay ky tu a roi tru di 0x61
      // + Can truyen 1 header vi de sau nay mo rong truyen lenh
      // hoac truyen 1 file bat ky ma khong can phai la file co cau truc
      // - Nhan file du lieu xong roi RESET lai MCU
      // - Quet ma tran bang ham TIMER1
      // + Ham MAIN khoi tao doc gia tri cho LESSION dau tien.
      // sau do lap het vong la het toan bo noi dung 1 lession.
      // + Cau truc du lieu cua FLASH [block0][block1][block2]... nhu sau:
      // [WIDTH_MODULE][HEIGHT_MODULE][NUM_MODULE][NUM_COLOR][NUM_BANK][11 byte reserved] (matrix_header) - WIDTH x HEIGHT = (32x16) or (16 x 8)
      // -> [B_NEXT_ADD][H_NEXT_ADD][L_NEXT_ADD] (lession_header)
      // /\ [H_DATA_SIZE][L_DATA_SIZE]
      // || [NUM_DATA_MODULE] - 1 byte so ma tran du lieu
      // || [STYLE_SCAN] - 1 byte kieu chay [STYLE_SCAN] 0 - phai sang, 1 - duoi len, 2 - man hinh tinh
      // || [MOVE_SPEED] - 1 byte toc do chuyen hinh - 0..15
      // || [NUM_REPEAT] - 1 byte so lan lap 1 page - 1..256
      // || [NUM_FRAME] - 1 byte so khung hinh - 1..
      // || [IN_EFFECT] - 1 byte kieu chay vao - 0..16
      // || [OUT_EFFECT] - 1 byte kieu chay ra - 0..16
      // || [STOP_AT] - 1 byte khung hinh chinh - 1..
      // || [TIME_STOP] - 1 byte thoi gian dung - bang boi so toc do MOVE_SPEED - 1..256
      // || [REVERSE] - 1 byte co quet nguoc lai hay khong - 0..1
      // || [1 byte reversed] - 2 byte du tru
      // || [BYTE0][BYTE1]...
      // ___________________|
      // Trong do: NEXT_ADD la dia chi FLASH cua LESSION tiep theo
      // DATA_SIZE la kich thuoc header + du lieu quet cua 1 lession (max ~ 64KB)
      // CHU Y: (*) Thay doi khi lession_header thay doi (kich thuoc hien tai la 8)
      // VER 9: - Sua quet du lieu lon (2 byte length)
      // - Dieu chinh dat chat luong hinh tot hon (tot nhat)
      // - Sua loi
      
      // DECLARATION
      .include "m162def.inc"
      ; Tham so dia chi
      .equ DataPortIn = PINA
      .equ DataPortOut = PORTA
      .equ DataPortDir = DDRA
      .equ LowAddressPort = PORTA
      .equ HighAddressPort = PORTC
      
      // PORTB
      .equ A = 0 ; A addr select \
      .equ B = 1 ; B addr select / chon hang quet
      .equ OE = 2 ; bat/tat bang LED
      .equ LCH = 3 ; chot dia chi
      .equ RAMSelect = 4 ; chan PB4
      .equ FLASHSelect = 5 ; chan PB5
      .equ OEControl = 6 ; chan clock - cho phep xuat xung khi doc du lieu
      // PORTD
      .equ Busy = 5
      .equ WritePin = 6 ; PORTD write enable
      .equ ReadPin = 7 ; PORTD read enable
      // PORTE
      .equ ALEPin = 1 ; PORTE chan ALE
      
      ;--------------------------------------------------------------------------
      ; dinh nghia cac tham so cau hinh ma tran
      .equ LESSION_HEADER = 16 ; (*)
      .equ KY_TU_XOA = 0xFF
      .equ NUM_COL_1_MODUL = 4 ; so cot LED trong 1 module
      .equ GIAN_CACH_1_COT = 4 ; theo cach tinh ma tran (0xm + 0 => 0xm + 4 => 0xm + 8...) <=> SO_TANG_LED
      .equ SO_LED_1_COT = 8
      .equ SO_HANG_LED = 4 ; tinh theo cau truc ma tran cua giai ma 74HC138
      
      ;--------------------------------------------------------------------------
      
      // QUY UOC CAC THANH GHI
      // r31:r30, r29:r28, r27:r26 dung chung de doc, ghi, nap du lieu
      // su dung cac thanh ghi nay de doc ghi du lieu cho FLASH va cho quet phai
      .def DATA = r23 ; du lieu doc ghi tu FLASH
      .def BANK = r22 ; chon high page PD3, PD4, PD5 \
      .def HI_ADD = r25 ; chon low page / PAGE => FIX \
      .def LO_ADD = r24 ; dia chi byte trong 256 byte cua 1 page => FIX / r25:r24
      
      .def H_V_NUM_COL = r25 ; con tro dem so cot cua toan bo matran tinh theo 8 LED - quet phai sang
      .def L_V_NUM_COL = r24
      .def V_NUM_LED = r23 ; so LED le da quet duoc tinh tren 1 cot (=0..7) - quet phai sang
      .def ROW_SELECT = r22 ; vi tri chon hang hien tai (0..4) - dung cho TIMER1
      
      .def H_SCAN_POINTER = r21 ; con tro du lieu quet cua 1 lession trong SRAM - tat ca
      .def L_SCAN_POINTER = r20
      // r19, r18, r17, r16 dung chung - khong can push/pop
      .def H_OFFSET_MT_1_4 = r15 ; offset 1/4 ma tran => FIX
      .def L_OFFSET_MT_1_4 = r14 ; 0xm, 16xm, 32xm, 48xm - trong do m la so module
      
      .def H__VAR_4 = r13 ; 5 cap bien thanh ghi dung chung
      .def L__VAR_4 = r12
      .def H__VAR_3 = r11
      .def L__VAR_3 = r10
      .def H__VAR_2 = r9
      .def L__VAR_2 = r8
      .def H__VAR_1 = r7
      .def L__VAR_1 = r6
      .def H__VAR_0 = r5
      .def L__VAR_0 = r4
      // r3, r2, r1, r0 dung cho cac phep nhan/chia
      
      
      .dseg
      ; cac bien doc/ghi FLASH
      H_DATA_SIZE: .BYTE 1 ; kich thuoc 1 block du lieu dung khi doc tu FLASH to RAM,
      L_DATA_SIZE: .BYTE 1 ; kich thuoc lon nhat la 0xFF:0xFF = 64KB
      B_WRITE_BLOCK: .BYTE 1 ; con tro Block dia chi FLASH dang cho ghi du lieu tu W_RAM
      H_WRITE_BLOCK: .BYTE 1 ; cap bien nay tro den dia chi FLASH hien thoi
      S_HEADER_BLOCK: .BYTE 1 ; co phai la block dau tien? BOOLEAN 0 - first block; 1 - not
      B_TRANSMITING: .BYTE 1 ; trang thai truyen data? BOOLEAN 0 - stop; 1 - transmiting;
      B_RECEIVE_SIZE: .BYTE 1 ; kich thuoc file du lieu nhan tu USB
      H_RECEIVE_SIZE: .BYTE 1 ; dung de xac dinh khi nao cuoc truyen ket thuc
      RECEIVE_PNT: .BYTE 1 ; con tro W_RAM (1 block du lieu dang nhan 0..255)
      ; tro den byte thu may khi nhan 1 block tu USB
      ; dia chi RAM cua MCU, dung de nhan du lieu tu USB vao va ghi du lieu nay vao FLASH
      W_RAM: .BYTE 256 ; 1 block du lieu de ghi tu RAM vao FLASH
      H_R_RAM_ADD: .BYTE 1 ; doc 1 khoi du lieu tu FLASH vao SRAM bat dau tu dia chi nay
      L_R_RAM_ADD: .BYTE 1 ; khi doc 1 lession thi can truyen tham so cho R_RAM_ADD
      
      ; cac bien du lieu matrix header (sap xep dung nhu trong FLASH)
      CHIEU_RONG_MODULE_CHUAN: .BYTE 1
      CHIEU_CAO_MODULE_CHUAN: .BYTE 1
      NUM_MODULE: .BYTE 1
      NUM_COLOR: .BYTE 1
      NUM_BANK: .BYTE 1
      ; cac bien lession header (sap xep dung nhu trong FLASH)
      B_NEXT_ADD: .BYTE 1 ; dia chi lession tiep theo,
      H_NEXT_ADD: .BYTE 1 ; CHU Y: day la dia chi tuyen doi trong FLASH
      L_NEXT_ADD: .BYTE 1 ; va tro den dung o nho [B_NEXT_ADD]
      STYLE_SCAN: .BYTE 1 ; kieu chay
      MOVE_SPEED: .BYTE 1 ; toc do chuyen hinh
      NUM_REPEAT: .BYTE 1 ; so lan lap 1 page
      NUM_FRAME: .BYTE 1 ; so khung hinh
      IN_EFFECT: .BYTE 1 ; kieu chay vao
      OUT_EFFECT: .BYTE 1 ; kieu chay ra
      STOP_AT: .BYTE 1 ; khung hinh chinh
      TIME_STOP: .BYTE 1 ; thoi gian dung - bang boi so toc do MOVE_SPEED
      REVERSE: .BYTE 1 ; co quay nguoc lai hay khong
      ; phan tiep theo la du lieu duoc ghi trong SRAM tu dia chi R_RAM [BYTE0][BYTE1]...
      
      ; cac bien quet matrix
      H_OFFSET_PAGE: .BYTE 1 ; offset data cua 1 trang (= W x CHIEU_CAO_MODULE_CHUAN)
      L_OFFSET_PAGE: .BYTE 1
      
      H_OFFSET_MT_1_16: .BYTE 1 ; offset 1/16 ma tran - vi thieu thanh ghi nen dinh nghia bang RAM
      L_OFFSET_MT_1_16: .BYTE 1 ; 0xm, 4xm, 8xm, 16xm - trong do m la so module
      
      H_LESSION: .BYTE 1 ; dia chi cua 1 lession trong SRAM - gom ca HEADER
      L_LESSION: .BYTE 1
      
      H_DATA_SCAN: .BYTE 1 ; dia chi co dinh cua du lieu 1 lession trong SRAM
      L_DATA_SCAN: .BYTE 1 ; dung de quet dong vi con tro H_SCAN_POINTER:L_SCAN_POINTER luon bi thay doi
      
      V_NUM_SCAN: .BYTE 1 ; bien dem so lan da quet duoc tren 1 trang (MOVE_SPEED)
      V_NUM_PAGE: .BYTE 1 ; bien dem so man hinh - dung cho quet tinh
      
      
      NUM_MATRIX_COL: .BYTE 1 ; so cot cua toan bo matran tinh theo 8 LED
      H_NUM_DATA_COL: .BYTE 1 ; so cot du lieu - quet phai sang
      L_NUM_DATA_COL: .BYTE 1 ; so cot du lieu - quet phai sang
      NUM_DATA_MODULE:.BYTE 1 ; so module cua du lieu
      
      // CODE SEGMENT
      /************************************************** **********************/
      
      .cseg ; bat dau chuong trinh
      .org 0x0000
      rjmp RESET ; ngat RESET tai org 0x0038
      .org 0x001A ; Atmega8515 - 0x0004 // rjmp
      jmp TIMER1
      .org 0x0026 ; Atmega8515 - 0x0009 // rjmp
      jmp UART_RXC
      .org 0x0038 ; bat dau chuong trinh chinh
      
      /************************************************** **********************/
      // START PROC
      /************************************************** **********************/
      
      RESET:
      ldi r16, 0
      sts B_TRANSMITING, r16
      
      RESET_TRANSMIT:
      cli ; clear interrupts
      cbi PORTB, OE
      
      ldi r16, high(RAMEND) ; Main program start
      out SPH, r16 ; Set Stack Pointer to top of RAM
      ldi r16, low(RAMEND)
      out SPL, r16
      
      ;--------------------------------------------------------------------------
      ; cau hinh SRAM va FLASH
      ; rcall RAM_Config_Enable ; dat MCUCR cho phep truy xuat SRAM - mac dinh ban dau
      ;--------------------------------------------------------------------------
      rcall RAM_Config_Disable; cau hinh DDR
      
      ;--------------------------------------------------------------------------
      ; khoi tao port noi tiep
      ;--------------------------------------------------------------------------
      ldi r16, 0
      out UCSR0A, r16
      
      ldi r16, 0b10011000 ; (1<<RXEN)|(1<<TXEN)|(1<<RXCIE)
      ; || ||_________ TXEN 3 = 1 cho phat,
      ; || |__________ RXEN 4 = 1 cho nhan,
      ; ||____________ TXCIE 6 = 0 ngat phat,
      ; |_____________ RXCIE 7 = 1 ngat thu
      out UCSR0B, r16
      ldi r16, 0b10000110 ; Set baud rate: 8 Data, 1 Stop, No Parity
      out UCSR0C, r16
      ldi r16, high(103)
      out UBRR0H, r16
      ldi r16, low(103) ; 9600 bps ~ XTAL = 16MHz
      out UBRR0L, r16 ; USART Baud Rate Register
      
      ;--------------------------------------------------------------------------
      ; khoi tao cac bien
      ;--------------------------------------------------------------------------
      ldi r16, 0
      sts B_WRITE_BLOCK, r16 ; dia chi Block dang cho ghi du lieu
      sts H_WRITE_BLOCK, r16
      sts B_RECEIVE_SIZE, r16 ; kich thuoc nhan du lieu tu USB - max 512 KByte
      sts H_RECEIVE_SIZE, r16
      sts S_HEADER_BLOCK, r16 ; khi bat dau thi block nhan la header => khong ghi
      
      sts RECEIVE_PNT, r16 ; con tro trong 1 block du lieu dang nhan
      
      ldi r16, 0b00000000 ; tat TIMER1
      out TIMSK, r16
      
      ;--------------------------------------------------------------------------
      ; vong lap nhan du lieu
      ;--------------------------------------------------------------------------
      wdr ; Watchdog Reset
      sei
      transmit_loop:
      rcall DELAY_5_MS ; wait
      lds r16, B_TRANSMITING
      cpi r16, 0xA2
      breq transmit_loop
      cli ; da nhan xong
      ldi r16, 0
      sts B_TRANSMITING, r16 ; B_TRANSMITING = 0 - khong truyen
      
      ;--------------------------------------------------------------------------
      ; doc cac tham so cau hinh matrix (matrix header)
      ; [WIDTH_MODULE][HEIGHT_MODULE][NUM_MODULE][NUMCOLOR][NUM_BANK[11 byte reserved] (matrix_header) - WIDTH x HEIGHT = (32x16) or (16 x 8)
      ;--------------------------------------------------------------------------
      ldi BANK, 0 ; [BANK:HI_ADD:LO_ADD] to [DATA]
      ldi HI_ADD, 0
      ldi LO_ADD, 0
      rcall Read_1_byte ; doc WIDTH
      sts CHIEU_RONG_MODULE_CHUAN, DATA
      
      ldi LO_ADD, 1
      rcall Read_1_byte ; doc WIDTH
      sts CHIEU_CAO_MODULE_CHUAN, DATA
      
      ldi LO_ADD, 2 ; NUM_MODULE theo chieu ngang
      rcall Read_1_byte
      sts NUM_MODULE, DATA
      
      ldi LO_ADD, 3
      rcall Read_1_byte ; doc NUM_COLOR
      sts NUM_COLOR, DATA
      
      ldi LO_ADD, 4
      rcall Read_1_byte ; doc NUM_BANK
      sts NUM_COLOR, DATA
      
      ;--------------------------------------------------------------------------
      ; tinh kich thuoc offset 1/4 ma tran = (CHIEU_RONG_MODULE_CHUAN * CHIEU_CAO_MODULE_CHUAN) * NUM_MODULE / 4
      ; chu y tinh lai voi modul 3 mau
      ;--------------------------------------------------------------------------
      lds r17, CHIEU_CAO_MODULE_CHUAN
      lds r16, CHIEU_RONG_MODULE_CHUAN ;
      lsr r16 ; chia cho 4
      lsr r16
      mul r16, r17
      movw r17:r16, r1:r0
      lds r18, NUM_MODULE
      mul r16, r18
      movw r3:r2, r1:r0
      mul r17, r18
      add r3, r0
      movw H_OFFSET_MT_1_4:L_OFFSET_MT_1_4, r3:r2
      
      ;--------------------------------------------------------------------------
      ; tinh kich thuoc offset 1/16 ma tran = (CHIEU_RONG_MODULE_CHUAN * CHIEU_CAO_MODULE_CHUAN) * NUM_MODULE / 16
      ; chu y tinh lai voi modul 3 mau
      ;--------------------------------------------------------------------------
      lds r17, CHIEU_CAO_MODULE_CHUAN
      lsr r17 ; chia cho 4
      lsr r17
      lds r16, CHIEU_RONG_MODULE_CHUAN ;
      lsr r16 ; chia cho 4
      lsr r16
      mul r16, r17
      movw r17:r16, r1:r0
      lds r18, NUM_MODULE
      mul r16, r18
      movw r3:r2, r1:r0
      mul r17, r18
      add r3, r0
      sts H_OFFSET_MT_1_16, r3
      sts L_OFFSET_MT_1_16, r2
      
      ;--------------------------------------------------------------------------
      ; tinh kich thuoc offset 1 ma tran = (CHIEU_RONG_MODULE_CHUAN * CHIEU_CAO_MODULE_CHUAN) * NUM_MODULE
      ; <=> kich thuoc cua 1/4 trang * 4
      ;--------------------------------------------------------------------------
      ldi r18, 4
      mul L_OFFSET_MT_1_4, r18
      movw r3:r2, r1:r0
      mul H_OFFSET_MT_1_4, r18
      add r3, r0
      sts H_OFFSET_PAGE, r3
      sts L_OFFSET_PAGE, r2
      
      ;--------------------------------------------------------------------------
      ; tinh so cot ma tran NUM_MATRIX_COL = NUM_MODULE * (CHIEU_RONG_MODULE_CHUAN / 8)
      ;--------------------------------------------------------------------------
      lds r16, CHIEU_RONG_MODULE_CHUAN
      lsr r16
      lsr r16
      lsr r16
      lds r17, NUM_MODULE
      mul r16, r17
      sts NUM_MATRIX_COL, r0
      
      ;--------------------------------------------------------------------------
      ; dinh dia chi cho lession, dia chi duoc copy co the bi thay doi do sau nay co the
      ; doc du lieu cho cac bang font hoac danh 1 phan cho vung nhap
      ;--------------------------------------------------------------------------
      ldi r16, 0x05 ; tam thoi lay dia chi bat dau RAM ngoai - Atmega8515: 02:60
      sts H_LESSION, r16
      ldi r16, 0x00
      sts L_LESSION, r16
      
      ;--------------------------------------------------------------------------
      ; khoi tao TIMER1
      ;--------------------------------------------------------------------------
      ldi r16, 0
      out TCCR1A, r16
      ldi r16, 0b00001101 ; clock value: 15.625 kHz
      out TCCR1B, r16 ; thanh ghi 16 bit dieu khien Timer1/Counter1
      ldi r16, 0
      out TCNT1H, r16
      out TCNT1L, r16
      out ICR1H, r16;
      out ICR1L, r16;
      ldi r16, 0
      out OCR1AH, r16
      ldi r16, 0x15 ; dieu chinh tan so quet (15.625 / OCR1AL Hz)
      out OCR1AL, r16
      ldi r16, 0
      out OCR1BH, r16
      out OCR1BL, r16
      ldi r16, 0b01000000
      ; || |_______ TOIE0: Timer/Counter0 Overflow Interrupt Enable
      ; ||____________ OCIE1A: Timer/Counter1, Output Compare A Match Interrupt Enable
      ; |_____________ TOIE1: Timer/Counter1, Overflow Interrupt Enable
      out TIMSK, r16
      
      /************************************************** **********************/
      // MAIN PROC
      /************************************************** **********************/
      
      MAIN:
      ; khoi tao dia chi con tro ban dau
      ldi r16, 0 ; dia chi 0:00:16 vi cau truc hien tai cua lession dau tien
      sts B_NEXT_ADD, r16 ; dang nam tai o nho 0:00:16 trong FLASH
      ldi r16, 0 ; khi thay doi kich thuoc matrix header thi
      sts H_NEXT_ADD, r16 ; can phai thay doi lai gia tri khoi tao nay
      ldi r16, 16 ; (*) tro den FIRST NEXT_ADD
      sts L_NEXT_ADD, r16
      
      ; can thiet co the doc phan matrix header
      
      // [WIDTH_MODULE][HEIGHT_MODULE][NUM_MODULE][NUM_COLOR][NUM_BANK][11 byte reserved] (matrix_header) - WIDTH x HEIGHT = (32x16) or (16 x 8)
      // -> [B_NEXT_ADD][H_NEXT_ADD][L_NEXT_ADD] (lession_header)
      // /\ [H_DATA_SIZE][L_DATA_SIZE]
      // || [NUM_DATA_MODULE] - 1 byte so ma tran du lieu
      // || [STYLE_SCAN] - 1 byte kieu chay [STYLE_SCAN] 0 - phai sang, 1 - duoi len, 2 - man hinh tinh
      // || [MOVE_SPEED] - 1 byte toc do chuyen hinh - 0..15
      // || [NUM_REPEAT] - 1 byte so lan lap 1 page - 1..256
      // || [NUM_FRAME] - 1 byte so khung hinh - 1..
      // || [IN_EFFECT] - 1 byte kieu chay vao - 0..16
      // || [OUT_EFFECT] - 1 byte kieu chay ra - 0..16
      // || [STOP_AT] - 1 byte khung hinh chinh - 1..
      // || [TIME_STOP] - 1 byte thoi gian dung - bang boi so toc do MOVE_SPEED - 1..256
      // || [REVERSE] - 1 byte co quet nguoc lai hay khong - 0..1
      // || [1 byte reversed] - 2 byte du tru
      // || [BYTE0][BYTE1]...
      // ___________________|
      
      main_loop:
      cbi PORTB, OE ; tat bang de doc du lieu
      ; lay kich thuoc du lieu [H_DATA_SIZE][L_DATA_SIZE]
      ; CHU Y: [H_DATA_SIZE][L_DATA_SIZE] la kich thuoc toan bo 1 lession = 16 byte header + data
      lds BANK, B_NEXT_ADD ; dia chi de doc du lieu H_DATA_SIZE:L_DATA_SIZE
      lds HI_ADD, H_NEXT_ADD
      lds LO_ADD, L_NEXT_ADD
      adiw HI_ADD:LO_ADD, 3 ; o nho [H_DATA_SIZE] ;(*)
      brcc in_bank1
      inc BANK
      in_bank1:
      rcall Read_1_byte
      sts H_DATA_SIZE, DATA
      
      lds BANK, B_NEXT_ADD ; tiep tuc doc byte thap
      lds HI_ADD, H_NEXT_ADD
      lds LO_ADD, L_NEXT_ADD
      adiw HI_ADD:LO_ADD, 4 ; o nho [L_DATA_SIZE] ;(*)
      brcc in_bank2
      inc BANK
      in_bank2:
      rcall Read_1_byte
      sts L_DATA_SIZE, DATA
      
      ; truyen tham so de doc du lieu 1 lession
      lds r16, H_LESSION
      sts H_R_RAM_ADD, r16
      lds r16, L_LESSION
      sts L_R_RAM_ADD, r16
      lds BANK, B_NEXT_ADD ; chuan bi doc du lieu
      lds HI_ADD, H_NEXT_ADD
      lds LO_ADD, L_NEXT_ADD
      
      rcall Read_a_FLASH_block_to_SRAM
      
      ;--------------------------------------------------------------------------
      ; toan bo du lieu 1 lession da duoc doc vao SRAM tai dia chi H_LESSION
      ; can phai tinh NEXT_ADD [B_NEXT_ADD][H_NEXT_ADD][L_NEXT_ADD] de
      ; cho lan quet tiep sau nay
      ;--------------------------------------------------------------------------
      lds XH, H_LESSION
      lds XL, L_LESSION
      ld r16, X+
      sts B_NEXT_ADD, r16 ;(*)
      ld r16, X+
      sts H_NEXT_ADD, r16
      ld r16, X+
      sts L_NEXT_ADD, r16
      ;--------------------------------------------------------------------------
      ; tiep theo la 2 byte H_DATA_SIZE:L_DATA_SIZE
      ; nhung khong can lay nua vi da doc roi
      ; tiep theo la lay cac tham so dung chung
      ;--------------------------------------------------------------------------
      ld r16, X+ ; H_DATA_SIZE
      ld r16, X+ ; L_DATA_SIZE
      ld r16, X+
      sts NUM_DATA_MODULE, r16; NUM_DATA_MODULE - 1 byte so ma tran du lieu dung cho kieu quet phai sang
      ld r16, X+
      sts STYLE_SCAN, r16 ; STYLE_SCAN - lay kieu quet
      ld r16, X+
      sts MOVE_SPEED, r16 ; toc do chuyen hinh
      ld r16, X+
      sts NUM_REPEAT, r16 ; so lan lap 1 page
      ld r16, X+
      sts NUM_FRAME, r16 ; so khung hinh
      ld r16, X+
      sts IN_EFFECT, r16 ; kieu chay vao
      ld r16, X+
      sts OUT_EFFECT, r16 ; kieu chay ra
      ld r16, X+
      sts STOP_AT, r16 ; khung hinh chinh
      ld r16, X+
      sts TIME_STOP, r16 ; thoi gian dung - bang boi so toc do MOVE_SPEED
      ld r16, X+
      sts REVERSE, r16 ; quet nguoc lai
      ; den day thi con lai 1 byte du tru
      
      ; lay them 1 so tham so du phong tai day
      ldi ROW_SELECT, 3 ; khi khoi dong chon hang 3
      
      lds r16, STYLE_SCAN
      kieu_0: ; quet_phai_sang
      cpi r16, 0
      brne kieu_1
      rcall QUET_PHAI_SANG
      rjmp end_loop
      kieu_1: ; quet_duoi_len
      cpi r16, 1
      brne kieu_2
      rcall QUET_DUOI_LEN
      rjmp end_loop
      kieu_2: ; man hinh tinh hoac nhieu man hinh
      rcall QUET_TINH
      rjmp end_loop
      
      ; het 1 vong lap chinh
      end_loop:
      rjmp main_loop
      
      /************************************************** **********************/
      // CHUONG TRINH QUET
      /************************************************** **********************/
      
      QUET_PHAI_SANG:
      ; CHU Y: H_SCAN_POINTER:L_SCAN_POINTER chi la con tro thanh ghi du lieu cho TIMER1
      
      ;--------------------------------------------------------------------------
      ; dia chi co dinh du lieu quet
      ;--------------------------------------------------------------------------
      lds XH, H_LESSION
      lds XL, L_LESSION
      adiw XH:XL, LESSION_HEADER ; 16 byte
      sts H_DATA_SCAN, XH ; luu dia chi LESSION_DATA dau tien
      sts L_DATA_SCAN, XL
      
      ;--------------------------------------------------------------------------
      ; tinh toan tong cong buoc lap - dieu kien ket thuc H_SUM_MATRIX_DATA_COL:L_SUM_MATRIX_DATA_COL
      ;--------------------------------------------------------------------------
      lds r16, NUM_DATA_MODULE
      ldi r17, NUM_COL_1_MODUL ; neu NUM_MATRIX_COL + NUM_DATA_MODULE * 4 >= 64 module (256 cot) thi phai dung 2 byte so sanh
      mul r16, r17
      
      sts L_NUM_DATA_COL, r0 ; lay luon gia tri so cot du lieu
      sts H_NUM_DATA_COL, r1
      
      lds r16, NUM_MATRIX_COL
      clr r17
      add r16, r0
      adc r17, r1
      movw H__VAR_2:L__VAR_2, r17:r16 ; H_SUM_MATRIX_DATA_COL:L_SUM_MATRIX_DATA_COL
      
      ;--------------------------------------------------------------------------
      ; tinh toan dia chi trang man hinh 0 (1 trang)
      ;--------------------------------------------------------------------------
      lds r16, L_LESSION ; bat dau RAM ngoai
      lds r17, H_LESSION
      lds r18, L_DATA_SIZE ; kich thuoc 1 lession
      lds r19, H_DATA_SIZE
      add r16, r18
      adc r17, r19
      movw H_SCAN_POINTER:L_SCAN_POINTER, r17:r16 ; chuan bi: dat dia chi quet ve trang 0
      
      ;--------------------------------------------------------------------------
      ; va xoa het du lieu trang 0 va trang 1
      ;--------------------------------------------------------------------------
      movw XH:XL, H_SCAN_POINTER:L_SCAN_POINTER
      lds ZH, H_OFFSET_PAGE
      lds ZL, L_OFFSET_PAGE
      ldi r16, KY_TU_XOA ; ky tu xoa
      erase_loop_0:
      st X+, r16
      sbiw ZH:ZL, 1
      brne erase_loop_0
      
      ;--------------------------------------------------------------------------
      ; bat dau tinh toan de quet
      ;--------------------------------------------------------------------------
      clr H_V_NUM_COL
      clr L_V_NUM_COL
      clr V_NUM_LED
      
      ;--------------------------------------------------------------------------
      ; tinh offset 1/16 doan du lieu
      ; neu la module 3 mau thi chi lay 1/8 du lieu thoi
      ;--------------------------------------------------------------------------
      lds r16, NUM_DATA_MODULE ; offset 1/16 tu doan du lieu thuc te
      ; 0xn, 4xn, 16xn ... 60xn - n la so cot du lieu
      ldi r18, 4 ; gian cach 1 hang trong DATA IN (***)
      mul r16, r18
      movw r17:r16, r1:r0
      ldi r18, SO_LED_1_COT ; nhan tiep voi 8
      mul r16, r18
      movw r3:r2, r1:r0
      mul r17, r18
      add r3, r0
      movw H__VAR_0:L__VAR_0, r3:r2 ; H__VAR_0:L__VAR_0 luu gia tri OFFSET_DATA_16
      
      ;--------------------------------------------------------------------------
      ; tinh offset 1/4 doan du lieu
      ; neu la module 3 mau thi chi lay 1/2 du lieu thoi
      ;--------------------------------------------------------------------------
      lds r16, NUM_DATA_MODULE ; offset 1/4 tu doan du lieu thuc te
      ; 0xn, 16xn, 32xn, 48xn - n la so cot du lieu
      ldi r18, 16 ; gian cach 4 hang trong DATA IN (***)
      mul r16, r18
      movw r17:r16, r1:r0
      ldi r18, SO_LED_1_COT ; nhan tiep voi 8
      mul r16, r18
      movw r3:r2, r1:r0
      mul r17, r18
      add r3, r0
      movw H__VAR_1:L__VAR_1, r3:r2 ; H__VAR_1:L__VAR_1 luu gia tri OFFSET_DATA_4
      
      thay_doi_1_vi_tri_LED:
      ldi r16, 0 ; dat bien so lan quet ve 0
      sts V_NUM_SCAN, r16
      
      dau_trang:
      movw r16, L_V_NUM_COL ; (*) chieu rong ma tran tinh theo cot
      lds r18, NUM_MATRIX_COL ; kiem tra xem da quet den dau roi
      clr r19
      sub r16, r18
      sbc r17, r19
      brmi _dau_trang
      rjmp giua_trang
      _dau_trang:
      ; tim den dia chi cot NUM_COL va dia chi LED V_NUM_COL
      lds XL, NUM_MATRIX_COL ; vi chac chan so cot da quet L_V_NUM_COL < NUM_MATRIX_COL (1 byte)
      sub XL, L_V_NUM_COL ; nen chi can so sanh byte thap
      subi XL, 1
      ldi r16, GIAN_CACH_1_COT * SO_LED_1_COT ; nhan gia tri nay voi 4 - vi moi cot ma tran cach nhau 4 don vi va co 8 LED
      mul XL, r16 ; nhan tiep voi 8 vi moi vi tri co 8 LED <=> x32
      movw XH:XL, r1:r0
      ldi r16, SO_LED_1_COT - 1 ; cong tiep voi gia tri con tro LED
      sub r16, V_NUM_LED
      clr r17
      add XL, r16
      adc XH, r17 ; phan le cua con tro du lieu cua ma tran da duoc xac dinh trong YH:YL
      movw H__VAR_3:L__VAR_3, XH:XL ; luu lai dia chi
      
      ldi r18, 0 ; i = 0..3
      goto_1_4_0:
      mul L_OFFSET_MT_1_4, r18 ; OFFSET_MATRIX
      movw r3:r2, r1:r0
      mul H_OFFSET_MT_1_4, r18
      add r3, r0
      movw XH:XL, H_SCAN_POINTER:L_SCAN_POINTER
      add XL, r2
      adc XH, r3
      add XL, L__VAR_3
      adc XH, H__VAR_3 ; XH:XL tro den dung dia chi DATA OUT roi
      movw ZH:ZL, XH:XL ; luu con tro nay lai
      
      mul L__VAR_0, r18 ; OFFSET_DATA_4
      movw r3:r2, r1:r0
      mul H__VAR_0, r18
      add r3, r0
      movw H__VAR_4:L__VAR_4, r3:r2
      
      ldi r19, 0 ; j = 0..3
      goto_1_16_0:
      ; tim den dau dia chi du lieu trong DATA IN de lay du lieu
      mul L__VAR_1, r19 ; OFFSET_DATA_16
      movw r3:r2, r1:r0
      mul H__VAR_1, r19
      add r3, r0
      movw YH:YL, r3:r2
      
      add YL, L__VAR_4
      adc YH, H__VAR_4
      
      lds r17, H_DATA_SCAN ; ve vung dau tien cua du lieu
      lds r16, L_DATA_SCAN
      add YL, r16
      adc YH, r17
      
      movw XH:XL, ZH:ZL ; tang them 8 byte de den hang ben tren <-> so led trong 1 cot
      ldi r16, SO_LED_1_COT
      mul r16, r19
      add XL, r0
      adc XH, r1
      
      ; copy cac byte le vao truoc
      mov r16, V_NUM_LED
      copy_byte_le_0:
      ld r17, Y+
      st X+, r17
      subi r16, 1
      brpl copy_byte_le_0
      
      ; sau do copy cac 8 byte vao sau
      mov r16, L_V_NUM_COL
      copy_byte_chan_0:
      cpi r16, 0
      breq thoat
      subi r16, 1
      adiw XH:XL, SO_LED_1_COT * (GIAN_CACH_1_COT - 1) ; tang them 24 byte de offset sang cot ben canh
      ld r17, Y+
      st X+, r17
      ld r17, Y+
      st X+, r17
      ld r17, Y+
      st X+, r17
      ld r17, Y+
      st X+, r17
      ld r17, Y+
      st X+, r17
      ld r17, Y+
      st X+, r17
      ld r17, Y+
      st X+, r17
      ld r17, Y+
      st X+, r17
      rjmp copy_byte_chan_0
      thoat:
      inc r19
      cpi r19, GIAN_CACH_1_COT ; <=> so tang LED
      brne goto_1_16_0
      inc r18
      cpi r18, SO_HANG_LED
      brne jump_goto_1_4_0
      rjmp scan_1_page_loop_0
      jump_goto_1_4_0:
      rjmp goto_1_4_0
      
      giua_trang:
      ; kiem tra xem da den cuoi trang chua?
      movw r16, L_V_NUM_COL
      lds r18, L_NUM_DATA_COL
      lds r19, H_NUM_DATA_COL
      sub r16, r18
      sbc r17, r19
      brmi _giua_trang
      rjmp cuoi_trang
      _giua_trang:
      ; con tro Y nhay ve dia chi ma tran DATA IN tai vi tri (V_NUM_COL - NUM_MATRIX_COL) * 8 + V_NUM_LED
      movw r16, L_V_NUM_COL
      lds r18, NUM_MATRIX_COL
      clr r19
      sub r16, r18
      sbc r17, r19
      ldi r18, SO_LED_1_COT
      mul r16, r18
      movw r3:r2, r1:r0
      mul r17, r18
      add r3, r0
      
      lds YH, H_DATA_SCAN
      lds YL, L_DATA_SCAN
      add YL, r2
      adc YH, r3
      
      clr r16
      add YL, V_NUM_LED
      adc YH, r16 ; con tro Y da duoc xac dinh
      adiw YH:YL, 1
      movw H__VAR_3:L__VAR_3, YH:YL ; luu lai
      
      ldi r18, 0 ; i = 0..3
      goto_1_4_1: ; con tro X nhay ve dia chi dau ma tran DATA OUT
      movw XH:XL, H_SCAN_POINTER:L_SCAN_POINTER ; dia chi goc
      mul L_OFFSET_MT_1_4, r18
      movw r3:r2, r1:r0
      mul H_OFFSET_MT_1_4, r18
      add r3, r0
      add XL, r2
      adc XH, r3 ; con tro X da nam o vi tri 0xm, 16xm, 32xm, 48xm
      movw ZH:ZL, XH:XL ; luu con tro nay lai
      
      mul L__VAR_0, r18 ; OFFSET_DATA_4
      movw r3:r2, r1:r0
      mul H__VAR_0, r18
      add r3, r0
      movw H__VAR_4:L__VAR_4, r3:r2
      
      ldi r19, 0
      goto_1_16_1:
      movw YH:YL, H__VAR_3:L__VAR_3
      mul L__VAR_1, r19
      movw r3:r2, r1:r0
      mul H__VAR_1, r19
      add r3, r0
      add YL, r2
      adc YH, r3
      
      add YL, L__VAR_4
      adc YH, H__VAR_4
      
      movw XH:XL, ZH:ZL
      ldi r16, SO_LED_1_COT
      mul r16, r19
      add XL, r0
      adc XH, r1
      
      lds r16, NUM_MATRIX_COL
      copy_byte_chan_1:
      ld r17, Y+
      st X+, r17
      ld r17, Y+
      st X+, r17
      ld r17, Y+
      st X+, r17
      ld r17, Y+
      st X+, r17
      ld r17, Y+
      st X+, r17
      ld r17, Y+
      st X+, r17
      ld r17, Y+
      st X+, r17
      ld r17, Y+
      st X+, r17
      adiw X, SO_LED_1_COT * (GIAN_CACH_1_COT - 1)
      subi r16, 1
      brne copy_byte_chan_1
      
      inc r19
      cpi r19, GIAN_CACH_1_COT
      brne goto_1_16_1
      
      inc r18
      cpi r18, SO_HANG_LED
      brne goto_1_4_1
      rjmp scan_1_page_loop_0
      
      cuoi_trang:
      ; con tro Y nhay ve dia chi ma tran DATA IN tai vi tri (V_NUM_COL - NUM_MATRIX_COL) * 8 + V_NUM_LED
      movw r16, L_V_NUM_COL
      lds r18, NUM_MATRIX_COL
      clr r19
      sub r16, r18
      sbc r17, r19
      ldi r18, SO_LED_1_COT
      mul r16, r18
      movw r3:r2, r1:r0
      mul r17, r18
      add r3, r0
      
      lds YH, H_DATA_SCAN
      lds YL, L_DATA_SCAN
      add YL, r2
      adc YH, r3
      
      clr r16
      add YL, V_NUM_LED
      adc YH, r16 ; con tro Y da duoc xac dinh
      adiw YH:YL, 1
      movw H__VAR_3:L__VAR_3, YH:YL ; luu lai
      
      ldi r18, 0 ; i = 0..3
      goto_1_4_2:
      ; con tro X nhay ve dia chi dau ma tran DATA OUT
      movw XH:XL, H_SCAN_POINTER:L_SCAN_POINTER ; dia chi goc
      mul L_OFFSET_MT_1_4, r18
      movw r3:r2, r1:r0
      mul H_OFFSET_MT_1_4, r18
      add r3, r0
      add XL, r2
      adc XH, r3 ; con tro X da nam o vi tri 0xm, 16xm, 32xm, 48xm
      movw ZH:ZL, XH:XL ; luu con tro nay lai
      
      mul L__VAR_0, r18 ; OFFSET_DATA_4
      movw r3:r2, r1:r0
      mul H__VAR_0, r18
      add r3, r0
      movw H__VAR_4:L__VAR_4, r3:r2
      
      ldi r19, 0
      goto_1_16_2:
      movw YH:YL, H__VAR_3:L__VAR_3
      mul L__VAR_1, r19
      movw r3:r2, r1:r0
      mul H__VAR_1, r19
      add r3, r0
      add YL, r2
      adc YH, r3
      
      add YL, L__VAR_4
      adc YH, H__VAR_4
      
      movw XH:XL, ZH:ZL
      ldi r16, SO_LED_1_COT
      mul r16, r19
      add XL, r0
      adc XH, r1
      
      movw r17:r16, H__VAR_2:L__VAR_2
      sub r16, L_V_NUM_COL
      sbc r17, H_V_NUM_COL ; r17 chac chan = 0
      
      copy_byte_chan_2: ; cac byte chan
      cpi r16, 1
      breq _copy_byte_le_2
      ld r17, Y+
      st X+, r17
      ld r17, Y+
      st X+, r17
      ld r17, Y+
      st X+, r17
      ld r17, Y+
      st X+, r17
      ld r17, Y+
      st X+, r17
      ld r17, Y+
      st X+, r17
      ld r17, Y+
      st X+, r17
      ld r17, Y+
      st X+, r17
      adiw X, SO_LED_1_COT * (GIAN_CACH_1_COT - 1)
      dec r16
      rjmp copy_byte_chan_2
      
      _copy_byte_le_2:
      ldi r16, SO_LED_1_COT - 1 ; tiep tuc dich cac byte le
      sub r16, V_NUM_LED
      copy_byte_le_2:
      cpi r16, 0
      breq _copy_byte_le_trong
      ld r17, Y+
      st X+, r17
      subi r16, 1
      rjmp copy_byte_le_2
      
      _copy_byte_le_trong:
      ldi r17, KY_TU_XOA ; dich cac byte trong = 0
      mov r16, V_NUM_LED
      copy_byte_le_trong:
      st X+, r17
      subi r16, 1
      brpl copy_byte_le_trong
      
      adiw X, SO_LED_1_COT * (GIAN_CACH_1_COT - 1) ; nhay sang cot ben ghi xoa them 1 LED
      st X+, r17
      
      inc r19
      cpi r19, GIAN_CACH_1_COT
      breq jmp_goto_1_16_2
      rjmp goto_1_16_2
      jmp_goto_1_16_2:
      inc r18
      cpi r18, SO_HANG_LED
      brne jmp_goto_1_4_2
      rjmp scan_1_page_loop_0
      jmp_goto_1_4_2:
      rjmp goto_1_4_2
      
      scan_1_page_loop_0:
      sei
      sbi PORTB, OE ; bat
      rcall DIEU_CHINH_DO_SANG
      cli ; cam ngat khi het 1 trang de dam bao do sang deu
      cbi PORTB, OE ; van phai tat bang
      
      lds r16, V_NUM_SCAN
      lds r17, MOVE_SPEED
      cp r16, r17 ; kiem tra so lan da quet 1 trang (thoi gian hien thi)
      brlt scan_1_page_loop_0 ; brlt - khong lam viec?????????????????????
      
      ; tang con tro LED
      inc V_NUM_LED
      mov r16, V_NUM_LED
      cpi r16, SO_LED_1_COT ; so LED trong 1 con 74HC595
      brlt jump_thay_doi_1_vi_tri_LED
      clr V_NUM_LED
      ; tang cot len 1
      adiw H_V_NUM_COL:L_V_NUM_COL, 1
      cp L_V_NUM_COL, L__VAR_2 ; kiem tra ket thuc H_SUM_MATRIX_DATA_COL:L_SUM_MATRIX_DATA_COL
      cpc H_V_NUM_COL, H__VAR_2
      brne jump_thay_doi_1_vi_tri_LED
      rjmp ket_thuc
      ; ket thuc
      jump_thay_doi_1_vi_tri_LED:
      rjmp thay_doi_1_vi_tri_LED
      ket_thuc:
      ret
      
      QUET_DUOI_LEN:
      ret
      
      QUET_TINH:
      ; day la vong lap quet 1 lession
      ; - tinh toan so lan TIMER1 da quet duoc
      ; - sap xep va tinh toan dia chi du lieu cho moi lan quet
      ; - kiem tra hieu ung quet
      ; - lession ket thuc thi quay lai main_loop de nap tiep du lieu
      ; - dia chi du lieu quet SCAN_ADDR
      
      ;--------------------------------------------------------------------------
      ; lay dia chi du lieu cua lession LESSION_DATA[0]
      ; LESSION_DATA = LESSION + LESSION_HEADER
      ;--------------------------------------------------------------------------
      lds XH, H_LESSION
      lds XL, L_LESSION
      adiw XH:XL, LESSION_HEADER ; 16 byte
      sts H_DATA_SCAN, XH ; luu dia chi LESSION_DATA dau tien
      sts L_DATA_SCAN, XL
      
      ;--------------------------------------------------------------------------
      ; tinh toan dia chi trang man hinh 0 (1 trang)
      ;--------------------------------------------------------------------------
      lds r16, L_LESSION ; dia chi LESSION
      lds r17, H_LESSION
      lds r18, L_DATA_SIZE ; kich thuoc 1 lession
      lds r19, H_DATA_SIZE
      add r16, r18
      adc r17, r19
      movw H_SCAN_POINTER:L_SCAN_POINTER, r17:r16 ; dat dia chi quet ve trang 0
      
      ;--------------------------------------------------------------------------
      ; va xoa het du lieu
      ;--------------------------------------------------------------------------
      movw XH:XL, H_SCAN_POINTER:L_SCAN_POINTER
      lds ZH, H_OFFSET_PAGE
      lds ZL, L_OFFSET_PAGE
      ldi r16, KY_TU_XOA ; ky tu xoa
      erase_loop_2:
      st X+, r16
      sbiw ZH:ZL, 1
      brne erase_loop_2
      
      ;--------------------------------------------------------------------------
      ; lay kich thuoc 1/16 cua ma tran (da tinh truoc), luu vao thanh ghi H__VAR_1:L__VAR_1
      ;--------------------------------------------------------------------------
      lds r17, H_OFFSET_MT_1_16
      lds r16, L_OFFSET_MT_1_16
      movw H__VAR_1:L__VAR_1, r17:r16 ; H__VAR_0:L__VAR_0 luu gia tri OFFSET_DATA_16
      
      ;--------------------------------------------------------------------------
      ; khoi tao cac tham so quet tinh
      ;--------------------------------------------------------------------------
      ldi r16, 0
      sts V_NUM_PAGE, r16
      
      ; con tro da duoc dat vao vi tri quet H_SCAN_POINTER:L_SCAN_POINTER
      ; do vay dat thu tuc hieu ung chay vao tai day
      lession_scan_loop_2:
      ldi r16, 0 ; dat bien so lan quet ve 0
      sts V_NUM_SCAN, r16
      
      lds YH, H_OFFSET_PAGE ; SCAN_POINTER = DATA_SCAN + OFFSET_PAGE * V_NUM_PAGE
      lds YL, L_OFFSET_PAGE
      lds r16, V_NUM_PAGE
      mul YL, r16
      movw r3:r2, r1:r0
      mul YH, r16
      add r3, r0
      
      lds YH, H_DATA_SCAN
      lds YL, L_DATA_SCAN
      add YL, r2
      adc YH, r3
      
      movw H__VAR_2:L__VAR_2, YH:YL ; luu lai
      
      ldi r18, 0
      goto_1_4_s2_0:
      movw XH:XL, H_SCAN_POINTER:L_SCAN_POINTER ; dia chi goc
      mul L_OFFSET_MT_1_4, r18
      movw r3:r2, r1:r0
      mul H_OFFSET_MT_1_4, r18
      add r3, r0
      add XL, r2
      adc XH, r3 ; con tro X da nam o vi tri 0xm, 16xm, 32xm, 48xm
      movw H__VAR_3:L__VAR_3, XH:XL ; luu con tro nay lai
      
      mul L__VAR_1, r18 ; OFFSET_DATA_4
      movw r3:r2, r1:r0
      mul H__VAR_1, r18
      add r3, r0
      movw H__VAR_0:L__VAR_0, r3:r2
      
      ldi r19, 0
      goto_1_4_s2_1:
      movw XH:XL, H__VAR_3:L__VAR_3
      ldi r16, SO_LED_1_COT
      mul r16, r19
      add XL, r0
      adc XH, r1
      
      movw YH:YL, H__VAR_2:L__VAR_2
      
      mul L_OFFSET_MT_1_4, r19 ; OFFSET_16
      movw r3:r2, r1:r0 ; quet kieu nay thi kich thuoc ma tran va du lieu nhu nhau
      mul H_OFFSET_MT_1_4, r19
      add r3, r0
      add YL, r2
      adc YH, r3
      
      add YL, L__VAR_0
      adc YH, H__VAR_0
      
      lds r16, NUM_MATRIX_COL
      _copy_byte_chan_1:
      ld r17, Y+
      st X+, r17
      ld r17, Y+
      st X+, r17
      ld r17, Y+
      st X+, r17
      ld r17, Y+
      st X+, r17
      ld r17, Y+
      st X+, r17
      ld r17, Y+
      st X+, r17
      ld r17, Y+
      st X+, r17
      ld r17, Y+
      st X+, r17
      adiw X, SO_LED_1_COT * (GIAN_CACH_1_COT - 1)
      subi r16, 1
      brne _copy_byte_chan_1
      inc r19
      cpi r19, GIAN_CACH_1_COT
      brne goto_1_4_s2_1
      inc r18
      cpi r18, SO_HANG_LED
      brne goto_1_4_s2_0
      
      scan_1_page_loop_2:
      sei ; ngat chi duoc thuc hien tai day
      sbi PORTB, OE ; tat - de dieu chinh do sang
      rcall DIEU_CHINH_DO_SANG
      cli ; cam ngat khi het 1 kiem tra lai V_NUM_SCAN cho chinh xac
      cbi PORTB, OE ; van phai tat bang
      
      lds r16, V_NUM_SCAN
      lds r17, MOVE_SPEED
      cpi r16, 50;r17 ; kiem tra so lan da quet 1 trang (thoi gian hien thi)
      brne scan_1_page_loop_2
      
      lds r17, V_NUM_PAGE
      inc r17
      sts V_NUM_PAGE, r17
      
      lds r16, NUM_FRAME
      cp r17, r16 ; kiem tra xem da het lession hay chua? neu het thi se quay lai main_loop
      brne jmp_lession_scan_loop_2 ; neu chua het thi quay lai lession_scan_loop
      rjmp finish_lession_2
      jmp_lession_scan_loop_2:
      rjmp lession_scan_loop_2
      finish_lession_2:
      ; con tro van duoc dat vao vi tri quet H_SCAN_POINTER:L_SCAN_POINTER
      ; do vay dat thu tuc hieu ung chay ra tai day
      
      ret
      
      DIEU_CHINH_DO_SANG:
      rcall DELAY_1_US
      rcall DELAY_1_US
      rcall DELAY_1_US
      cbi PORTB, OE ; bat bang led
      rcall DELAY_1_US
      ret
      /************************************************** **********************/
      // KET THUC CHUONG TRINH QUET
      /************************************************** **********************/
      
      /************************************************** **********************/
      // INTERRUPTS
      /************************************************** **********************/
      
      ; TIMER1 quet 1 lan chon hang (co 4 lan chon tu 3 - 0)
      ; lan quet dau tien chon hang 3
      ; khi quet het 4 hang (1 trang) thi tang so lan quet V_NUM_SCAN them 1
      ; neu muon tang module thi phai dieu chinh phan cai dat TIMER1
      ; CHU Y: con tro du lieu quet luon tro den block du lieu dia chi H_SCAN_POINTER:L_SCAN_POINTER
      ; co kich thuoc = k.thuoc 1 trang man hinh OFFSET_PAGE
      ; TIMER1 se chia block nay ra 4 phan, moi ngat quet 1 phan
      TIMER1:
      push r16 ; khi quet co the goi ham DELAY_1_US nen phai cat r16
      ; push XH
      ; push XL
      ; push YH
      ; push YL
      ; tinh dia chi cho cac offset
      ; H_SCAN_ADDR:L_SCAN_ADDR = LESSION_DATA + (3 - ROW_SELECT) * OFFSET_1_4
      ; CHU Y: de cho gon - bo bien H_SCAN_ADDR:L_SCAN_ADDR ma thay luon bang cap thanh ghi XH:XL
      ; tinh theo phuong phap nhan xem tai cuoi chuong trinh
      ldi r16, 3
      sub r16, ROW_SELECT
      movw YH:YL, H_SCAN_POINTER:L_SCAN_POINTER
      timer1_cong:
      add YL, L_OFFSET_MT_1_4
      adc YH, H_OFFSET_MT_1_4
      subi r16, 1
      brsh timer1_cong
      
      movw XH:XL, YH:YL
      sub XL, L_OFFSET_MT_1_4 ; khoi tao gia tri so sanh cho vong lap YH:YL
      sbc XH, H_OFFSET_MT_1_4
      
      ; co gang tat bang LED cang muon cang tot nen dat lenh tat o day
      ; chon hang ROW_SELECT
      in r16, PORTB
      ori r16, 0b01000000
      ; |____________ OEControl - cho phep xuat xung - de doc RAM gay ra clock ~ sbi PORTB, OEControl
      andi r16, 0b11111000 ; xoa chan 0 va chan 1
      ; |_______ dong thoi tat bang led (OK) ~ cbi PORTB, 2
      or r16, ROW_SELECT ; cbr r16, 0b00000100 ; tat bang led (OK) ~ cbi PORTB, 2
      out PORTB, r16 ; chon hang
      
      ; bat dau dich du lieu trong RAM
      ; CHU Y: 1 module 512 LED thi can doc 512/4 = 128 byte
      timer1_loop:
      ld r16, X+
      ld r16, X+
      ld r16, X+
      ld r16, X+
      ld r16, X+
      ld r16, X+
      ld r16, X+
      ld r16, X+
      ld r16, X+
      ld r16, X+
      ld r16, X+
      ld r16, X+
      ld r16, X+
      ld r16, X+
      ld r16, X+
      ld r16, X+
      
      ld r16, X+
      ld r16, X+
      ld r16, X+
      ld r16, X+
      ld r16, X+
      ld r16, X+
      ld r16, X+
      ld r16, X+
      ld r16, X+
      ld r16, X+
      ld r16, X+
      ld r16, X+
      ld r16, X+
      ld r16, X+
      ld r16, X+
      ld r16, X+
      cp YL, XL
      cpc YH, XH
      brne timer1_loop
      
      ; da dich du lieu xong
      sbi PORTB, LCH ; mo chot data
      cbi PORTB, LCH ; chot data - thay du lieu moi
      sbi PORTB, OE ; bat bang led (OK) - bat cang som cang tot
      ; nap du lieu tu RAM xong -> tat xuat xung - doc RAM khong gay ra xung (OEC)
      cbi PORTB, OEControl
      ; khi da dich du lieu xong, vi tri hang giam 1 dong thoi tang so lan quet them 1
      ; CHU Y: khi bat dau quet, ROW_SELECT = 3
      subi ROW_SELECT, 1
      brpl exit_timer1 ; hang khac 0
      lds r16, V_NUM_SCAN ; tang so lan quet them 1
      inc r16
      sts V_NUM_SCAN, r16
      ldi ROW_SELECT, 3
      
      exit_timer1:
      ; pop YL
      ; pop YH
      ; pop XL
      ; pop XH
      pop r16
      reti
      
      /************************************************** **********************/
      // Nhan du lieu tu USB, truyen tung block 256 byte mot
      // - Block dau tien khong ghi vao FLASH vi day la HEADER
      // - Ghi xong 256 byte truyen ve PC ky tu 0x4F de xac nhan
      /************************************************** **********************/
      
      UART_RXC:
      in r0, SREG
      
      UART_RXC_LOOP:
      sbis UCSR0A, RXC ; Skip if Bit in I/O Register is Set
      rjmp UART_RXC_LOOP ; cho nhan du 1 byte
      
      ; in r16, UCSRA
      ; cpi r16, 0
      ; breq kiem_tra_trang_thai
      ; reti
      // Nhan data tu USB vao W_RAM, khi du 256 byte thi xu ly du lieu
      // CHU Y: con tro luon nam o dia chi dang cho nhan du lieu (sau byte da nhan)
      // tuong tu: con tro block B_WRITE_BLOCK:H_WRITE_BLOCK cung se nam
      // tai vi tri chuan bi ghi block tiep theo
      
      kiem_tra_trang_thai:
      lds r16, B_TRANSMITING
      cpi r16, 0xA2
      breq dang_truyen
      ldi r16, 0xA2
      sts B_TRANSMITING, r16 ; chuyen sang trang thai truyen
      
      ldi r16, 0 ; cam luon chinh ngat UART
      out UCSR0B, r16
      rjmp RESET_TRANSMIT
      
      dang_truyen:
      ldi XH, HIGH(W_RAM) ; nap dia chi bo dem
      ldi XL, LOW(W_RAM)
      ldi r17, 0
      lds r16, RECEIVE_PNT ; doc gia tri con tro byte dang cho nhan
      add XL, r16 ; cong dia chi bo dem voi gia tri con tro
      adc XH, r17 ; de xac dinh vi tri SRAM dang cho nhan du lieu
      
      in r17, UDR ; nhan 1 byte tu COM
      st X, r17 ; luu vao W_RAM
      inc r16 ; tang gia tri con tro len 1 sau khi nhan
      sts RECEIVE_PNT, r16 ; luu lai con tro
      
      cpi r16, 0 ; nhan du 256 byte hay chua?
      brne rcx_return ; con tro dang nam giua 1..255 => khong ghi vao FLASH
      
      ; nhan du 256 byte roi => bat dau xu ly khoi du lieu nhan duoc
      lds r16, S_HEADER_BLOCK ; kiem tra xem co phai header_block khong
      cpi r16, 0
      breq header_block ; neu dung la header_block
      ; con neu khong phai thi ghi vao FLASH
      ; hoac kiem tra block cuoi cung thi reset
      lds BANK, B_WRITE_BLOCK
      lds HI_ADD, H_WRITE_BLOCK
      ; ghi 256 byte tu SRAM vao FLASH
      ; SRAM [W_RAM] ==write==> FLASH [BANK:HI_ADD:0..255]
      rcall Write_256_byte_to_FLASH ; du lieu duoc ghi tu dia chi W_RAM
      ; tang them 1 block
      ldi r17, 0
      ldi r16, 1
      add HI_ADD, r16
      adc BANK, r17
      ; luu lai
      sts B_WRITE_BLOCK, BANK
      sts H_WRITE_BLOCK, HI_ADD
      rjmp trans_to_PC
      
      header_block: ; phan tich header_block
      ldi r16, 1
      sts S_HEADER_BLOCK, r16 ; da nhan duoc header_block
      ldi XH, HIGH(W_RAM) ; doc gia tri kich thuoc file nhan duoc
      ldi XL, LOW(W_RAM) ; gia su kich thuoc la 2 byte dau tien
      ld r16, X+
      sts B_RECEIVE_SIZE, r16 ; luu lai
      ld r16, X+
      sts H_RECEIVE_SIZE, r16
      
      trans_to_PC: ; truyen lai 1 ky tu de xac nhan da nhan va ghi xong 256 bytes
      rcall DELAY_1_US
      ldi r17, 0x4F
      out UDR, r17 ; Put data (r16) into buffer, sends the data
      
      uart_tcx:
      sbis UCSR0A, UDRE ; Wait for empty transmit buffer
      rjmp uart_tcx
      
      check_end_block: ; kiem tra co phai block cuoi hay khong?
      lds r19, B_RECEIVE_SIZE
      lds r18, H_RECEIVE_SIZE
      lds r17, B_WRITE_BLOCK
      lds r16, H_WRITE_BLOCK
      cp r16, r18
      cpc r17, r19
      brne rcx_return ; neu khong phai la block cuoi
      ldi r16, 0x0 ; neu la block cuoi
      sts B_TRANSMITING, r16 ; chuyen ve trang thai khong truyen
      rjmp RESET_TRANSMIT ; neu la block cuoi thi nhay ve RESET_TRANSMIT
      rcx_return:
      out SREG, r0
      reti
      
      /************************************************** **********************/
      // PHAN GIAO TIEP DOC/GHI FLASH va SRAM
      // .def DATA = r23 ; 1 byte du lieu doc/ghi tu FLASH
      // .def BANK = r22 ; chon high BLOCK PD3, PD4, PD5
      // .def HI_ADD = r25 ; chon low BLOCK PORTC
      // .def LO_ADD = r24 ; dia chi byte trong 256 byte cua BLOCK
      // CHU Y: - Sau khi doc/ghi SRAM hay FLASH thi
      // chuyen ve trang thai mac dinh la truy cap SRAM
      // - Thanh ghi R16 dung
      /************************************************** **********************/
      
      FLASH_Config_Enable: ; r16
      RAM_Config_Disable:
      rcall _RAM_Disable
      rcall _FLASH_Disable
      ldi r16, 0b00000000
      out MCUCR, r16 ; khong cho phep truy xuat RAM ngoai
      ldi r16, 0b11111111
      out DDRA, r16 ; cau hinh chan ra cong A
      out DDRB, r16 ; cau hinh chan ra cong B
      out DDRC, r16 ; cau hinh chan ra cong C
      ldi r16, 0b11111110
      ; ||||||||______ RXD
      ; |||||||_______ TXD
      ; ||||||________ PD2 - Chip select 1 - SRAM, 0 - ROM
      ; |||||_________ PD3 - A16 ROM
      ; ||||__________ PD4 - A17 ROM, KEY1
      ; |||___________ PD5 - A18 ROM, KEY2
      ; ||____________ WRITWE ENABLE - /WE
      ; |_____________ READ ENABLE - /OE
      out DDRD, r16 ; cau hinh chan vao ra cong D
      ldi r16, 0b111
      out DDRE, r16 ; cau hinh chan ra cong E
      rcall _FLASH_Enable
      ret
      
      RAM_Config_Enable: ; r16
      FLASH_Config_Disable:
      rcall _FLASH_Disable
      rcall _RAM_Disable
      ldi r16, 0b10000000 ; cho phep truy xuat RAM ngoai
      out MCUCR, r16
      rcall _RAM_Enable
      ret
      
      _ALEEnable: ; ALEEnable{ALEPin=1;#asm("NOP");ALEPin=0;}
      sbi PORTE, ALEPin
      nop
      cbi PORTE, ALEPin
      ret
      _ALEDisable: ; ALEDisable{ALEPin=0;ALEPin=1;}
      cbi PORTE, ALEPin
      sbi PORTE, ALEPin
      ret
      _ReadEnable: ; ReadEnable{ReadPin=1;ReadPin=0;}
      sbi PORTD, ReadPin
      cbi PORTD, ReadPin
      ret
      _ReadDisable: ; ReadDisable {ReadPin=0;ReadPin=1;}
      cbi PORTD, ReadPin
      sbi PORTD, ReadPin
      ret
      _WriteEnable: ; WriteEnable {WritePin=1;WritePin=0;}
      sbi PORTD, WritePin
      cbi PORTD, WritePin
      ret
      _WriteDisable: ; WriteDisable {WritePin=0;WritePin=1;}
      cbi PORTD, WritePin
      sbi PORTD, WritePin
      ret
      
      _RAM_Enable: ; chon RAM muc tich cuc cao
      cbi PORTB, RAMSelect
      sbi PORTB, RAMSelect
      ret
      _RAM_Disable:
      sbi PORTB, RAMSelect
      cbi PORTB, RAMSelect
      ret
      _FLASH_Enable: ; chon FLASH muc tich cuc thap
      sbi PORTB, FLASHSelect
      cbi PORTB, FLASHSelect
      ret
      _FLASH_Disable:
      cbi PORTB, FLASHSelect
      sbi PORTB, FLASHSelect
      ret
      
      ; do kich thuoc W29C040 co 7:FF:FF dia chi nen phai chon bank 0..7
      BankSelect: ; r16
      ldi r16, 4
      mul BANK, r16
      in r16, PORTD
      andi r16, 0b11100011 ; chu y cac chan P16, P17, P18 noi nhu the nao
      or r16, r0
      out PORTD, r16
      ret
      
      ; Chot dia chi
      AddressLatch: ; r16
      rcall BankSelect
      ldi r16, 0
      out LowAddressPort, r16 // PORTA
      nop
      ldi r16, 0xFF
      out DataPortDir, r16 // DDRA (dat A la cong ra)
      nop
      out HighAddressPort, HI_ADD // PORTD
      out LowAddressPort, LO_ADD
      rcall _ALEEnable
      ret
      
      ; Ghi FLASH phai co thu tuc nay de bao ve du lieu
      ; truoc khi ghi 256 byte vao flash thi can ghi 3 byte truoc 256 byte
      EnProtect: ; LO_ADD, DATA
      push BANK
      push HI_ADD
      
      ldi BANK, 0x0
      ldi HI_ADD, 0x55
      ldi LO_ADD, 0x55
      ldi DATA, 0xAA
      rcall WriteByte
      ldi HI_ADD, 0x2A
      ldi LO_ADD, 0xAA
      ldi DATA, 0x55
      rcall WriteByte
      ldi HI_ADD, 0x55
      ldi LO_ADD, 0x55
      ldi DATA, 0xA0
      rcall WriteByte
      
      pop HI_ADD
      pop BANK
      ret
      
      ; Write a byte [DATA] to [BANK:HI_ADD:LO_ADD]
      WriteByte: ; r16
      rcall _ReadDisable
      rcall AddressLatch
      rcall _WriteEnable
      out DataPortOut, DATA
      nop
      nop
      rcall _WriteDisable
      nop
      ; nop
      ; nop
      ; nop
      ret
      
      ; Read a byte [BANK:HI_ADD:LO_ADD] to [DATA]
      Read_1_byte: ; r16, DATA
      rcall FLASH_Config_Enable
      rcall _WriteDisable
      rcall AddressLatch
      ldi r16, 0xFF
      out DataPortOut, r16
      nop
      ldi r16, 0
      out DataPortDir, r16 ; DDRA (dat A la cong vao)
      rcall _FLASH_Enable
      rcall _ReadEnable
      nop
      in DATA, DataPortIn
      nop
      nop
      rcall _FLASH_Disable
      rcall _ReadDisable
      rcall RAM_Config_Enable ; doc xong roi => active SRAM
      ret
      
      ; Write 256 bytes from SRAM [W_RAM] to FLASH [BANK:HI_ADD:0..255]
      Write_256_byte_to_FLASH: ; XH, XL, LO_ADD, DATA
      sbi PORTD, Busy
      rcall FLASH_Config_Enable
      rcall EnProtect ; EnProtect FLASH for write
      ldi XH, HIGH(W_RAM)
      ldi XL, LOW(W_RAM)
      ldi LO_ADD, 0
      loop_write_page:
      ; rcall RAM_Config_Enable ; lay du lieu tu ExSRAM
      ld DATA, X+ ; neu su dung 256 byte RAM trong thi khong can phai config
      ; rcall FLASH_Config_Enable
      rcall WriteByte
      inc LO_ADD
      cpi LO_ADD, 0
      brne loop_write_page
      rcall DELAY_1_MS
      ; rcall DELAY_5_MS
      rcall RAM_Config_Enable ; ghi xong roi => active SRAM
      cbi PORTD, Busy
      ret
      
      ; Read [H_DATA_SIZE:L_DATA_SIZE] bytes form FLASH [BANK:HI_ADD:LO_ADD] to SRAM [R_RAM]
      Read_a_FLASH_block_to_SRAM: ;
      sbi PORTD, Busy
      lds ZH, H_DATA_SIZE ; kich thuoc 1 block
      lds ZL, L_DATA_SIZE
      lds XH, H_R_RAM_ADD ; dia chi luu du lieu cua RAM khi doc 1 block
      lds XL, L_R_RAM_ADD
      loop_read_FLASH:
      rcall Read_1_byte
      st X+, DATA
      adiw HI_ADD:LO_ADD, 1
      brcc in_bank
      inc BANK
      in_bank:
      sbiw ZH:ZL, 1 ; giam 1 byte
      brbc 1, loop_read_FLASH
      cbi PORTD, Busy
      ret
      
      /************************************************** **********************/
      // KET THUC PHAN GIAO TIEP
      /************************************************** **********************/
      
      /************************************************** **********************/
      // CAC HAM PHU (Delays...)
      /************************************************** **********************/
      
      DELAY_1_US:
      push r16
      ldi r16, 9
      loop_delay_1_us:
      dec r16
      cpi r16, 0
      brne loop_delay_1_us
      pop r16
      ret
      
      DELAY_5_MS:
      push r16
      push r17
      ldi r16, 0
      ldi r17, 0
      loop_delay_5_ms:
      inc r16
      cpi r16, 0
      brne loop_delay_5_ms
      inc r17
      cpi r17, 0
      brne loop_delay_5_ms
      pop r17
      pop r16
      ret
      
      DELAY_1_MS:
      push r16
      push r17
      ldi r16, 250
      ldi r17, 0
      loop_delay_1_ms:
      inc r16
      cpi r16, 0
      brne loop_delay_1_ms
      inc r17
      cpi r17, 0
      brne loop_delay_1_ms
      pop r17
      pop r16
      ret
      
      .eseg
      
      /************************************************** **********************/
      // END
      /************************************************** **********************/
      
      /*MAP_1_COLOR:
      .db 0x00, 0x10, 0x20, 0x30, 0x01, 0x11, 0x21, 0x31, 0x02, 0x12, 0x22, 0x32, 0x03, 0x13, 0x23, 0x33
      .db 0x04, 0x14, 0x24, 0x34, 0x05, 0x15, 0x25, 0x35, 0x06, 0x16, 0x26, 0x36, 0x07, 0x17, 0x27, 0x37
      .db 0x08, 0x18, 0x28, 0x38, 0x09, 0x19, 0x29, 0x39, 0x0A, 0x1A, 0x2A, 0x3A, 0x0B, 0x1B, 0x2B, 0x3B
      .db 0x0C, 0x1C, 0x2C, 0x3C, 0x0D, 0x1D, 0x2D, 0x3D, 0x0E, 0x1E, 0x2E, 0x3E, 0x0F, 0x1F, 0x2F, 0x3F
      MAP_3_COLOR:
      .db 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00*/
      
      /* ldi r16, 3
      sub r16, ROW_SELECT
      mul r16, L_OFFSET_MT_1_4
      movw r2, r0 ; L = r2
      mul r16, H_OFFSET_MT_1_4
      add r3, r0 ; H = r3
      movw XH:XL, H_SCAN_POINTER:L_SCAN_POINTER
      add XL, r2
      adc XH, r3
      movw YH:YL, XH:XL
      add YL, L_OFFSET_MT_1_4 ; khoi tao gia tri so sanh cho vong lap YH:YL
      adc YH, H_OFFSET_MT_1_4
      */
      TEL: 098.3603646
      QUADROTOR QUADCOPTER MULTIROTOR QUAD QUAD Made in Vietnam

      Comment


      • #4
        3. Chương trình soạn thảo

        Thực chất chương trình soạn thảo chỉ là 1 công cụ để chuyển mọi thứ cần hiển thị thành điểm ảnh matrix.
        Mình dùng VC6 Win32 vì đã quen rồi, nó hỗ trợ các hàm API và GDI hiệu quả, khi dùng thì bạn nào mod lại bằng C# hoặc VB đều được.
        Attached Files
        Last edited by phuongmd; 19-02-2011, 00:35. Lý do: không ngủ được
        TEL: 098.3603646
        QUADROTOR QUADCOPTER MULTIROTOR QUAD QUAD Made in Vietnam

        Comment


        • #5
          4. Một số sản phẩm

          Mình đã viết phần chạy từ phải sang (thông dụng nhất)
          Các phần khác thì các bạn có thể tự phát triển theo ý của mình.
          TEL: 098.3603646
          QUADROTOR QUADCOPTER MULTIROTOR QUAD QUAD Made in Vietnam

          Comment


          • #6
            BÁc cho em hỏi sơ đồ modul V701CE 1 màu ntn nhỉ? em mua về, lập trình cho nó mà hiện thị chả đúng
            Bác có vd bằng codevisionAVR ATMGA thì cho em tham khảo nha.tks bác
            Đối với Tôi Đam mê là yếu tố không thể thiếu để quyết định sự Thành Công ...!
            Gmail: -Mobile: 0989.194.472

            Comment


            • #7
              Modul 1 màu

              Loại modul V701 như bạn hỏi đó là loại 1 màu pit 10, kiểu quét 1/4
              Để quét được nó thì bạn hãy tham khảo hình minh họa sau
              Chú ý là hình này tôi vẽ nhìn từ phía sau modul

              - Bạn phải kiểm tra lại vị các điểm ảnh cần hiển thị trong dữ liệu của mình sao cho đúng thứ tự tương ứng với các vị trí của nó trên modul mà bộ điều khiển đẩy ra theo trình tự liên tục. Để làm được điều này thì có thể là theo nhiều cách:
              Cách thứ nhất là tạo ra 1 bảng ánh xạ 1-1 từ dữ liệu sang modul
              Cách thứ 2 là tính toán theo 1 công thức tổng quát (mình làm cách này vì khi thay đổi chiều dài bảng thì không phải thay đổi bảng ánh xạ nhưng tốc độ có thể chậm hơn).
              - Ngoài ra bạn cần chú ý: trên thị trường nó bán 2 loại V01.
              Loại chân OE mức tích cực thấp là loại có 1 con 74HC04 phía sau
              Loại chân OE mức tích cực cao thì mạch in của nó y chang loại trên nhưng không có con đảo - loại này ít bán nhưng không để ý mà lắp nhầm với nhau thì cũng không chạy được mặc dù nó không chết.
              Bác có vd bằng codevisionAVR ATMGA thì cho em tham khảo nha.tks bác
              Mình không dùng CAVR nên không quen, mà cũng khuyên các bạn nên dùng ASM vì để tránh rườm rà khi viết thủ tục để tránh lãng phí tài nguyên. (Các bạn cũng hiểu rằng viết chương trình quét LED thì ưu tiên quan trọng nhất là tốc độ đáp ứng để có thể đạt được hình ảnh đẹp nhất, nếu phương pháp lập trình quét không tối ưu thì chất lượng cũng rất kém và hạn chế chiều dài của bảng mà con AVR có thể đảm nhận được.)
              Vậy tối ưu bằng cách nào:
              - Tư duy theo thuật toán
              - Công cụ lập trình...
              - Tiết kiêm tài nguyên, kể cả chỉ là 1 lệnh.
              Chẳng hạn khi bạn thực hiện disassembler 1 chương trình mà CAVR biên dịch thì thấy tương đối lủng củng tuy rất chặt chẽ. Nếu dùng nhiều biến thanh ghi thì hỡi ôi, lệnh push và pop chiếm khá nhiều. Tuy vậy không hoàn toàn phải sử dụng ngôn ngữ là ASM nhưng trường hợp thực hiện thủ tục quét thì bạn hãy nhúng ngay thẻ ASM vào đó...
              Còn tiếp!
              Attached Files
              TEL: 098.3603646
              QUADROTOR QUADCOPTER MULTIROTOR QUAD QUAD Made in Vietnam

              Comment


              • #8
                bác vui lòng gửi file hình vẽ kèm theo luôn dc ko? em cũng rất đam mê led quang báo nhưng ko có điều kiện để nghiên cứu và kinh nghiệm như bác .mong bác giúp đỡ.ko biết bác có viết led matrix nhiềuu màu hay ko ? xin hay giải thích hướng dẫn cho em với ,nhất là cách quét led để tạo ra các mày khác nhau.
                thanks bac nhiều

                Comment


                • #9
                  Hình đây

                  Phải công nhận là nhiều bạn nghiện ngập cái này ghê


                  Hàng bên SaoKim - chất lượng tốt - cho 9 điểm


                  Mặt trên


                  Mặt dưới


                  Hoàn chỉnh




                  Attached Files
                  Last edited by phuongmd; 20-02-2011, 09:08.
                  TEL: 098.3603646
                  QUADROTOR QUADCOPTER MULTIROTOR QUAD QUAD Made in Vietnam

                  Comment


                  • #10
                    bác có thể hướng dẫn làm 1 cái load font chữ cho matrix bằng vc được ko .

                    Comment


                    • #11
                      Em đang làm đồ án về cái này, chạy mô phỏng ok rồi mà khi hiện thị lên mạch thực tế lại không đúng ( em nghĩ bo V701CE của em lỗi 74595 vì không thấy tín hiện xuất vào đó nên hình ảnh không thay đổi...)
                      Bác nào biết xem mô phỏng của em lỗi gì chỉ giúp ạ.
                      Bác phuongmd giúp em chút được không ạ.tks ( hôm qua em có goi cho bác theo số trên này đó. nhưng thấy bác nhắn tin. em gọi lại lại không liên lạc được. hihi )
                      link ạ: http://www.mediafire.com/?vdoxrdps33vyeoi
                      Đối với Tôi Đam mê là yếu tố không thể thiếu để quyết định sự Thành Công ...!
                      Gmail: -Mobile: 0989.194.472

                      Comment


                      • #12
                        Sơ đồ modul bạn thiết kế có thể chưa đúng, hiển thị mạch thực tế như thế nào lại không đúng thì mình chưa nhìn thì không biết được. Bạn hãy thử từng hàng và đẩy data lần lượt để xem thế nào.
                        Thử chọn thế này:
                        A = 0
                        B = 0 ; hàng 0, 4, 8, 12
                        En = 0
                        R = 1
                        CLK = 0
                        CLK = 1 ; clock
                        LCK = 1
                        LCK = 0 ; chốt
                        EN = 1
                        ; xong 1 pixel
                        Sau đó dịch lần lượt từng điểm một xem thế nào.
                        Chúc bạn thành công!
                        Last edited by phuongmd; 20-02-2011, 20:47.
                        TEL: 098.3603646
                        QUADROTOR QUADCOPTER MULTIROTOR QUAD QUAD Made in Vietnam

                        Comment


                        • #13
                          Chương trình thiết kế

                          Tình hình là có rất nhiều bạn gọi điện và mail để xin phần chương trình thiết kế LED Matrix. Mình cũng xin tặng anh em để tìm hiểu và nên phát triển tiếp thành 1 sản phẩm chung để cùng chia sẻ cho mọi người.
                          Tuy nhiên đặt luồng này ở topic AVR cũng không hợp lý lắm nên có lời nhắn đến các MOD cho nhờ đất để ở đây vì nó cũng có liên quan rất nhiều đến AVR // thanks a lot.
                          Chương trình mình viết bằng Win32 VC6 nên các bạn cần phải có MSVS6.0 ngoài ra cần thêm bộ MSDN thì càng tốt. Trong chương trình có nhiều kỹ thuật mà các bạn có thể ứng dụng được cho các phần mềm của chính mình sau này:
                          - Bộ đệm ảo HDC (virtual device context)
                          - Nhận diện cổng COM tự động
                          - SFLASH
                          - Catch screen
                          - Việt hóa các controler và thao tác với các commond controler...
                          Vì không có thời gian nên còn nhiều việc mình chưa làm: chẳng hạn như multi thread, hand-shack... và cả chiếc đồng hồ kia nữa, các bạn cố gắng tiếp tục nhé. Mình sẽ giúp đỡ.
                          Chúc các bạn thành công!
                          Attached Files
                          Last edited by phuongmd; 21-02-2011, 11:20.
                          TEL: 098.3603646
                          QUADROTOR QUADCOPTER MULTIROTOR QUAD QUAD Made in Vietnam

                          Comment


                          • #14
                            Nguyên văn bởi phuongmd Xem bài viết
                            Sơ đồ modul bạn thiết kế có thể chưa đúng, hiển thị mạch thực tế như thế nào lại không đúng thì mình chưa nhìn thì không biết được. Bạn hãy thử từng hàng và đẩy data lần lượt để xem thế nào.
                            Thử chọn thế này:
                            A = 0
                            B = 0 ; hàng 0, 4, 8, 12
                            En = 0
                            R = 1
                            CLK = 0
                            CLK = 1 ; clock
                            LCK = 1
                            LCK = 0 ; chốt
                            EN = 1
                            ; xong 1 pixel
                            Sau đó dịch lần lượt từng điểm một xem thế nào.
                            Chúc bạn thành công!
                            Tks bác nhiều nhé, cái modul led TQ mua trước quên không test bị nó " lừa" đưa cho cái bo bị lỗi 74hc595, mua bo khác được luôn. hiiiii
                            Đối với Tôi Đam mê là yếu tố không thể thiếu để quyết định sự Thành Công ...!
                            Gmail: -Mobile: 0989.194.472

                            Comment


                            • #15
                              Mình cũng đã từng làm led ma trận rồi, 1 màu thôi, dùng PIC, 4 con 595 và 1 con 138! Đã viết được chương trình (ngôn ngữ C) để hiển thị chữ nhưng vẫn chưa dịch trái, dịch phải cho nó được, công lực code còn thấp quá!

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X