|
Tài trợ cho PIC Vietnam |
Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC |
|
Ðiều Chỉnh | Xếp Bài |
26-10-2005, 03:11 PM | #1 |
Đệ 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 |
|
|
Similar Threads | ||||
Ðề tài | Người gửi | Chuyên mục | Trả lời | Bài mới |
Cùng khai hoang con 16F88 | noisePIC | Cơ bản về vi điều khiển và PIC | 27 | 13-04-2012 03:24 AM |
Khai giảng lớp vi điều khiển ,cung cấp tài liệu | tamphong | Quảng cáo và bán sản phẩm | 2 | 12-11-2006 08:40 PM |