Thông báo

Collapse
No announcement yet.

Ai rành ASM cho hỏi code chút xíu.

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

  • Ai rành ASM cho hỏi code chút xíu.

    Mình có 2 đoạn code dùng để chạy viền mà mình đang nhức đầu về vụ này.Ai rành chĩ mình cái.
    đoan1:
    Code:
    MOV   R5,#0
    INC	R5
    	CJNE	R5,#16,SANGVIEN
    	CJNE	R5,#80,VIENCHAY
    	MOV	R5,#0
    	LJMP	SANGVIEN
    ;------------------------------------------------------
    SANGVIEN:
    	SETB	P1.1	
    	SETB	P1.0
    	LJMP	EXITISR
    ;---
    VIENCHAY:
    	INC	R4
    	CJNE	R4,#1,LOOPVIENCHAY
    	CLR	P1.1
    	SETB	P1.0	
    	LJMP	EXITISR
    LOOPVIENCHAY:
    	CJNE	R4,#2,EXITISR
    	SETB	P1.1
    	CLR	P1.0
    	MOV	R4,#0
    	LJMP	EXITISR	
    EXITISR:
    	RETI
    Theo như doạn code1 thì mạch chạy SANGVIEN 16 lần rùi chạy VIENCHAY mà mình mô phỏng thì chạy dc 16 lần SANGVIEN rồi đến lúc VIENCHAY thì nó chớp tắt 1 còn led o P1.1 rùi sáng hết lun.

    Đoạn 2:
    Code:
    MOV   R4,#0
    INC	R4
    	CJNE	R4,#16,KTVIENX
    	LJMP	SANGVIEN
    KTVIENX:
    	JC	SANGVIEN
    	CJNE	R4,#40,VIENCHAY
    	MOV	R4,#0
    	LJMP	SANGVIEN
    ;------------------------------------------------------
    SANGVIEN:
    	SETB	P1.1	
    	SETB	P1.0
    	LJMP	EXITISR
    ;---
    VIENCHAY:
    	INC	R2
    	CJNE	R2,#1,LOOPVIENCHAY
    	CLR	P1.1
    	SETB	P1.0	
    	LJMP	EXITISR
    LOOPVIENCHAY:
    	CJNE	R2,#2,EXITISR
    	SETB	P1.1
    	CLR	P1.0
    	MOV	R2,#0
    	LJMP	EXITISR	
    EXITISR:
    RETI
    Theo code doan 2 thì mạch chay on định mà mình không hieu cho lắm. Cái cau lệnh JC SANGVIEN khi mình bỏ đi thì nó không chạy sáng viền nữa. Mà mình nghĩ câu JC là nhảy khi cờ CY =1 đâu liên quan tới gì đâu.Mình chắc chắn rằng code mình không có lệnh MOV,DIV,ADD,SUB gì hết.
    Cái code này mình dùng trong chuong trình ngắt.
    Bạn nào biết chỉ mình với.Đang nhức đầu wá.Code đúng thì chạy sai còn code sai thì chay đúng.
    Last edited by shogunvn; 10-12-2010, 10:33.

  • #2
    cái đề bài như thế nào dậy, code 1 bạn để nhãn cho ngắt ở chỗ nào dậy, nếu để ngay chỗ mov r5,#0 thì làm sao được.
    Ở code 1 trong chương trình chính bạn có sử dụng R4 không? nếu có làm R4 tăng thì chắc là bị sai rùi

    Comment


    • #3
      Code:
      $MOD51
      	ORG	00H			;DIEM NHAP RESET
      	LJMP	MAIN			;NHAY QUA KHOI CAC VECTOR NGAT
      	ORG	001BH			;DIEM NHAP ISR CUA TIMER 1
      	LJMP	T1ISR			;LENH NHAY DEN ISR CUA TIMER1
      	ORG	0030H			;DIEM NHAP CUA CHUONG TRINH CHINH
      MAIN:	
      	MOV   P1,#0H
      	MOV	P2,#00H
      	MOV	P3,#00H
      	MOV	R3,#01H
      	MOV	R5,#0
      	MOV	R4,#0
      	MOV	IE,#88H		;CHO PHEP NGAT TIMER1 HOAT DONG
      	MOV	TMOD,#11H
      	MOV	TH1,#HIGH (-2000)
      	MOV	TL1,#LOW (-2000)
      	SETB	TR1			;CHO PHEP TIMER1 HOAT DONG
      START:		
      	LCALL	NHAYMUNGCHUAGIANGSINH
      	LJMP	START
      NHAYMUNGCHUAGIANGSINH:
      	MOV	R6,#3			;NHAY 3 LAN
      	CLR	P1.2
      	CLR	P1.3
      	CLR	P1.4
      	CLR	P1.5
      	CLR	P1.6
      	CLR	P1.7
      LOOPMUNGCHUAGIANGSINH:
      	MOV	P2,#0FFH		;SANG "MUNG CHUA"
      	MOV	P3,#0FFH		;SANG "GIANG SINH"
      	LCALL	DELAY2
      	MOV	P2,#00H		;TAT "MUNG CHUA"
      	MOV	P3,#00H		;TAT "GIANG SINH"
      	LCALL	DELAY2
      	DJNZ	R6,LOOPMUNGCHUAGIANGSINH	;NHAY 3 LAN
      RET
      DELAY:
      	MOV     TMOD,#11H    
      	MOV     R1,#50
      LOOPDELAY:
      	MOV     TH0,#HIGH (-1000)
      	MOV     TL0,#LOW (-1000)
      	SETB    TR0
      	JNB     TF0,$
      	CLR     TF0
      	CLR     TR0
      	DJNZ    R1,LOOPDELAY
      	RET
      ;------------------------------------------------------
      DELAY2:
      	MOV	R2,#8
      LOOPDELAY2:
      	LCALL	DELAY
      	DJNZ	R2,LOOPDELAY2
      RET
      ;------------------------------------------------------
      T1ISR:
      	CLR	TR1
      	CLR	TF1
      	INC	R3
      	MOV	TH1,#HIGH (-3000)
      	MOV	TL1,#LOW (-3000)
      	CJNE	R3,#100,EXITISR
      	MOV	R3,#0
      ;---
      	INC	R5
      	CJNE	R5,#16,KTVIENX
      	LJMP	SANGVIEN
      KTVIENX:
      	JC	SANGVIEN
      	CJNE	R5,#80,VIENCHAY
      	MOV	R5,#0
      ;------------------------------------------------------
      SANGVIEN:
      	SETB	P1.1	
      	SETB	P1.0
      	LJMP	EXITISR
      ;---
      VIENCHAY:
      	INC	R4
      	CJNE	R4,#1,LOOPVIENCHAY
      	CLR	P1.1
      	SETB	P1.0	
      	LJMP	EXITISR
      LOOPVIENCHAY:
      	CJNE	R4,#2,EXITISR
      	SETB	P1.1
      	CLR	P1.0
      	MOV	R4,#0
      	LJMP	EXITISR	
      EXITISR:
      	SETB	TR1
      	RETI
      END
      Code hoàn chỉnh lun đóa.Ai giúp mình với chứ mai là nộp rùi.

      Comment


      • #4
        Mình không hiểu lắm mạch bạn chạy như thế nào nên đọc code bị loạn xạ, nhưng mình thấy lệnh
        JC SANGVIEN
        là chịu ảnh hưởng bởi lệnh
        CJNE R5,#16,KTVIENX
        Sau lệnh này nếu R5 # 16 thì sẽ nhảy kiểm tra viền, đồng thời nếu R5 <16 thì cờ nhớ CY=1, do đó theo chương trình của bạn thì được hiểu như nếu R5 <= 16 thì nhảy đến sáng viền. không biết có đúng ko

        Comment


        • #5
          Haha.Bạn nói câu đó mình mới coi lại sách và thấy rằng lệnh CJNE có ảnh hưởng đến cờ CY.Lâu quá không ôn lại nên gà thật.Thanks bạn rất nhiều.Mà bạn cho mình hỏi đoạn code dau tiên mình thấy đúng mà sao nó chạy chuong trinh VIENCHAY dc 1 lần rùi tắt àh.

          Comment


          • #6
            chào cả nhà .
            mình đang làm đồ án về vdk 89x quảng cáo .các anh chị cho mình hỏi là mình đang định làm viền chạy kiểu sao băng 16bit (2 port)
            nhưng ko bit lập trình kiểu đó zay các anh chị pit hay chi cho e zoi lập trình asm nha
            mail: changhoangtuhaohoa@gmail.com

            Comment

            Về tác giả

            Collapse

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

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

            Collapse

            Đang tải...
            X