dvkkt |
13-11-2007 12:01 PM |
Làm sao chỉnh đoạn code chạy trên 16f84a sang con 16f877a
1 Attachment(s)
tui có chỉnh chổ:
cblock 0x0c -> 0x20
cblock 0x1d -> 0x31
--------------------
movlw 0x0c ->0x20
movlw pic_ad
bác nào biết có thể giải thích rõ hơn vì sao nó không chạy? thank
Code:
<script type="text/javascript">
processor 16f84A ;********************* mod 16f877a
include <p16f84A.inc> ;********************* mod 16f877a
__config _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF ; them & _LVP_OFF de dung chan RB3
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; for PIC to LCD pin wiring and LCD line addresses
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#define E_line 1
#define RS_line 2
#define RW_line 3
#define LCD_1 0x80
#define LCD_2 0xC0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; variables in PIC RAM
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Reserve 16 bytes for string buffer
cblock 0x0c ;@@@@@@@@@ mod cho nay 0x20 **************
strData
endc
; Leave 16 bytes and continue with local variables
cblock 0x1d ;@@@@@@@@ mod cho nay 0x31 ****************
count1
count2
count3
pic_ad
J
K
index
endc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Program
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
org 0
goto main
org 0x04
main:
movlw b'00000000'
tris PORTA
tris PORTB
movlw b'00000000'
movwf PORTA
movwf PORTB
; Wait and initialize LCD
call delay_5ms
call initLCD
call delay_5ms
; Store base address of text buffer in PIC RAM
movlw 0x0c ;@@@@@@@@@@ mod cho nay 0x20 **************
movwf pic_ad
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; first LCD line
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
call blank16
movlw d'1'
call storeMN
; Set DDRAM address to start of first line
call line1
; Call procedure to display 16 character in LCD
call display16
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; second LCD line
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
call delay_125mcs
call blank16
; in text buffer
movlw d'1'
call storeUniv
call line2
call display16
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
loopHere:
goto loopHere
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; INITIALIZE LCD PROCEDURE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
initLCD:
; Initialization for densitron LCD module as follows:
; 8-bit interface
; 2 display lines of 16 characters each
; cursor shift right
; no display shift
;***************************
; COMMAND MODE
;***************************
bcf PORTA, E_line
bcf PORTA, RS_line
bcf PORTA, RW_line
call delay_125mcs
;***************************
; FUNCTION SET
;***************************
movlw 0x38
movwf PORTB
call pulseE
;***************************
; DISPLAY OFF
;***************************
movlw 0x08
movwf PORTB
call pulseE
;***************************
; DISPLAY AND CURSOR ON
;***************************
movlw 0x0f
movwf PORTB
call pulseE
;***************************
; ENTRY MODE SET
;***************************
movlw 0x06
movwf PORTB
call pulseE
;***************************
; CURSOR/DISPLAY SHIFT
;***************************
movlw b'00010100'
movwf PORTB
call pulseE
;***************************
; CLEAR DISPLAY
;***************************
movlw 0x01
movwf PORTB
call pulseE
call delay_5ms
return
;***************************
; DELAY AND PULSE PROCEDURES
;***************************
;***************************
; Procedure to delay 125 microseconds
;***************************
delay_125mcs:
movlw D'42'
movwf count1
repeat
decfsz count1,f
goto repeat
return
;***************************
; Procedure to delay 5 milliseconds
;***************************
delay_5ms
movlw D'41'
movwf count2
delay
call delay_125mcs
decfsz count2,f
goto delay
return
;============================
; Pulse E line
;============================
pulseE
bsf PORTA, E_line
bcf PORTA, E_line
call delay_125mcs
return
;============================
; long delay sub-routine
;============================
long_delay
movlw d'200'
movwf J
jloop:
movwf K
kloop:
decfsz K,f
goto kloop
decfsz J,f
goto jloop
return
;============================
; LCD display procedure
;============================
display16:
;set up for data
bcf PORTA,E_line
bsf PORTA,RS_line
call delay_125mcs
;set up counter for 16 characters
movlw d'16'
movwf count3
;get display address from local variable pic_ad
movf pic_ad,w
movwf FSR
getchar:
movf INDF,w
movwf PORTB
call pulseE
decfsz count3,f
goto nextchar
return
nextchar:
incf FSR,f
goto getchar
; blank buffer
blank16:
movlw d'16'
movwf count1
movf pic_ad,w
movwf FSR ; ad
movlw 0x20
storeit:
movwf INDF
decfsz count1,f
goto incfsr
return
incfsr:
incf FSR,f
goto storeit
;============================
; Set Address register to
; LCD line 1
;============================
line1:
bcf PORTA,E_line
bcf PORTA,RS_line
call delay_125mcs
; set to second display line
movlw LCD_1
movwf PORTB
call pulseE
; set RS line for data
bsf PORTA,RS_line
call delay_125mcs
return
;============================
; Set Address register to
; LCD line 2
;============================
line2:
bcf PORTA,E_line
bcf PORTA,RS_line
call delay_125mcs
movlw LCD_2
movwf PORTB
call pulseE
bsf PORTA,RS_line
call delay_125mcs
return
;============================
; first text string procedure
;============================
storeMN:
movwf index
movf pic_ad,w
addwf index,w
movwf FSR
movlw 0
movwf index
get_msg_char:
call msg1
andlw 0x0ff
btfsc STATUS,Z
goto endstr1
movwf INDF
incf FSR,f
movf index,w
addlw 1
movwf index
goto get_msg_char
endstr1:
return
msg1:
addwf PCL,f
retlw 'P'
retlw 'I'
retlw 'C'
retlw 0x20
retlw 'P'
retlw 'r'
retlw 'o'
retlw 'g'
retlw 'r'
retlw 'a'
retlw 'm'
retlw 'm'
retlw 'i'
retlw 'g'
retlw 0
;============================
; second text string procedure
;============================
storeUniv:
movwf index
movf pic_ad,0
addwf index,0
movwf FSR
movlw 0
movwf index
get_msg_char2:
call msg2
andlw 0x0ff
btfsc STATUS,Z
goto endstr2
movwf INDF
incf FSR,f
movf index,w
addlw 1
movwf index
goto get_msg_char2
endstr2:
return
msg2:
addwf PCL,f
retlw 'V'
retlw 'i'
retlw 'd'
retlw 'u'
retlw 0
end
</script>
|