View Single Post
Old 26-10-2005, 03:11 PM   #1
tuan795
Đệ tử 1 túi
 
Tham gia ngày: Oct 2005
Bài gửi: 16
:
Cách khai báo biến và liên kết chương trình

có một đoạn chương trình CHÍNH như sau

;device : PIC16F84A

; ************************************************
#include <p16F84A.inc>


list P=PIC16F84A

; ************************************************

; Load Configuration bit Code protect off,WDT on,
; Poweron timer on, XT oscillator

__CONFIG _CP_OFF & _WDT_ON & _PWRTE_ON & _XT_OSC

; ************************************************
STARTUP CODE 0x00
goto STart

INTERRUPT CODE 0x04
goto IntSrv
; ************************************************
#include <data.h>

PROGRAM CODE
STart

banksel WDTCOUNT_HI
btfsc CheckCalH
call CalForHi

btfsc CheckCalL
call CalForLow

; ************************************************

movf WDTCOUNT_HI,w
movwf TEMPH
movf WDTCOUNT_LO,w
movwf TEMPL
call InitData
call InPort
btfss STATUS,NOT_TO
goto MeasureTemp
btfsc SET
goto WDTclr

btfss SET
goto $-1

call CalibrateSystem ...................
...................


VỚI PHẦN CHƯƠNG TRÌNH DATA.H NHƯ SAU

; data.h

; ************************************************** *******************************

; PORT B 1 TO 7 -> output for a to g of seven segemet digit
; PORT A 0 to 2 -> output
#define DIGIT0 PORTA,2 ; DIGIT0 is common anode of 7-segment display - 'LSB' <PortA,2>
#define DIGIT1 PORTA,1 ; DIGIT1 is common anode of 7-segment display - 'MSB' <PortA,1>
#define DIGIT2 PORTA,0 ; DIGIT2 is common anode of 7-segment display - 'USB' or 'SIGN'<PortA,0>

;#define UP SW1,4 ; Up key is connected to PORTB,4
;#define DOWN SW1,5 ; DOWN key is connected to PORTB,5
;#define SET SW1,6 ; SET key is connected to PORTB,6
;#define TEMP SW1,7 ; TEMP key is connected to PORTB,7

#define UP PORTB,4 ; Up key is connected to PORTB,4
#define DOWN PORTB,5 ; DOWN key is connected to PORTB,5
#define SET PORTB,6 ; SET key is connected to PORTB,6
#define TEMP PORTB,7 ; TEMP key is connected to PORTB,7

#define SecBit TEMPFlag,0
#define CheckCalH TEMPFlag,1
#define CheckCalL TEMPFlag,2
; ************************************************** *******************************
UDATA

WDTCOUNT_HI res 1
WDTCOUNT_LO res 1
TEMPL res 1
TEMPH res 1
TEMPFlag res 1
Count0 res 1
Count1 res 1
W_TEMP res 1
STATUS_TEMP res 1
USD res 1
MSD res 1
LSD res 1

C1 res 1
C2 res 1
C3 res 1
C4 res 1


; ************************************************

extern InitTmr0
extern TempCalc
extern ReadEeprom
extern WriteEeprom
extern EEDefault
extern InitWDT
extern InPort
extern OutPort
extern InitData
extern ScanKey
extern InitInt

extern IntDelay
extern Delay1
extern Delay_1
extern Delay20


; for EEPROM
extern TEMP_HI,WDT_H0,WDT_H1,Default,TEMP_LO
extern WDT_L0,WDT_L1,TempP,TempC,Neg
extern Switch,Switch1

global WDTCOUNT_HI,WDTCOUNT_LO,TEMPFlag,Count0,Count1



VÀ CÁC CHƯƠNG TRÌNH CON PHỤC VỤ CHO CHƯƠNG TRÌNH CHÍNH NHƯ SAU:
; init.asm
; *******************************************
#include <p16F84A.inc>


; *******************************************

global InitData
global InitWDT
global InPort
global OutPort
global ScanKey
global InitTmr0

global InitInt
global IntDelay
global Delay1
global Delay_1
global Delay20

global Switch,Switch1
extern Count0,Count1
extern Neg,TEMPFlag

UDATA
Switch res 1
Switch1 res 1

DB1 res 1
DB2 res 1
DB3 res 1

CODE

; *******************************************
; Configure the prescaler asigned to WDT
InitWDT
banksel OPTION_REG ; select bank for OPTION_REG
; for WDT as 1:2 prescaler
movlw 0x09 ; PSA=1,PS2:PS1=001
movwf OPTION_REG ;
bcf STATUS,RP0
return

; *******************************************
; Initialise interrupts

InitInt
clrwdt
BANKSEL OPTION_REG ; select bank for OPTION_REG
; for WDT as 1:1 prescaler
movlw 0x09 ; PSA=1,PS2:PS1=001 for 1:2 WDT rate
movwf OPTION_REG
BANKSEL TMR0
clrf TMR0
BANKSEL INTCON
clrf INTCON
bsf INTCON,T0IE ; TMR0 on
bsf INTCON,GIE
return

; ************************************************
InPort
clrwdt
banksel Switch
movlw 0xf0 ; No key pressed
movwf Switch1
movwf Switch

BANKSEL PORTA
movlw 0xE7
movwf PORTA
movlw 0xFF
movwf PORTB

BANKSEL TRISB ; bank selct for TRISB
movlw 0xf0 ; initialise PORTB <4:7> as inport
movwf TRISB ; PORTB <0:3> as output port

BANKSEL PORTB
bcf PORTB,0

return

; ************************************************
OutPort
clrwdt
banksel TRISA
clrf TRISA ; set PORTA as output port
clrf TRISB ; set PORTB as output port
banksel PORTA
movlw 0xE7
movwf PORTA
movlw 0xFF ; to blank the display
movwf PORTB
return
..............................................
...........................................

chương trình chính và chương trình con nằm riêng lẽ có nghĩa rằng chương trình con phục vụ cũng là một chương trình ASM riêng biệt khi biên dịch thì có lỗi gì xảy ra không và cách khai biến như trên có hợp lệ không . nếu chúng ta liên kết chúng cho chúng nằm chung trong một chương trình thì ta bỏ các khai biến
global InitData
global InitWDT
global InPort
global OutPort
global ScanKey
global InitTmr0

global InitInt
global IntDelay
global Delay1


ở chương trính con được không.
Mong nhận ý kiến của các anh chị và các bạn
tuan795 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn