dien44
04-11-2010, 08:40 PM
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:
;=========================================
;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
Code như sau:
;=========================================
;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