Hiển Thị số 00 - 99 trên led 7 đoạn ( code asm )

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • dien44
    Nhập môn đệ tử
    • Sep 2010
    • 4

    #1

    Hiển Thị số 00 - 99 trên led 7 đoạn ( code asm )

    Chào mọi người. Em là người mới tham gia vào học PIC. em có viết 1 chương trình để hiển thị các số từ 00 - 99 bằng có asm như nó không chạy được. Em k biết bị lỗi ở chỗ nào, mong mọi người xem giúp và cho em vài ý kiến.
    Code như sau:
    Code:
    ;=========================================
    ;CHUONG TRINH DIEU KHIEN LED 7 DOAN HIEN THI CAC SO TU 0 - 99
    ;=========================================
    PROCESSOR	16F877A			;khai bao vi dieu khien
    INCLUDE		<p16f877a.inc>	;file header cua vi dieu khien
    ;====================================================
    							;khai bao cac bien cau hinh
    __CONFIG	_CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF
    ;====================================================
    							;khai bao dia chi cac thanh ghi dung cho chuong trinh delay
    count1		EQU	0x20
    counta		EQU	0x21
    countb		EQU	0x22
    COUNT_DV	EQU	0x23
    COUNT_CHUC	EQU	0x24
    ;====================================================
    			ORG	0x00		;dia chi bat dau chuong trinh
    	GOTO	start
    start
    							;chon BANK0 de xoa PORTB, PORTD
    	BCF		STATUS,RP0
    	BCF		STATUS,RP1
    	CLRF	PORTB
    	CLRF	PORTD
    							;chon BANK1 de set portb, d la output
    	BSF		STATUS,RP0
    	MOVLW	0x00
    	MOVWF	TRISB
    	MOVLW	0x00
    	MOVWF	TRISD
    							;chon lai bank 0 de xuat gia tri mong muon ra portb
    	BCF		STATUS,RP0
    
    	CLRF	COUNT_DV
    	CLRF	COUNT_CHUC
    	INCF	COUNT_CHUC,1
    	GOTO	loop
    ;QUY DINH. PORT B XUAT HANG CHUC, PORT D XUAT HANG DON VI
    ;o day dung led co cac cathode noi cung 1 diem. --> sang o muc 1
    ;==============================================================
    loop
    	INCF	COUNT_DV,1
    	MOVF	COUNT_DV,0
    	XORLW	D'10'
    	BTFSC	STATUS,Z
    	GOTO	reset_
    	GOTO	sang
    reset_
    	CLRF	COUNT_DV
    	INCF	COUNT_CHUC,1
    	GOTO	loop
    sang
    	;MOVF	COUNT_DV,0
    	CALL	table
    	MOVWF	PORTD
    	CALL	delay_100ms
    ;----------- COPY NOI DUNG PCL VAO COUNT_DV, SAU DO XOA PCL DI ---------
    	MOVF	PCL,0
    	MOVWF	COUNT_DV
    	CLRF	PCL
    ;----------- DUA GIA TRI CUA THANH COUNT_CHUC VAO THANH PCL -----------
    	MOVF	COUNT_CHUC,0
    	CALL	table
    	MOVWF	PORTB
    	CALL	delay_100ms
    ;---------- LUU NOI DUNG PCL VAO COUNT_CHUC VA XOA PCL DI -------------
    	MOVF	PCL,0
    	MOVWF	COUNT_CHUC
    	CLRF	PCL
    ;----------- TRO VE CHUONG TRINH CHINH --------------------------------
    	GOTO	loop
    	
    table
    	ADDWF	PCL,1
    						;so_0
    	RETLW	b'00111111'
    						;so_1
    	RETLW	b'00000110'
    						;so_2
    	RETLW	b'01011011'
    						;so_3
    	RETLW	b'01001111'
    						;so_4
    	RETLW	b'01100110'
    						;so_5
    	RETLW	b'01101101'
    						;so_6
    	RETLW	b'01111100'
    						;so_7
    	RETLW	b'00000111'
    						;so_8
    	RETLW	b'01111111'
    						;so_9
    	RETLW	b'01101111'
    
    delay_100ms
    	MOVLW	d'250'
    	MOVWF	count1
    d1
    	MOVLW	0xC7
    	MOVWF	counta
    	MOVLW	0x01
    	MOVWF	countb
    delay_0
    	DECFSZ	counta,1
    	GOTO	$+2
    	DECFSZ	countb,1
    	GOTO	delay_0
    	DECFSZ	count1,1
    	GOTO	d1
    	RETLW	0x00
    END
  • dien44
    Nhập môn đệ tử
    • Sep 2010
    • 4

    #2
    sao khong ai giup het vay???????????????????

    Comment

    • hcmut.khoamaisi
      Đệ tử 4 túi
      • Dec 2009
      • 79

      #3
      Nguyên văn bởi dien44 View Post
      sao khong ai giup het vay???????????????????
      Không có sơ đồ nguyên lí !Bạn không nêu rõ là lỗi gì !Làm sao giúp
      My blog: http://autumnneverreturn.blogspot.com/
      Đối thủ khó chiến thắng nhất là bản thân !!!

      Comment

      • dien44
        Nhập môn đệ tử
        • Sep 2010
        • 4

        #4
        Mình biên dịch thì chẳng xảy ra lỗi gì cả, nhưng khi mô phỏng trong prouteus thì nó k biết sao không chạy được. Mình cũng k biết lỗi gì nên mới mong mọi người xem giúp, chứ biết lỗi gì rồi thì nói làm gì nữa. Cảm ơn bạn đã tl

        Comment

        • sonluyen
          Nhập môn đệ tử
          • May 2010
          • 9

          #5
          PROCESSOR 16F877A ;khai bao vi dieu khien
          #INCLUDE <p16f877a.inc> ;file header cua vi dieu khien
          ;================================================= ===
          ;khai bao cac bien cau hinh
          __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF
          ;================================================= ===
          ;khai bao dia chi cac thanh ghi dung cho chuong trinh delay
          count1 EQU 230h
          counta EQU 240h
          countb EQU 250h
          COUNT_DV EQU 260h
          COUNT_CHUC EQU 270h
          ;================================================= ===
          ORG 0000h ;dia chi bat dau chuong trinh

          ;chon BANK0 de xoa PORTB, PORTD
          BCF STATUS,RP0
          BCF STATUS,RP1
          CLRF PORTB
          CLRF PORTD
          ;chon BANK1 de set portb, d la output
          BSF STATUS,RP0
          MOVLW d'0'
          MOVWF TRISB
          MOVLW d'0'
          MOVWF TRISD
          ;chon lai bank 0 de xuat gia tri mong muon ra portb
          BCF STATUS,RP0
          CLRF COUNT_DV
          CLRF COUNT_CHUC
          ;QUY DINH. PORT B XUAT HANG CHUC, PORT D XUAT HANG DON VI
          ;o day dung led co cac cathode noi cung 1 diem. --> sang o muc 1
          ;================================================= =============
          LOOP4
          MOVF COUNT_DV,W
          CALL table
          MOVWF PORTD
          CALL delay_100ms
          INCF COUNT_DV,0
          MOVF COUNT_DV,w
          XORLW D'9'
          BTFSC STATUS,2
          GOTO resetDV
          GOTO TINHOK
          TINHOK
          INCF COUNT_DV,1
          ;----------- DUA GIA TRI CUA THANH COUNT_CHUC VAO THANH PCL -----------
          MOVF COUNT_CHUC,W
          CALL table
          MOVWF PORTB
          CALL delay_100ms
          ;======================KIEM TRA 100 CHUA,100 ROY THI COMBACK ===========
          MOVF COUNT_CHUC,w
          XORLW D'10'
          BTFSC STATUS,2
          GOTO TINHOK2
          GOTO LOOP4
          ;=================CHUONG TRINH CON===========================
          resetDV
          CLRF COUNT_DV
          INCF COUNT_CHUC,1
          GOTO LOOP4
          TINHOK2
          CLRF COUNT_CHUC
          GOTO LOOP4
          ;====================GOI BANG--------------------

          table
          ADDWF PCL,1
          ;so_0
          RETLW b'00111111'
          ;so_1
          RETLW b'00000110'
          ;so_2
          RETLW b'01011011'
          ;so_3
          RETLW b'01001111'
          ;so_4
          RETLW b'01100110'
          ;so_5
          RETLW b'01101101'
          ;so_6
          RETLW b'01111100'
          ;so_7
          RETLW b'00000111'
          ;so_8
          RETLW b'01111111'
          ;so_9
          RETLW b'01101111'
          ;======================DELAY====================== ==
          delay_100ms
          MOVLW d'250'
          MOVWF count1
          loop1
          DECFSZ count1,1
          goto loop2
          return
          loop2
          movlw d'250'
          movwf counta
          loop3
          decfsz counta,1
          goto loop3
          goto loop1
          end

          đây là bài sữa hoàn chỉnh
          lỗi đầu tiên của bạn là mới vào đã gắn 1 vào thanh "count_dv" và "count_chuc" vì như vậy thi khi vào bảng(table) và khi xuất ra sẽ là số 1.
          lỗi thứ 2 là theo mình nghĩ bạn nên xuat ra xong rồi hãy kiểm tra xem đã đũ 9 chưa để mà clrf nó.nhưng ma lu ý bạn là mình kinm63 tra hàng dv là "9"
          và hàng chuc là "10"
          vì giá trị đầu tiên của bạn là 0 ở dv.khi gọi bảng sẽ xuất ra số 0.và khi xuất ra số 9 thi gia tri hang dv của bạn vận là 9.nếu kiểm tra 10 sẽ xuất hiện nhiễu.
          lỗi bự nhất của bạn là không được xóa thanh ghi "PCL" vì khi xóa thi PIC sẽ hông chạy nữa(theo minh nghĩ ) và giá trị của thanh ghi PCL k ảnh hưởng tới lệnh RETLW mà là giá trị của thanh ghi W mới ảnh hướng tới nó.
          sau đây là hình mình đã làm và ca file mô phỏng theo khai báo I/O của bạn
          mình tạo vòng lập chậm 1 chút để dễ quan sát ____tinhok_____
          bài mình sửa dựa trên code của bạn nên sắp xếp hơi lộn xộn tùm lum xí

          hix.viết c oy coi lại mấy cái ASM.công nhận oãi thiệc
          Attached Files
          Last edited by sonluyen; 09-11-2010, 09:02 PM.

          Comment

          Working...