You are on page 1of 71

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler

Chng II: LP TRNH CHO PIC DNG C COMPILER


I. GII THIU PIC C COMPILER: 1. Gii Thiu PIC C Compiler: PIC C compiler l ngn ng lp trnh cp cao cho PIC c vit trn nn C. chng trnh vit trn PIC C tun th theo cu trc ca ngn ng lp trnh C. Trnh bin dch ca PIC C compiler s chuyn chng trnh theo chun ca C thnh dng chng trnh theo m Hexa (file.hex) np vo b nh ca PIC. Qu trnh chuyn i c minh ho nh hnh 2.1.

File.c (Chng trnh vit cho PIC di dng C)

Bin dch

File.hex (Chng trnh di dng m hex np cho PIC)

Thit b lp trnh

Hnh 2.1 Qu trnh lp trnh, bin dch v np cho PIC PIC C compiler gm c 3 phn ring bit l PCB, PCM v PCH. PCB dng cho h MCU vi b lnh 12 bit, PCM dng cho h MCU vi b lnh 14 bit v PCH dng cho h MCU vi b lnh 16 v 18 bit. Mi phn khc nhau trong PIC C compiler ch dng c cho h MCU tng ng m khng cho php dng chung (V d khng th dng PCM hoc PCH cho h MCU 12 bit c m ch c th dng PCB cho MCU 12 bit). 2. Ci t V S Dng PIC C Compiler: a. Ci t PIC C compiler: ci t PIC C compiler, bn phi c a CD cha software PCW. Phn mm ny c th download trn mng a ch . Khi c a CD software, vic ci t PIC C compiler c thc hin theo cc bc sau: - T Start menu -> chn run -> chn browse -> chn th mc PCW -> chn setupPCW -> click OK. Khi xut hin ca s welcome. - Trn ca s Welcome, click chut vo nt Next, sau khi click Next, ca s Software License Agreement s xut hin, click nt nhn Yes. - Trong ca s Readme information, click nt nhn Next. Trang 50

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler - Sau khi click Next trong ca s Readme information, ca s Choose Destination Location s xut hin. Th mc mc nhin ci t PIC C compiler l c:\Program files\PICC. Ta c th thay i th mc ci t PCW bng cch chn nt Browse v ch ng dn ti th mc hoc a cn ci t, nu mun th mc mc nhin, click nt nhn Next tip tc ci t. - Trong ca s Select Program Folder, click nt nhn Next. - Click nt nhn Next tong ca s Start Copying Files sau ch cho qu trnh setup thc hin. - Trong ca s Select Files .crg, nhp vo tn file pcb.crg, pcm.crg hoc pch.crg nu mun dng PIC C compiler cho MCU 12 bit, MCU 14 bit hay MCU 16, 18 bit sau click nt OK. - Click nt Finish hon tt vic ci t. b. S dng PIC C compiler: Sau khi ci t xong PIC C compiler, trn Desktop ca window s xut hin biu tng ca PIC C compiler. Double Click vo biu tng ca PIC C compiler chy chng trnh khi ca s chng trnh ca PIC C compiler s xut hin nh sau:

Ca s chn loi MCU

Trong ca s chng trnh ca PIC C compiler gm c cc thc n (Menu): File, Project, Edit, Options, Compile, View, Tools v Help. Chi tit v cc thc n nh sau: - File (tp): File l thc n qun l tp gm cc thc n nh hnh

+ New: To file.c mi + Open: M mt file.c c, c lu tr trong a. + Save: Lu file.c vo a. + Save As: Lu tr file.c vo a cng vi tn khc. + Save All: Lu tr tt c cc file c m vo a. + Close: ng file hin hnh. + Close All: ng tt c cc file. + Print: In file hin hnh. Trang 51

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler - Project (D n): L thc n qun l d n (mt chng trnh ng dng). Thc n Project gm cc thc n nh hnh

+ New: To mt d n mi. D n mi c th c to mt cch th cng hoc to t ng thng qua PIC Wizard. Nu chn phng thc th cng th ch c file.pjt c to gi thng tin c bn ca d n v mt file.c mc nh trc hoc mt file.c rng c to son tho chng trnh. Nu to d n thng qua PIC Wizard, th ngi s dng c th xc nh tham s ca d n v khi hon tt th cc file.c, file.h v file.pjt c to. M ngun chun v cc hng s c sinh ra da trn tham s ca d n. Vic chn la cc tham s cho d n mi c thc hin trn mu c PIC C compiler ngh, trong mu gm cc chn la nh c tnh ca ng vo ra theo chun RS232, I2C, chn la timer, chn la ADC, s dng ngt, cc driver cn thit v tn ca tt c cc chn ca MCU. Sau khi hon tt vic chn la cc tham s cho d n th file.c v file.h s to ra vi #defines, #include v mt s lnh ban u cn thit cho d n. y l cch nhanh nht to mt da n mi. + Open: M mt file.pjt c trong a. + Open All: M mt file.pjt v tt c cc file dng trong d n. + Find text in project: Tm kim mt t hay mt k t trong d n. + Include Dirs: Cho php xc nh cc th mc c dng tm kim cc file include cho d n. Thng tin ny c lu vo file.pjt. + Close Project: ng tt c cc file trong d n. - Edit: Thc n Edit gn cc thnh phn nh hnh.

Trang 52

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler

Cc thnh phn trong thc n Edit c chc nng tng t nh trong cc trnh ng dng trn mi trng window quen thuc nh word, excel - Option: Thc n Option gm cc thnh phn nh hnh.

Trong thc n Option c 4 thnh phn cn lu l: File Formats, Global Defines, Debugger/Programer v Include Dirs. Cc thnh phn khc th tng t nh cc trnh ng dng quen thuc. + File Format: Cho php chn la kiu nh dng ca file xut. Khi chn Option->File Format, ca s File Format s xut hin. Trong ca s File Format c cc chn la chn kiu nh dng cho file xut ra sau khi bin dch. Ca s File Format c dng nh sau:

Trang 53

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler

Debug File: File g ri chng trnh cht trn MPLAB. Chn Standard.COD nu mun chy g ri chng trnh, chn None nu khng cn chy g ri. Error File: Xut ra file li khi chng trnh c li trong qu trnh bin dch. Chn Standard cho cc MCU chun hin hnh ca Microchip, chn Original cho cc MCU th h trc ca Microchip. List Format:Chn Simple cho nh dng c bn vi m C v ASM. Chn Standard nh dng chun MPASM vi m my. Chn Old cho nh dng MPASM th h trc. Chn Symbolic nh dng gm m C trong ASSEMBLY. Object File: Chn kiu cho file.hex, Chn 8 bit HEX cho file hex intel 8 bit v chn 16 HEX cho file hex intel 16 bit. Sau khi chn la kiu nh dng file xut ra sau khi bin dch, click OK. + Global Defines: Cho php t #define s dng cho bin dch chng trnh. iu ny tng t nh vic khai bo #define u chng trnh. + Debug/Programer: Cho php xc nh thit b lp trnh c s dng khi chn la cng c lp trnh cho chip. + Include Dirs: Tng t nh trong thc n Project. - Compiler: Bin dch d n hin hnh. - View: Thc n view gm cc thnh phn nh hnh

+ C/ASM List: M file.lst ch ch c, file ny phi c bin dch trc t file.c. Khi c m, file ny s trnh by theo dng va c m C va c m Assembly. V d File.lst delay_ms(3); Trang 54

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler 0F2: MOVLW 05 0F3: MOVWF 08 0F4: DESCZ 08,F 0F5: GOTO 0F4 .while input(pin_0)); 0F6: BSF 0B,3 + Symbol Map: M file dng m ASM ch ch c. File ny phi c bin dch t file.c. File ny cho bit a ch ca cc thanh ghi s dng trong chng trnh. + Binary file: M file nh phn ch ch c, File ny c hin th m HEX v m ASCII. - Tool: Thc n Tool qun l mt s cng c c bit. Cc thnh phn trong thc n tool nh hnh.

Trong thc n tool ch c mt cng c kh c bit m ngi s dng MCU cn lu l cng c disassembler, cng c ny cho php dch ngc file.bin hoc file.hex thnh file theo kiu m ASM. - Help: thc n tr gip, trong thc n ny cha phn hng dn s dng PIC C compiler di dng HYML. c. Lp Trnh Cho MCU Ca Microchip Dng PIC C Compiler: Cc bc lp trnh cho MCU PIC dng PIC C compiler: - Chy PIC C Compiler bng cch double click vo biu tng ca phn mm. - Trn Menu Bar ca phn mm, chn Project -> New -> PIC Wizard to d n mi hoc chn Project > Open m d n trong lu trong a. - Nu l d n mi th sau khi chn PIC Wizard, t tn cho d n v click SAVE. - Sau khi click SAVE, ca s cho php chn thng s cho d n theo mu hin ra, chn cc thng s cn thit cho d n v click OK. - Sau khi click OK, ca s son tho chng trnh theo m C xut hin, vit m theo gii thut thc hin d n. Chn File save all lu tr cc file trong d n vo a cng. - Sau khi vit m xong, chn Compiler -> compiler bin dch chng trnh thnh file.hex. Nu chng trnh khng c li th file.hex c to ra cn ngc li th sa li chn gtrnh ri bin dch li. - Sau khi to c file.hex, dng chng trnh PIC downloader np chng trnh vo b nh FLASH ca MCU. 3. Vit Chng Trnh (M Ngun) Cho PIC Trn PIC C Compiler: Chng trnh c vit trn PIC C compiler gm 4 phn t chnh, Trong mi phn t s bao gm nhiu chi tit to nn chng trnh. Cu trc chng trnh nh sau: - Phn ghi ch: phn ghi ch, ngi lp trnh s ghi nhng ch thch cn thit cho chng trnh. Phn ch thch c bt u t du // hoc /* cho ti cui hng. Khi bin dch, trnh bin Trang 55

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler dch s b qua phn ghi ch. Phn ghi ch c th xut hin bt c ch no trong chng trnh thm ch c th t ngay sau hng m lnh ch thch cho hng lnh. V d: // y l phn ghi ch ca chng trnh /* nhng ghi ch ny s khng nh hng g ti chng trnh khi bin dch. - Ch nh cc tin x l: Phn ny s ch nh cc tin x l c s dng khi bin dch. Cc tin x l c bt u bng du #. V d: khai bo cc tin x l, chi tit v tng tin x l s c trnh by chi tit sau. # include // Ch nh tin x l include # device - nh ngha cc d liu: y l phn khai bo hng, khai bo bin v kiu d liu s dng trong chng trnh. V d: int a,b,c,d; // Khai bo bin a,b,c,d kiu nguyn - nh ngha cc hm: nh ngha cc hm (Function) c dng thc hin gii thut ca chng trnh. Hm c cu trc nh sau: Tn hm (Cc i s ca hm) { Cc pht biu } Trong Tn hm c t tu ca ngi vit chng trnh. Cc i s ca hm l cc thng s dng trao i d liu ca hm, i s c th l rng nu hm khng trao i d liu hoc c th c nhiu i s, cc i s phn cch nhau bng du , V d: void lcd_putc(char c ) // nh ngha hm { ... } Di y trnh by mt chng trnh mu minh ha cu trc ca chng trnh. // Phn khai bo ch nh tin x l #if defined(__PCB__) // Khai bo tin #include <16c56.h> #fuses HS,NOWDT,NOPROTECT #use delay(clock=20000000) #use rs232(baud=9600, xmit=PIN_A3, rcv=PIN_A2) // Jumpers: 11 to 17, 12 to 18 #elif defined(__PCM__) #include <16c74.h> #fuses HS,NOWDT,NOPROTECT #use delay(clock=20000000) #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) // Jumpers: 8 to 11, 7 to 12 #elif defined(__PCH__) #include <18c452.h> #fuses HS,NOPROTECT #use delay(clock=20000000) #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) // Jumpers: 8 to 11, 7 to 12 #endif #include <ltc1298.c> // Kt thc phn khai bo tin ch nh tin x l. Trang 56

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler // Phn khai bo bin, hng v kiu d liu int a,b,c,d; char *h; struct data_record { byte a [2]; byte b : 2; /*2 bits */ byte c : 3; /*3 bits*/ int d;} // Kt thc khai bo hng, bin v kiu d liu // Bt u phn nh ngha cc hm. void display_data( long int data ) // Khai bo hm hin th data { // T kha bt u chng trnh char volt_string[6]; // Khai bo bin convert_to_volts( data, volt_string ); // Pht biu printf(volt_string); // Pht biu printf(" (%4lX)",data); // Pht biu } // t kho kt thc hm main() // nh ngha hm { // T kha bt u chng trnh long int value; // Khai bo bin adc_init(); // Pht biu gi hm printf("Sampling:\r\n"); // Pht biu do // Pht biu { // T kha bt u nhm pht biu delay_ms(1000); // Pht biu value = read_analog(0); // Pht biu gi hm printf("\n\rCh0: "); // Pht biu display_data( value ); // Pht biu gi hm value = read_analog(1); // Pht biu gi hm printf(" Ch1: "); // Pht biu display_data( value ); // Pht biu gi hm } while (TRUE); } a. Cc lnh tin x l: Tin x l gm 55 lnh chi tit nh sau: #DEFINE ID STRING. #ELSE. #ENDIF. #ERROR. #IF expr. #IFDEF id. #INCLUDE "FILENAME" . #INCLUDE <FILENAME> . #LIST. #NOLIST. #PRAGMA cmd. #UNDEF id. #INLINE Trang 57

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler #INT_DEFAULT #INT_GLOBAL #INT_xxx #SEPARATE __DATE__ __DEVICE__ __FILE__ __LINE__ __PCB __ __PCM__ __PCH__ __TIME__ #DEVICE CHIP #ID NUMBER #ID "filename" #ID CHECKSUM #FUSES options #SERIALIZE #TYPE type=type #USE DELAY CLOCK #USE FAST_IO #USE FIXED_IO #USE I2C #USE RS232 #USE STANDARD_IO #ASM #BIT id=const.const #BIT id=id.const #BYTE id=const #BYTE id=id #LOCATE id=const #ENDASM #RESERVE #ROM #ZERO_RAM #BUILD #FILL_ROM #CASE #OPT n #PRIORITY #ORG #IGNORE_WARNINGS - #ASM v #ENDASM: y l cp lnh i km vi nhau cho php chn on m dng assembly vo chng trnh. C php ca cp lnh ny nh sau: #asm m assembly # endasm V d sau minh ha cch s dng cp lnh trn vo chng trnh. Trang 58

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler int find_parity (int data) { int count; #asm //Khai bo bt u on m assembly movlw 0x8 movwf count movlw 0 loop: xorwf data,w rrf data,f decfsz count,f goto loop movwf _return_ #endasm // khai bo kt thc on m assembly } - #BIT: + C php: #bit id = x.y id l tn hp l trong C, x l hng s hoc bin trong C, y l hng s t 0 -7 + Mc ch: To mt bin mi (1 bit) trong C v t n vo trong b nh ti byte x, bit y. Lnh ny thng c s dng truy xut trc tip t C ti mt bit trong thanh ghi chc nng c bit. V d: v d di dy minh ho cch s dng lnh #bit. #bit T0IF = 0xb.2 ... T0IF = 0; // Clear Timer 0 interrupt flag int result; #bit result_odd = result.0 ... if (result_odd) - # BUILD: + C php: #build(segment =address) #build(segment = address,segment = address) #build(segment =start:end) #build(segment = start: end, segment = start: end) Trong : segment l mt on b nh tip theo m c n nh v tr (B nh Reset, ngt). Address l a ch ca b nh ROM trong MCU, start v end c s dng xc nh a ch u v cui ca vng nh c dng. + Mc ch: i vi cc MCU PIC18XXX dng b nh ngoi hoc cc MCU PIC 18XXX khng c b nh ROM bn trong, lnh ny cho php bin dch trc tip s dng b nh ROM. V d: v d di dy minh ho cch s dng lnh #build. #build(memory=0x20000:0x2FFFF) //n nh khng gian nh. #build(reset=0x200,interrupt=0x208) //n nh v tr u ca cc vector ngt v reset #build(reset=0x200:0x207, interrupt=0x208:0x2ff) //n nh gii hn khng gian ca cc // vector ngt v reset - #BYTE: + C php: #byte id = x Trang 59

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler Trong : id l tn hp l trong C, x l mt bin trong C hoc l hng s. + Mc ch: Nu id c xc nh nh mt bin hp l trong C th lnh ny s t bin C vo trong b nh ti a ch x, bin C ny khng c thay i khc vi nh ngha ban u. Nu id l bin ch bit th mt bin C mi s c to v t vo b nh to a ch x. V d: v d di dy minh ho cch s dng lnh #byte. #byte status = 3 #byte b_port = 6 struct { short int r_w; short int c_d; int unused : 2; int data : 4; } a_port; #byte a_port = 5 ... a_port.c_d = 1; - #DEFINE: + C php: #define id text hoc #define id(x,y...) text Trong : id l mt nh ngha tin x l. text l on vn bn bt k. x,y l mt nh ngha tin x l ni t cch nhau bi du phy + Mc ch: nh ngha mt hng hay mt tham s thng s dng trong chng trnh V d: v d di dy minh ho cch s dng #define. #define BITS 8 a=a+BITS; //tng t nh a=a+8; #define hi(x) (x<<4) a=hi(a); //tng t nh a=(a<<4); - # DEVICE: + C php: #device chip options Trong : chip l tn b vi x l ( v d nh: 16f877), Options l cc ton t tiu chun c quy nh trong mi chip. Cc option bao gm: *=5: S dng con tr 5 bit (Cho tt c cc MCU) *=8: S dng con tr 8 bit (Cho MCU 14 v 16 bit) *=16: S dng con tr 16 bit (Cho MCU 14 bit) ADC=xd9: x l s bit tr v sau khi gi hm read_adc() ICD=TRUE: To ra m tng ng Microchips ICD debugging hardware. + Mc ch: nh ngha chip s dng. Tt c cc chng trnh u phi s dng khai bo ny nhm nh ngha chn trn chip v mt s nh ngha khc ca chip. V d: v d di dy minh ho cch s dng #device. #device PIC16C74 #device PIC16C67 *=16 #device *=16 ICD=TRUE #device PIC16F877 *=16 ADC=10 - __DEVICE__: + C php: Trang 60

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler __device__ + Mc ch: nh ngha ny c dng nhn dng s c bn ca MCU ang dng (t # divice). Thng thng th s c bn l s nm ngay sau phn ch trong m s ca MCU. V d nh MCU ang dng l loi PIC16C71 th s c bn l 71. V d: v d di dy minh ho cch s dng __device__. #if __device__==71 SETUP_ADC_PORTS( ALL_DIGITAL ); #endif - #FUSE: + C php: #fuse option Trong option thay i tu thuc vo thit b. Danh sch cc option hp l c t ti u ca file.h trong phn ch thch ca mi thit b. Cc option c din gii chi tit trong thc n View-> Fuse valid trong PIC C compiler. Ca s FUSE Review nh sau:

Tn MCU

+ Mc ch: nh ngha ny c dng ch ra fuses no c t vo MCU khi lp trnh cho n. Ch dn ny khng nh hng g n qu trnh bin dch nh n c xut ra file output. V d: #fuses HS,NOWDT - #ID: + C php: #ID number 16 #ID number, number, number, number #ID "filename" #ID CHECKSUM Trong Number16, 4 ln lt l cc s 16 bit v 4 bit, filename l tn file c thc trong b nh my tnh, checksum mt loi t kha. + Mc ch: Trang 61

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler nh ngha ny c dng ch ra t id no c lp trnh vo MCU. Ch dn ny khng nh hng g n qu trnh bin dch nh n c xut ra file output. V d: #id 0x1234 #id "serial.num" #id CHECKSUM - #IF, #ELSE, #ELIF, #ENDIF: + C php: #if biu thc pht biu #elif biu thc pht biu #else pht biu #endif + Mc ch: Kim tra iu kin ca biu thc, nu iu kin l ng th thc hin pht biu hng ngay sau cn ngc li nu biu thc l sai th thc hin pht biu ngay sau #else. V d: #if MAX_VALUE > 255 value; #else int value; #endif - #INCLUDE: + C php: #include <filename> hoc #include "filename" Trong filename l tn file hp l trong PC. + Mc ch: B tin x l s s dng thng tin cn thit c ch ra trong filename trong qu trnh bin dch thc thi lnh trong chng trnh chnh. Tn file nu t trong du s c tm kim trc tin, nu t trong du <> s c tm sau cng. Nu ng dn khng ch r, trnh bin dch s thc hin tm kim trong th mc cha project ang thc hin. Khai bo #include <> c s dng hu ht trong cc chng trnh khai bo thit b (IC) ang s dng cng nh cn k tha kt qu mt chng trnh c trc . V d: #include <16C54.H> #include<C:\INCLUDES\COMLIB\MYRS232.C> - #INLINE: + C php: #inline + Mc ch: Thng bo cho trnh bin dch thc thi tc thi hm sau khai bo #inline. Tc l s copy nguyn bn code t vo bt c ni no m hm c gi. iu ny s tng tc x l v khong trng trong vng nh stack. Nu khng c ch th ny, trnh bin dch s la chn thi im tt nht thc thi procedures INLINE. V d: #inline swapbyte(int &a, int &b) Trang 62

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler { int t; t=a; a=b; b=t; } - #INT_xxxx: + C php: #INT_AD Hon tt chuyn i ADC #INT_ADOF Ht thi gian chuyn i ADC #INT_BUSCOL ng Bus #INT_BUTTON Nt nhn #INT_CCP1 CCP1 #INT_CCP2 CCP2 #INT_COMP Pht hin so snh #INT_EEPROM Ghi EEPROM hon tt #INT_EXT Ngt ngoi #INT_EXT1 Ngt ngoi 1 #INT_EXT2 Ngt ngoi 2 #INT_I2C I2C Ngt(ch trong 14000) #INT_LCD LCD tch cc #INT_LOWVOLT Pht hin in p thp #INT_PSP Nhn d liu t cng song song #INT_RB Port B Thay i ca bit B4-B7 #INT_RC Port C Thay i ca bit C4-C7 #INT_RDA RS232 ang nhn d liu qua cng ni tip #INT_RTCC Trn timer 0 #INT_SSP SPI hoc I2C ang lm vic #INT_TBE RS232 B m truyn rng #INT_TIMER0 Timer 0 trn #INT_TIMER1 Timer 1 trn #INT_TIMER2 Timer 2 trn #INT_TIMER3 Timer 3 trn + Mc ch: INT_xxxx c dng ch dn cho bit hm i km l mt hm phc v ngt. Ha2m phc v ngt c th l mt hm khng c tham s. Khng phi cc ch dn trn dng c cho tt c cc MCU m c th c mt s MCU ch s dng mt s ch dn m thi. Chi tit v cc ch dn trong cc MCU c th xem trong thc n view -> Valid ints. Ca s interrupt review nh sau:

Trang 63

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler

Trnh bin dch s sinh ra m lu tr trng thi ca MCU vo stack v nhy ti hm phc v ngt khi pht hin thy ngt tng ng. Sau khi thc hin xong chng trnh phc v ngt, cc trng thi ban u ca CPU c lu tr trong stack s c ly li v ng thi xo b c ngt. Chng trnh ng dng phi gi hm ENABLE_INTERRUPTS(INT_xxxx) cho php cc ngt lm vic. V d: #int_ad adc_handler() { adc_active=FALSE; } #int_rtcc noclear isr() { ... } - INT_DEFAULT: + C php: #int_default + Mc ch: Hm theo sau ch th ny s c gi nu c xung kch ngt v s khng c c ngt no c set. Nu c c ngt nhng khng c mt trigger no c th hm #INT_DEFAULT s c khi gi V d: #int_default default_isr() { printf("Unexplained interrupt\r\n"); } - #INT_GLOBAL: + C php: Trang 64

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler #int_global + Mc ch: Hm sau ch th ny s c gi khi c tn hiu ngt c gi i. Thng thng, khng nn s dng. Nu s dng, trnh bin dch khng to code khi ng cng nh code xo v save trn thanh ghi V d: #int_global isr() { #asm bsf isr_flag retfie #endasm } - #LOCATE: + C php : #locate id=x Trong : id l tn bin trong C, x l a ch vng nh. + Mc ch: Hot ng ca #LOCATE tng t nh #BYTE tuy nhin #LOACTE s khng cho x dng vng nh ny vao cc mc ch khc. V d: float x; #locate x=0x50 // Bin x l bin kiu thc v c t ti a ch 50 53 v C s khng //dng vng nh ny cho cc bin khc. - #ORG: + C php: #org start, end Hoc #org segment Hoc #org start, end {} Hoc #org start, end auto=0 #org start,end DEFAULT Hoc #org DEFAULT Trong : Start l a ch u ca vng nh c ch nh, end l a ch cui cng ca vng nh c ch nh, segment l a ch u ca vng nh ROM ngay sau #ORG trc + Mc ch: Tin x l ny s t hm theo sau n vo vng nh ROM xc nh V d: #ORG 0x1E00, 0x1FFF MyFunc() // Hm MyFunc() s c t trong ROM ti vng nh 0x1E00 - 0x1FFF { . } #ORG 0x1E00 Anotherfunc() Trang 65

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler { } #ORG 0x800, 0x820 {} #ORG 0x1C00, 0x1C0F CHAR CONST ID[10}= {"123456789"}; #ORG 0x1F00, 0x1FF0 Void loader() { } - __PCB__: + C php: __pcb__ + Mc ch: Tin x l ny c nh ngha xc nh trnh bin dch pcb V d: #ifdef __pcb__ #device PIC16c54 #endif - __PCM__: + C php: __pcm__ + Mc ch: Tin x l ny c nh ngha xc nh trnh bin dch pcm V d: #ifdef __pcm__ #device PIC16F877 #endif - __PCH__: + C php: __pch__ + Mc ch: Tin x l ny c nh ngha xc nh trnh bin dch pch V d: #ifdef __pch__ #device PIC18c452 #endif - #USE DELAY: + C php: #use delay (clock=speed) hoc #use delay(clock=speed, restart_wdt) Trong speed l tc xung nhp ca thch anh, l hng s nm trong khong t 0 100000000 (T 0 100 MHz) + Mc ch: y l hm th vin ca PIC C Compiler cha cc hm delay_ms(), delay_us(). Khai bo tin x l ny s cho php s dng cc hm trn trong chng trnh. V d: Trang 66

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler #use delay (clock=20000000) #use delay (clock=32000, RESTART_WDT) - # USE FAST_I/O: + C php: #use fast_io (port) trong port l cc k t A G. + Mc ch: y l ch nh tin x l nh dng vo ra cho cc cng xut nhp d liu. Khi dng ch nh tin x l ny ngi lp trnh phi chc chn thanh ghi c set ng thng qua lnh set_tris_X(). V d: #use fast_io(A) - # USE FIXED_I/O: + C php: #use fixed_io (port_outputs=pin, pin?) trong port l cc k t A G, pin l chn tng ng trong port + Mc ch: y l ch nh tin x l nh dng vo ra cho cc bit trong cng xut nhp d liu. V d: #use fixed_io(a_outputs=PIN_A2, PIN_A3) // Chn A2 v A3 ca port A l chn xut #use fixed_io(a_inputs=PIN_A1, PIN_A5) // Chn A1 v A5 ca port A l chn nhp - #USE I2C: + C php: #use i2c (options) Trong options l cc phn nh sau v c phn cch bi du ,. MASTER : t ch ch SLAVE : t ch t SCL=pin : Xc nh a ch SCL SDA=pin : Xc nh a ch SDA ADDRESS=nn :Xc nh a ch ch t FAST : S dng c tnh nhanh ca I2C SLOW : S dng c tnh chm ca I2C RESTART_WDT Khi ng li WDT trong khi ch c I2C FORCE_HW S dng cc hm phn cng ca I2C. NOFLOAT_HIGH : Khng cho php th ni tn hiu SMBUS : Dng bus tng t nh bus I2C. + Mc ch: y l th vin cha cc hm s dng trong ch I2C nh: I2C_START, I2C_STOP, I2C_READ, I2C_WRITE and I2C_POLL. Khai bo tin x l ny dng cc hm th vin ca n. V d: #use I2C(master, sda=PIN_B0, scl=PIN_B1) #use I2C(slave,sda=PIN_C4,scl=PIN_C3, address=0xa0,FORCE_HW) - #USE RS232: + C php: #use rs232 (options) Trong options l cc phn nh sau v c phn cch bi du ,. STREAM=id : Nhn dng nhm cng RS232 Trang 67

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler BAUD=x : t tc Baud XMIT=pin: t chn truyn RCV=pin : t chn nhn FORCE_SW :sinh m truyn ni tip khi chn UART c xc nh. BRGH1OK :Cho php hu tc baud khi c vn v tc baud trong chip DEBUGGER :Xc nh ng truyn/ nhn d liu thng qua b CCS IDC . Mc nhin l chn B3, dng XMIT= v RCV = thay i chn, c 2 ng tuyn / nhn c th s dng trn 1 chn. RESTART_WDT : Khi ng li Watch Dog timer. INVERT : i cc tnh ca chn ni tip PARITY=X : Sbit chn l, X l N, E, O BITS =X : S bit data, x c gi tr t 5 - 9 FLOAT_HIGH : Cng RS232 s mc cao khi khng c d liu. RS232_ERRORS: Bit bo li RS232 LONG_DATA : D liu nhn v t RS232 s dng int16 DISABLE_INTS: Xo ngt RS232 + Mc ch: nh cu hnh RS232. V d: #use rs232(baud=9600, xmit=PIN_A2,rcv=PIN_A3) // Cng RS232 vi tc buad l 9600, Chn A2 l chn truyn, chn A3 l chn nhn. - # USE STANDARD_IO: + C php: #USE STANDARD_IO (port) Trong port l A - G + Mc ch: Dng nh cu hnh vo ra cho cc cng giao tip d liu - # ZERO_RAM: + C php: #zero_ram + Mc ch: Reset tt c cc thanh ghi trc khi thc hin chng trnh. V d: #zero_ram void main() { } b. nh ngha cc kiu d liu: Kiu d liu c dng khai bo bin, hng. Cc bin c khai bo nh sau: Kiu d liu bin1, bin2, ; V d: int a,b,c; - Cc kiu d liu n gin: Cc kiu d liu n gin dng trong PIC C compiler tng t nh trong C chun, gm cc kiu nh trong bng sau: Kiu d liu M t int1 nh ngha mt d liu 1 bit (kiu nguyn) int8 nh ngha mt d liu 8 bit (kiu nguyn) int16 nh ngha mt d liu 16 bit (kiu nguyn) Trang 68

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler int32 nh ngha mt d liu 32 bit (kiu nguyn) char nh ngha mt d liu kiu k t 8 bit float nh ngha mt d liu 32 bit dng du chm ng (kiu thc) short Mc nhin l int1 int Mc nhin l int8 long Mc nhin l int16 void Ch mt kiu d liu khng xc nh static nh ngha bin tnh ton cc v c gi tr ban u bng 0. Khi khai bo bin ny th b nh s dnh mt vng nh tu theo kiu bin lu tr v vng nh ny c gi cho d bin khng c s dng. auto nh ngha mt bin kiu ng, bin ny ch tn ti khi hm s dng n hot ng, vng nh cha bin ny s c tr li khi hm thc hin xong. double D tr mt word nh nhng khng h tr kiu d liu extern Kiu d liu m rng register Kiu thanh ghi - D liu kiu lit k: D liu kiu lit k l loi d liu m rng dinh ngha thm kiu d liu. Khai bo kiu lit k c thc hin nh sau: enum tn bin {lit k cc gi tr} V d: enum boolean {true,false}; boolean j; // bin j l bin kiu boolean s c cc gi tr l true hay false. - D liu kiu cu trc: D liu kiu cu trc l mt dng d liu phc tp c nh ngha m rng thm cc kiu d liu s dng trong chng trnh. nh ngha kiu cu trc nh sau: Struct tn kiu {kiu d liu tn bin : min gi tr} V d: struct port_b_layout {int data : 4; int rw : 1; int cd : 1; int enable : 1; int reset : 1; }; struct port_b_layout port_b; #byte port_b = 6 struct port_b_layout const INIT_1 = {0, 1,1,1,1}; struct port_b_layout const INIT_2 = {3, 1,1,1,0}; struct port_b_layout const INIT_3 = {0, 0,0,0,0}; struct port_b_layout const FOR_SEND = {0,0,0,0,0}; // All outputs struct port_b_layout const FOR_READ = {15,0,0,0,0}; // Data is an input main() { int x; set_tris_b((int)FOR_SEND); port_b = INIT_1; delay_us(25); port_b = INIT_2; port_b = INIT_3; set_tris_b((int)FOR_READ); port_b.rw=0; port_b.cd=1; port_b.enable=0; Trang 69

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler x = port_b.data; port_b.enable=0 } - nh ngha kiu: Cho php nh ngha thm cc kiu d liu mi t cc kiu d liu chun ca PIC C compiler. Vic nh ngha thm kiu d liu theo quy nh nh sau: typedef tn kiu d liu chun tn kiu d liu mi V d: typedef int byte; // nh ngha kiu d liu c tn byte typedef short bit; // nh ngha kiu d liu c tn bit bit e,f; // Khai bo bin kiu bit byte k = 5; // khai bo bin kiu byte byte const WEEKS = 52; // khai bo hng kiu byte byte const FACTORS [4] ={8, 16, 64, 128}; // khai bo mng tnh kiu byte c. nh ngha cc hm: Cc hm c nh ngha gm cc pht biu thc hin cc gii thut phc v cho d n. Cu trc ca hm nh sau: T kho ca hm tn hm (cc bin m hm s dng) Khai bo cc bin cn thit v cc kiu d liu cho hm { Cc pht biu trong hm } + T kho ca hm gm cc thnh phn: void, #separate , #inline, #int_hoc c th b trng. + Tn hm c t ty + Cc bin s dng trong hm s c phn cch nhau bi du ,. Nu khng s dng bit trong hm th cc bin trong hm b trng. V d: void lcd_putc(char c ) // nh ngha hm { ... } lcd_putc ("Hi There."); // gi hm d. Cc pht biu iu kin v vng lp: + Pht biu iu kin if - else: Pht biu iu kin if else c dng r nhnh chng trnh, pht biu if else c dng nh sau: If (iu kin) { Cc lnh trong chng trnh } else { Cc lnh trong chng trnh } Cp t kha {} c dng nu cc lnh trong chng trnh gm nhiu lnh. Trong trng hp ch c mt lnh th khng cn dng cp t kho {}. V d: if (x==25) Trang 70

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler x=1; else x=x+1; + Vng lp WHILE: Vng lp while c dng lp chng trnh. Cu trc ca vng lp while nh sau: while (biu thc iu kin) { Cc lnh trong chng trnh } Hot ng ca vng lp while l s thc hin cc lnh trong cp t kho {} khi m biu thc iu kin l ng. V d: while(get_rtcc()!=0) { putc(n); getc(); } + Vng lp do while: Vng lp do while c s dng tng t nh vng lp while tuy nhin, vng lp while kim tra iu kin trc khi thc hin cc lnh cn vng lp do while s kim tra iu kin sau khi thc hin cc lnh. Cu trc ca vng lp do while nh sau: do { Cc lnh trong chng trnh } while (biu thc iu kin); V d: do { putc(getc()); get_rtcc(); } while(c!=0); + Vng lp for: Vng lp for c dng lp li chng trnh theo mt bin m. Cu trc ca vng lp for nh sau: For (biu thc 1; biu thc 2; biu thc 3) { Cc lnh trong chng trnh } Trong biu thc 1 l gi tr khi u ca bin m, biu thc 2 l gi tr cui ca bin m, biu thc 3 l biu thc m. V d: For (I=1;I<=100; I++) { b = I +100; Trang 71

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler printf(%u\r\n, I); } + Pht biu SWITCH CASE: Pht biu switch case c dng r nhnh chng trnh. Cu trc ca pht biu ny nh sau: Switch (biu thciu kin) { case iu kin 1: Cc lnh trong chng trnh; Break; Case iu kin 2: Cc lnh trong chng trnh; Break; default: Cc lnh trong chng trnh; Break; } V d: Switch (cmd) { case 0: { printf(cmd 0); break; } case 1: { printf(cmd 1); break; } default: { printf(bad cmd); break; } } + Pht biu return: Pht biu return c dng tr v tr ca hm. Pht bi return nh sau: Return (gi tr); + Pht biu goto: Pht biu goto c dng nhy ti mt nhn trong chng trnh. Pht biu goto c dng nh sau: goto nhn; + Pht biu break: Pht biu break dng kt thc mt nhm lnh trong cp t kha {}. Pht biu break nh sau: break; + Pht biu continue: Pht biu continue dng tip tc thc hin mt nhm lnh trong cp t kha {}. Pht biu continue nh sau: Trang 72

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler continue; e. Cc php ton trong PIC C compiler: Trogn PIC C compiler s dng cc k hiu nh bng sau c trng cho cc php ton. K hiu Php ton Cc php ton s hc + Thc hin php tnh cng += Thc hin php cng dn. V d: x+=y tng t nh x = x + y Thc hin php tnh tr -= Thc hin php tr dn. V d:x-=y tng t nh x = x y * Thc hin php tnh nhn *= Thc hin php nhn dn. V d:x*=y tng t nh x = x * y / Thc hin php tnh chia /= Thc hin php chia dn. V d:x/=y tng t nh x = x / y ++ Thc hin vic tng mt gi tr. V d: i++ tng t nh i = i + 1 -Thc hin vic gim mt gi tr. V d: i-- tng t nh i = i 1 = Php gn. V d: x = 1 % Ly tr tuyt i Cc php ton so snh == Php so snh bng != Php so snh khc > Ln hn >= Ln hn hoc bng < Nh hn <= Nh hn hoc bng Cc php ton nh phn && Php ton AND || Php ton OR >> Dch phi << Dch tri ! o bit ~ Ly b 1 & AND tng bit | OR tng bit sizeof Ly kch thc ca byte II. CC HM TH VIN CA PIC C COMPILER: PIC C compiler xy dng sn 108 hm chia thnh 11 nhm v c cha trong cc file.h. Khi trong chng trnh mun gi cc hm ny th u chng trnh phi khai bo tin x l #use hoc #include trnh bin dch tm cc hm tng ng a vo d an. Nhm hm nh bng sau: Cc hm phc v cng RS232 perror() fputc() getc() assert() fputs() putc() getchar() printf() fgetc() putchar() kbhit() gets() setup_uart() fprintf() puts() set_uart_speed() fgets() Cc hm phc v cng giao tip d liu ni tip ng b SPI Trang 73

setup_spi() spi_read() output_low() output_high() output_float() output_bit() abs() acos() asin() atan() ceil() cos() exp() floor() labs() setup_vref() setup_adc_ports() setup_adc() setup_timer_X() set_timer_X() memset() memcpy() offsetof() offsetofbit() setup_ccpX() set_pwmX_duty() atoi() atoi32() atol() atof() tolower() toupper() isalnum() isalpha() isamoung() isdigit() islower() isspace() isupper()

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler spi_write() spi_data_is_in() Nhm cc hm ph v cng vo ra s input_X() input() port_b_pullups() output_X() set_tris_X() output_toggle() input_state() Cc hm ton hc chun ca C sinh() atan2() log() frexp() log10() ldexp() pow() modf() sin() sqrt() cosh() tan() tanh() div() fabs() ldiv() fmod() Hm phc v in p tham chiu cho Hm phc v chuyn i ADC set_adc_channel() read_adc() Cc hm phc v timer get_timer_X() setup_wdt() setup_counters() restart_wdt() Cc hm qun l b nh memmove() malloc() memcmp() calloc() memchr() free() realloc() Cc hm phc v CCP setup_power_pwm() set_power_pwmx_duty() setup_power_pwm_pins() set_power_pwm_override() Cc hm k t chun ca C strtok() isxdigit() strspn() strlen() strcspn() strcpy() strpbrk() strncpy() strlwr() strcmp() sprintf() stricmp() isprint() strncmp() strtod() strcat() strtol() strstr() strtoul() strchr() strncat() strrchr() strcoll(), strxfrm() isgraph() iscntrl() Cc hm qun l b nhn EEPROM Trang 74

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler read_eeprom() read_calibration() write_external_memory() write_eeprom() write_program_memory() erase_program_memory() read_program_eeprom() read_program_memory() setup_external_memory() write_program_eeprom() Cc hm c bit ca C rand() srand() Cc hm delay delay_us() delay_ms() delay_cycles() Hm phc v analog compare setup_comparator() Chi tit ca mt s hm thng dng trong cc nhm v ch nh tin x l tng ng c trnh by trong cc mc sau: 1. Cc Hm Ton Hc Chun Ca C: a. ABS(): Hm ny c dng tnh gi tr tuyt i ca mt s. + C php : value = abs(x) + Tham s : x l mt s c du 8, 16, hoc 32 bit vi kiu d liu integer hay float. + Tr tr v : cng kiu vi tham s truyn. + Yu cu : cn khai bo #include <stdlib.h> V d: signed int target,actual; ... error = abs(target-actual); b. SIN(), COS(),TAN(), ASIN(), ACOS(), ATAN(): Cc hm lng gic thun v nghch dng tnh sin, cos, tg ca mt gc v tnh lng gic ngc arcsin, arccos, arctg ca mt s. + C php: val = sin (rad) val = cos (rad) val = tan (rad) rad = asin (val) rad = acos (val) rad = atan (val) + Tham s : rad l mt s thc biu th gi tr gc tnh bng radian( -2 n 2). val l mt s thc c gi tr t -1.0 n 1.0 + Tr tr v : rad l mt s thc biu th gi tr gc tnh bng radian( -2 n 2). val l mt s thc c gi tr t -1.0 n 1.0 + Yu cu : khai bo #include<math.h >. V d: float phase; // Pht sng sin for(phase=0; phase<2*3.141596; phase+=0.01) set_analog_voltage( sin(phase)+1 ); c. CEIL(): Hm ny c dng lm trn s theo hng tng. + C php : result = ceil (value) + Tham s : value l mt s thc + Tr tr v : s thc + Yu cu : #include <math.h> V d: Trang 75

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler x = ceil(12.60) khi x = 13. d. EXP(): Hm ny c dng tch tnh hm ex. V d exp(1) is 2.7182818. + C php : result = exp (value) + Tham s : value l mt s thc + Tr tr v : mt s thc + Yu cu : khai bo #include <math.h> V d: // Tnh x lu tha y x_power_y = exp( y * log(x) ); e. FLOOR(): Hm ny c dng lm trn theo hng gim. V d Floor(12.67) is 12.00. + C php : result = floor (value) + Tham s : value l mt s thc + Tr tr v : s thc + Yu cu : khai bo #include<math.h>. V d: // Tm phn l 1 frac = value - floor(value); f. LABS(): Hm ny c dng xc nh gi tr tuyt i ca mt s long integer. + C php : result = labs (value) + Tham s : value l mt s 16 bit long int + Tr tr v : mt 16 bit signed long int + Yu cu : khai bo #include <stdlib.h>. V d: if( labs( target_value - actual_value ) > 500 ) printf("Error is over 500 points\r\n"); g. LOG(): Hm ny c dng tnh logarit c s t nhin ln. + C php : result = log (value) + Tham s : value l tham s kiu float + Tr tr v : kiu float + Yu cu : khai bo #include <math.h>. V d: lnx = log(x); h. LOG10(): Hm ny c dng tnh logarit c s 10 log. + C php : result = log10 (value) + Tham s : value l tham s kiu float + Tr tr v : kiu float + Yu cu : khai bo #include <math.h>. V d: logx = log10(x); i. POW(): Hm ny c dng tnh lu tha n ca mt s + C php : f = pow (x,n) + Tham s : x, n l s thc Trang 76

+ Tr tr v : + Yu cu : V d: F = pow(2,3); // Tnh 23 , F c gi tr bng 8 j. SQRT(): Hm ny c dng tnh cn bc 2 ca mt s khng m. + C php : result = sqrt (value) + Tham s : value l kiu float + Tr tr v : kiu float + Yu cu : #include <math.h> V d: distance = sqrt( sqr(x1-x2) + sqr(y1-y2) ); 2. Nhm Cc Hm K T Chun Ca C: a. ATOI(), ATOL(), ATOI32(): Hm ny c dng chuyn mt chui thnh mt s nguyn . Cho php tham s gm decimal v hexadecimal. + C php : ivalue = atoi(string) hoc lvalue = atol(string) hoc i32value = atoi32(string) + Tham s : string l mt chui k t + Tr tr v : ivalue l mt s nguyn 8 bit. lvalue l mt s nguyn kiu int 16 bit. i32value l kiu s nguyn 32 bit. + Yu cu : #include <stdlib.h> V d: char string[10]; int x; strcpy(string,"123"); x = atoi(string); // x s l 123 b. ATOF(): Hm ny c dng chuyn mt chui thnh mt s c kiu du chm phy ng. + C php : result = atof(string) + Tham s : string l mt chui k t. + Tr tr v : mt s thc du chm phy ng 32 bit. + Yu cu : #include <stdlib.h> V d: char string [10]; float x; strcpy (string, "123.456"); x = atof(string); // x s l 123.45a2 c. TOLOWER(), TOUPPER(): Cc hm ny c s dng thay i case ca cc k t. TOLOWER(X) s chuyn 'a'..'z' ca X thnh 'A'..'Z'. TOUPPER(X) s thc hin chc nng ngc li, tc chuyn 'A'..'Z' ca X thnh 'a'..'z' + C php : result = tolower (cvalue) result = toupper (cvalue) + Tham s : cvalue l mt k t Trang 77

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler s thc #include <math.h>

+ Tr tr v : + Yu cu : V d: switch( toupper(getc()) ) { case 'R' : read_cmd(); break; case 'W' : write_cmd(); break; case 'Q' : done=TRUE; break; } d. ISALNUM(), ISALPHA(), ISDIGIT(), ILOWER(), ISSPACE(), ISUPPER(), ISXDIGIT(): Cc hm ny c s dng test k t nm trong khong cho php theo sau: isalnum(x) X is 0..9, 'A'..'Z', or 'a'..'z' isalpha(x) X is 'A'..'Z' or 'a'..'z' isdigit(x) X is '0'..'9' islower(x) X is 'a'..'z' isupper(x) X is 'A'..'Z isspace(x) X is a space isxdigit(x) X is '0'..'9', 'A'..'F', or 'a'..'f' + C php: value = isalnum(datac) value = isalpha(datac) value = isdigit(datac) value = islower(datac) value = isspace(datac) value = isupper(datac) value = isxdigit(datac) + Tham s :datac l mt k t 8 bit + Tr tr v :0 (or FALSE) nu datac khng thuc mt s tiu chun quy nh, 1 (or TRUE) nu ngc li. + Yu cu :ctype.h V d: char id[20]; ... if(isalpha(id[0])) { valid_id=TRUE; for(i=1;i<strlen(id);i++) valid_id=valid_id&& isalnum(id[i]); } else valid_id=FALSE; e. ISAMOUNG(): Hm ny c dng tr v TRUE nu k t l mt k t trong chui hng (tm k t trong mt chui). + C php : result = isamoung (value, cstring) + Tham s : value l kiu k t cstring l chui hng + Tr tr v : 0 (or FALSE) nu value khng phi l cstring 1 (or TRUE) nu value l cstring + Yu cu : khng Trang 78

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler mt k t 8 bit khng

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler V d: char x; ... if( isamoung( x, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ") ) printf("The character is valid"); Example Files: ctype.h 3. Cc Hm X L Chui Chn: a. STRCAT(): Hm ny c dng ghp 2 chui. + C php: ptr=strcat(s1, s2) + Tham s: s1 and s2 l pointer tr ti vng nh ca mng k t (hoc tn mt mng. Cn lu rng s1 and s2 khng phi l mt chui hng (v d "hi"). + Tr tr v: ptr l bin con tr ca s1 + Yu cu: #include <string.h> V d: char string1[10], string2[10]; strcpy(string1,"hi "); // string1 l hi strcpy(string2,"there"); // string2 l there strcat(string1,string2); // string1 l hi there printf("Length is %u\r\n", strlen(string1) ); // Gi qua RS 232 gi tr l 8 b. STRCHR(): Hm ny c dng tm k t trong chui v tr v v tr ca k t trong chui. + C php: ptr=strchr(s1, c) // Tm k t c trong chui s1, tr v v tr ca c trong s1 + Tham s: s1 l pointer tr ti vng nh ca mng k t (hoc tn mt mng, c l k t kiu char. + Tr tr v: ptr l bin con tr ca s1 + Yu cu: #include <string.h> c. STRRCHR(): Hm ny c chc nng v hot ng tng t nh hm strchr() nhng tm theo chiu ngc li. + C php: ptr=strrchr(s1, c) // Tm k t c trong chui s1, tr v v tr ca c trong s1 + Tham s: s1 l pointer tr ti vng nh ca mng k t (hoc tn mt mng, c l k t kiu char). + Tr tr v: ptr l bin con tr ca s1 + Yu cu: #include <string.h> d. STRCMP(): Hm ny c dng so snh 2 chui. + C php: cresult =strcmp(s1, s2) // So snh chui s1 v s2 + Tham s: s1, s2 l pointer tr ti vng nh ca mng k t (hoc tn mt mng). + Tr tr v: result l: -1 (less than), 0 (equal) or 1 (greater than) + Yu cu: #include <string.h> e. STRNCMP(): Hm ny c dng so snh chui s1 vi s2 (n bytes). + C php: iresult=strncmp(s1, s2, n) // so snh chui s1 vi s2 (n bytes) + Tham s: s1, s2 l pointer tr ti vng nh ca mng k t (hoc tn mt mng), n l s byte. + Tr tr v: iresult l s nguyn 8 bit kiu int + Yu cu: #include <string.h> f. STRICMP(): Hm ny c dng so snh chui s1 vi s2 (khng bit s1 v s2). Trang 79

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler + C php: iresult=stricmp(s1, s2) // so snh trong trng hp khng bit s1 v s2 + Tham s: s1, s2 l pointer tr ti vng nh ca mng k t (hoc tn mt mng). + Tr tr v: iresult l s nguyn 8 bit kiu int + Yu cu: #include <string.h> g. STRNCPY(): Hm ny c dng copy n k t t s2 v gn vo s1. + C php: ptr=strncpy(s1, s2, n) + Tham s: s1, s2 l pointer tr ti vng nh ca mng k t (hoc tn mt mng), n l s k t . + Tr tr v: ptr l bin con tr ca s1 + Yu cu: #include <string.h> h. STRCSPN(): Hm ny c dng m s k t u ca chui s1 khng nm trong chui s2.. + C php: iresult=strcspn(s1, s2) + Tham s: s1, s2 l pointer tr ti vng nh ca mng k t (hoc tn mt mng). + Tr tr v: iresult l s nguyn 8 bit kiu int + Yu cu: #include <string.h> i. STRSPN(): Hm ny c dng m s k t u ca chui s1 nm trong chui s2.. + C php: iresult=strspn(s1, s2) + Tham s: s1, s2 l pointer tr ti vng nh ca mng k t (hoc tn mt mng). + Tr tr v: iresult l s nguyn 8 bit kiu int + Yu cu: #include <string.h> j. STRLEN(): Hm ny c dng tnh chiu di ca chui s1. + C php: iresult=strlen(s1) + Tham s: s1 l pointer tr ti vng nh ca mng k t (hoc tn mt mng). + Tr tr v: iresult l s nguyn 8 bit kiu int + Yu cu: #include <string.h> k. STRLWR(): Hm ny c dng chuyn cc k t trong chui s1 thnh ch thng. + C php: ptr =strlwr(s1) + Tham s: s1 l pointer tr ti vng nh ca mng k t (hoc tn mt mng). + Tr tr v: ptr l bin con tr ca s1 + Yu cu: #include <string.h> l. STRPBRK(): Hm ny c dng tm v tr ca k t trong chui s1 v l k t u trong chui s2. + C php: ptr =strpbrk(s1, s2) + Tham s: s1, s2 l pointer tr ti vng nh ca mng k t (hoc tn mt mng). + Tr tr v: ptr l bin con tr ca s1 + Yu cu: #include <string.h> m. STRSTR(): Hm ny c dng tm v tr ca chui s2 trong chui s1. + C php: ptr =strstr(s1, s2) + Tham s: s1, s2 l pointer tr ti vng nh ca mng k t (hoc tn mt mng). + Tr tr v: ptr l bin con tr ca s1 + Yu cu: #include <string.h> n. STRCPY(): Hm ny c dng Copy mt mt hng hoc mt chui t src vo mt chui dest. Trang 80

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler + C php: strcpy (dest, src) + Tham s: dest l pointer tr n vng nh ca dy k t. src c th l chui hng hoc l mt pointer + Tr tr v: khng + Yu cu: khng V d: char string[10], string2[10]; strcpy (string, "Hi There"); strcpy(string2,string); o. STRTOK(): Hm ny c dng Tm m k tip trong phm vi s1 bng k t c tch ra t chui s2 v tr con tr v li ch . Ln gi u tin bt u ti v tr u ca s1 v tm kim cho n khi thy c k t NOT cha trong s2, v tr vk t NULL nu khng tm thy. Nu khng tm thy, n bt u vi m u tin ( tr li gi tr c ). Lnh ny ( tip tc tm kim ) lc tip tc tm kim k t cha trong s2. Nu khng tm thy, t m hin ti cho n m kt thc ca s1,tiptc tm kim cho n ht m vch s tr v gi tr NULL. Nu 1 c tm thy n s c vit ln bi \0, kt thc m. Lnh ny s lu li bin con tr sau mt k t t ln kii tip theo s c bt u. Mi ln gi tip theo vi 0 l i s, bt u tm kim vi gi tr con tr c lu trc . +C php : ptr = strtok(s1, s2) + Tham s : s1, s2 l bin con tr ch n k t ca mng ( hoc tn ca mng ). Ch rng s1, s2 c th khng phi l hng s ( mc cao ). S1 c th bng 0 bo l hnh ng vn c thc hin. + Tr tr v: ptr tr ti k t cn trong s1 hoc n bng 0. + Li ch: Tt c cc thit b. + Yu cu: #include <string.h> V d: char string[30], term[3], *ptr; strcpy(string,"one,two,three;"); strcpy(term,",;"); ptr = strtok(string, term); while(ptr!=0) { puts(ptr); ptr = strtok(0, term); } // Prints: one two three 4. Nhm Hm Qun L B Nh Ca Ca C: a. MEMSET(): Hm ny c dng copy n byte ca value vo b nh ch. + C php: memset (destination, value, n) + Tham s: destination l mt con tr; value, n s nguyn 8bit. + Tr tr v: khng + Yu cu : khng V d: Trang 81

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler memset(arrayA, 0, sizeof(arrayA)); memset(arrayB, '?', sizeof(arrayB)); memset(&structA, 0xFF, sizeof (structA)); b. MEMCPY(), MEMMOVE(): Hm ny c dng copy n byte t source n destination trong RAM. + C php: memcpy (destination, source, n) memmove(destination, source, n) + Tham s: destination l mt bin con tr trong b nh, source l bin con tr trong vng nh, n l s byte cn chuyn + Tr tr v: khng + Yu cu: khng V d: memcpy(&structA,&structB,sizeof (structA)); memcpy(arrayA,arrayB,sizeof (arrayA)); memcpy(&structA, &databyte, 1); 5. Lnh ANALOG COMPARE (SETUP_COMPARATOR()): Hm ny c dng khi to khi analog comparator. Hng s trn c 4 gi tr ca u vo C1-, C1+, C2-, C2+ + C php: setup_comparator (mode) + Tham s: mode l hng s. Cc hng s hp l c cha trong cc file c ui .h v c th nh sau: A0_A3_A1_A2 A0_A2_A1_A2 NC_NC_A1_A2 NC_NC_NC_NC A0_VR_A1_VR A3_VR_A2_VR A0_A2_A1_A2_OUT_ON_A3_A4 A3_A2_A1_A2 + Tr tr v: khng nh ngha + Li ch: lnh ny ch dng cho cc thit b c analog comparator. + Yu cu: Hng s c nh ngha trong file c tn devices.h V d: // Sets up two independent comparators (C1 and C2), // C1 uses A0 and A3 as inputs (- and +), and C2 // uses A1 and A2 as inputs setup_comparator(A0_A3_A1_A2); 6. Lnh SETUP_VREF(): Hm ny c dng thit lp in p tham chiu cho tn hiu analog v/hoc cho xut ra tn hiu qua chn A2. + C php: setup_vref (mode | value) + Tham s: mode c th l 1 trong cc hng s sau: FALSE (off) VREF_LOW for VDD*VALUE/24 VREF_HIGH for VDD*VALUE/32 + VDD/4 Gi tr l s nguyn 0-15 bit + Tr tr v : Khng xc nh + Li ch : lnh ny ch s dng vi thit b c phn VREF. + Yu cu : Hng s c nh ngha trong file c tn devices.h Trang 82

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler V d: setup_vref (VREF_HIGH | 6); // At VDD=5, the voltage is 2.19V 7. Nhm Hm Qun L ROM Ni: a. READ_EEPROM(): Hm ny c dng c byte t a ch d liu EEPROM xc nh. a ch bt u 0 v phm vi ph thuc vo chc nng. + C php :value = read_eeprom (address) + Tham s :a ch l mt s nguyn 8 bit. + Tr tr v :l mt s nguyn 8 bit. + Li ch :Lnh ny ch c tc dng vi cc thit b c gn phn EEPROMS. + i hi :Khng. V d: #define LAST_VOLUME 10 volume = read_EEPROM (LAST_VOLUME); b. WRITE_EEPROM(): Hm ny c dng ghi byte vo a ch d liu EEPROM xc nh. Lnh ny c th chim vi phn nghn giy ca chu k my. Lnh ny ch lm vic vi cc thit b c ci sn chng trnh EEPROM bn trong n. Lnh ny cng c tc dng vi cc thit b c phn EEPROM ngoi hoc vi b phn EEPROM ring bit (line the 12CE671), xem thm EX_EXTEE.c with CE51X.c, CE61X.c or CE67X.c. + C php :write_eeprom (address, value) + Tham s :a ch l mt s nguyn 8 bit, phm vi ph thuc vo thit b, gi tr l mt s nguyn 8 bit. + Tr tr v :Khng r. + Li ch :Lnh ny ch thc hin vi cc thit b c phn mm h tr trn chip. + Yu cu :Khng. V d: #define LAST_VOLUME 10 // Location in EEPROM volume++; write_eeprom(LAST_VOLUME,volume); c. READ_PROGRAM_EEPROM(): Hm ny c dng c t nhng vng chng trnh EEPROM ring bit. + C php : write_program_eeprom (address, data) + Tham s :a ch l 16 bit cho vng PCM v l 32 bit cho vng PCH, d liu l 16 bit cho vng PCM v 8 bit cho vng PCH. + Tr tr v :Tu d liu trong EEPROM + Li ch : Ch c cc thit b cho php c t b nh chng trnh. + Yu cu :Khng. V d: write_program_eeprom(0,0x2800); //disables program d. READ_CALIBRATION(): Hm ny c th c c kch c ca tham s n vo khong 14000, l ln ca b nh. + C php : value = read_calibration (n) + Tham s : n l kch thc b nh, v b nh bt u l 0. + Tr tr v : L byte 8 bit. + Li ch : Lnh ny ch dng cho PIC 14000. + Yu cu : Khng. V d: fin = read_calibration(16); Trang 83

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler 8. Nhm Hm Vo/Ra S: a. OUTPUT_LOW(): Hm ny dng reset cc chn ca MCU v mc logic 0 + C php: output_low (pin) + Tham s: cc chn (pin) phi c nh ngha trong file tiu devices .h. Gi tr hot ng l bit a ch. V d, cn port A (byte 5) bit 3 tng ng vi gi tr 5*8+3 or 43 th s nh ngha nh sau: #define PIN_A3 43 + Tr tr v: khng + Yu cu: Chn IC phi c nh ngha trong tp tin tiu devices .h b. OUTPUT_HIGH(): Hm ny dng set cc chn ca MCU ln mc logic 1. + C php: output_high(pin) + Tham s: cc chn (pin) phi c nh ngha trong file tiu devices .h. Gi tr hot ng l bit a ch. V d, cn port A (byte 5) bit 3 tng ng vi gi tr 5*8+3 or 43 th s nh ngha nh sau: #define PIN_A3 43 + Tr tr v: khng + Yu cu: V d: #include <16f877.h> #use delay(clock=20000000) #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) // Jumpers: 8 to 11, 7 to 1 void main() { printf("Press any key to begin\n\r"); getc(); printf("1 khz signal activated\n\r"); while (TRUE) { output_high(PIN_B0); delay_us(500); output_low(PIN_B0); delay_us(500); } } c. OUTPUT_FLOAT(): Hm ny dng Set mode input cho cc chn. Hm ny cho php pin mc cao vi mc ch nh l mt cc collector thu h. + C php: output_float(pin) + Tham s: cc chn (pin) phi c nh ngha trong file tiu devices .h. Gi tr hot ng l bit a ch. V d, cn port A (byte 5) bit 3 tng ng vi gi tr 5*8+3 or 43 th s nh ngha nh sau: #define PIN_A3 43 + Tr tr v: khng + Yu cu: Chn IC phi c nh ngha trong tp tin tiu devices .h Trang 84 Chn IC phi c nh ngha trong tp tin tiu devices .h

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler V d: if( (data & 0x80)==0 ) output_low(pin_A0); else output_float(pin_A0); d. OUTPUT_BIT(): Hm ny c dng xut gi tr 0 hoc 1 trn cc ng ra. + C php: output_bit (pin, value) + Tham s: tng t output_low(pin) v output_high(pin) + Tr tr v: khng + Yu cu: chn IC phi c nh ngha trn cc tp tin tiu devices .h V d: output_bit( PIN_B0, 0); // Ging nh output_low(pin_B0); output_bit( PIN_B0,input( PIN_B1 ) ); // t chn B0 ging chn B1 output_bit( PIN_B0,shift_left(&data,1,input(PIN_B1))); e. INPUT(): Hm ny tr v trng thi cc chn. Phng thc I/O ph thuc vo USE *_IO iu khin trc . + C php: value = input (pin) + Tham s: cc chn ca device phi c khai bo trong tp tin tiu device.h v s c c sau lnh input(). Gi tr l cc bit a ch. + Tr tr v: 0 (or FALSE) nu gi tr trn chn IC l 0 1 (or TRUE) nu gi tr trn chn IC l 1 V d: while ( !input(PIN_B1) ); // waits for B1 to go high if( input(PIN_A0) ) printf("A0 is now high\r\n"); f. OUTPUT_X(): Hm ny c dng xut mt byte ra cng. Cng iu khin ph thuc vo khai bo iu khin #USE *_IO trc + C php : output_a (value) output_b (value) output_c (value) output_d (value) output_e (value) + Tham s : value l mt s nguyn 8 bit + Tr tr v : khng + Yu cu : khng V d: OUTPUT_B(0xf0); // Xut 11110000b ra port B g. INPUT_X(): Hm ny c dng nhp mt byte t Port. Port iu khin ph thuc vo khai bo iu khin #USE*_IO trc . + C php: value = input_a() value = input_b() value = input_c() value = input_d() value = input_e() Trang 85

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler + Tham s: khng + Tr tr v: s nguyn 8 bit. + Yu cu : khng V d: data = input_b(); h. PORT_B_PULL-UPS(): Hm ny c dng Sets cng vo B pullup. TRUE s hot ng, v FALSE s ngng. + C php: port_b_pull-ups (value) + Tham s: value l bin bool logic ( TRUE hoc FALSE) + Tr tr v: khng Lu : Ch c trn cc thit b 14 v 16 bit (PCM and PCH). (Note: use SETUP_COUNTERS trong PCB phn). V d: port_b_pullups(FALSE); i. SET_TRIS_X(): Nhng hm ny nh ngha chn I/O cho mt port. iu ny ch thc hin c khi s dng FAST_IO v khi cng xut nhp c truy cp. Mi bit i din cho mt chn. s 1 ch chn nhp v 0 ch chn xut + C php: set_tris_a (value) set_tris_b (value) set_tris_c (value) set_tris_d (value) set_tris_e (value) + Tham s: value l s nguyn 8 bit vi mi bit i din cho mt cng xut nhp. + Yu cu: khng V d: SET_TRIS_B( 0x0F ); // B7,B6,B5,B4 l xut, B3,B2,B1,B0 l nhp 9. Nhm Lnh Trn Bit, Byte: a. SHIFT_RIGHT(), SHIFT_LEFT(): Cc hm ny c dng dch phi (tri) mt bit vo mt mng hay mt cu trc. a ch phi l mt nh ngha mng hoc a ch tr ti cu trc (such as &data). Bit 0 ca byte thp trong RAM s c x l bng LSB. + C php: shift_right (address, bytes, value) + Tham s: address a ch tr ti vng nh, bytes l s byte thao tc, value l 0 hoc 1 c dch vo. + Tr tr v: 0 or 1 i vi bit b dch ra + Yu cu : khng V d: // c 16 bit t chn A1, mi khi chn A2 chuyn t 0 sang 1 (cnh ln) struct { byte time; byte command : 4; byte source : 4; } msg; for(i=0; i<=16; ++i) { while(!input(PIN_A2)); shift_right(&msg,3,input(PIN_A1)); while (input(PIN_A2)) ; Trang 86

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler } // Dch 8 bit ra chn A0, bt u t bit LSB. for(i=0;i<8;++i) output_bit(PIN_A0,shift_right(&data,1,0)); b. ROTATE_RIGHT(): Hm ny c dng quay phi mt bit ca mt mng hay cu trc. . a ch phi l mt nh ngha mng hoc a ch tr ti cu trc (such as &data). Bit 0 ca byte thp trong RAM s c x l bng LSB. + C php: rotate_right (address, bytes) + Tham s: address a ch vng nh, bytes l s byte thao tc. + Tr tr v: khng + Yu cu : khng V d: struct { int cell_1 : 4; int cell_2 : 4; int cell_3 : 4; int cell_4 : 4; } cells; rotate_right( &cells, 2); rotate_right( &cells, 2); rotate_right( &cells, 2); rotate_right( &cells, 2); // cell_1->4, 2->1, 3->2 and 4-> 3 c. ROTATE_LEFT(): Hm ny c dng quay tri mt bit. + C php: rotate_left (address, bytes) + Tham s: address l a ch con tr trong vng nh, byte l s byte thao tc + Tr tr v: khng + Yu cu : khng V d: x = 0x86; rotate_left( &x, 1); // x = 0x0d d. BIT_CLEAR(): Hm ny c dng xo bit ca mt bin (0-7, 0-15 or 0-31). Hm ny tng ng: var &= ~(1<<bit); + C php: bit_clear(var,bit) + Tham s: var c th l bin hay gi tr 8,16 hoc 32 bit, bit l mt s 0-31 th hin s bit, 0 l LSB. + Tr tr v: khng + Yu cu : None V d: int x; x=5; bit_clear(x,2); // x is now 1 bit_clear(*11,7); // A crude way to disable ints e. BIT_SET(): Hm ny c dng Sets bit cho mt bin. Hm ny tng ng: var |= (1<<bit); + C php: bit_set(var,bit) Trang 87

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler Tham s: var l bin 8,16 or 32 bit, bit l mt s t 0-31 th hin s bit, 0 l bit c trng s thp nht. + Tr tr v: khng + Yu cu : khng V d: int x; x=5; bit_set(x,3); // x is now 13 bit_set(*6,1); // A crude way to set pin B1 high f. BIT_TEST(): Hm ny c dng test bit (0-7,0-15 or 0-31) trong mt bin. + C php: value = bit_test (var,bit) Tham s: var l bin 8,16 or 32 bit, bit l mt s t 0-31 th hin s bit, 0 l bit c trng s thp nht. + Tr tr v: 0 or 1 + Yu cu : khng. V d: if( bit_test(x,3) || !bit_test (x,1) ) { //Nu bit 3 l 1 hoc bit 1 l 0 } if(data!=0) for(i=31;!bit_test(data,i);i--) ; g. SWAP(): Hm ny c dng tro i bit thp thnh cao ca mt byte. Hm ny tng ng vi:byte = (byte << 4) | (byte >> 4); + C php: swap (lvalue) + Tham s: lvalue l bin mt byte + Tr tr v: khng CNH BO: hm ny khng cho kt qu + Tr trv : khng V d: x=0x45; swap(x); //x now is 0x54 h. MAKE8(): Hm ny c dng trch mt byte t mt bin. + C php:: i8 = MAKE8(var,offset) + Tham s: var l s nguyn 16 hoc 32 bit. offset is a byte offset of 0,1,2 or 3. + Tr tr v: s nguyn 8 bit V d: int32 x; int y; y = make8(x,3); // Gets MSB of x i. MAKE16(): Hm ny c dng to mt s 16 bit t hai s 8 bit. + C php:: i16 = MAKE16(varhigh, varlow) + Tham s: varhigh, varlow l hai s 8 bit. + Tr tr v: mt s nguyn 16 bit + Tr tr v: khng Trang 88

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler V d: long x; int hi,lo; x = make16(hi,lo); j. MAKE32(): Hm ny c dng to mt s 32 bit t s 8 and 16 bit. + C php:: i32 = MAKE32(var1, var2, var3, var4) + Tham s: var1-4 l s 8 or 16 bit . var2-4 l cc tu chn. + Tr trv: mt s 32 bit + Yu cu: Nothing V d: int32 x; int y; long z; x = make32(1,2,3,4); // x is 0x01020304 y=0x12; z=0x4321; x = make32(y,z); // x is 0x00124321 x = make32(y,y,z); // x is 0x12124321 10.Nhm Hm Phc V Delay: a. DELAY_CYCLES(): Hm ny c dng thc hin delay mt s xung lnh (instruction clock) nh trc. Mt xung lnh bng 4 xung dao ng + C php:: delay_cycles(count) + Tham s: count hng s 0~255 + Tr tr v: khng + Yu cu: khng V d: delay_cycles(25); //Vi xung clock dao ng 20MHz, chng trnh s delay 5us //25 x (4/20000000) = 5us b. DELAY_MS(): Hm ny c dng thc hin delay mt thi gian nh trc. Thi gian tnh bng milisecond. Hm ny s thc hin mt s lnh nhm delay 1 thi gian yu cu. Hm ny khng s dng bt k timer no. Nu s dng ngt (interupt), thi gian thc hin cc lnh trong khi ngt khng c tnh vo thi gian delay. + C php: delay_ms(time) + Tham s: time - 0~255 nu time l mt bin s, 0~65535 nu time l hng s + Tr tr v: khng + Yu cu: #uses delay c. DELAY_US(): Hm ny c dng thc hin delay mt thi gian nh trc. Thi gian tnh bng microsecond. Shorter delays will be INLINE code and longer delays and variable delays are calls to a function. Hm ny s thc hin mt s lnh nhm delay 1 thi gian yu cu. Hm ny khng s dng bt k timer no. Nu s dng ngt (interupt), thi gian thc hin cc lnh trong khi ngt khng c tnh vo thi gian delay. + C php: delay_us(time) + Tham s: time - 0~255 nu time l mt bin s, 0~65535 nu time l hng s + Tr tr v: khng + Yu cu: #uses delay 11.Nhm Hm Timer v Counter: Trang 89

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler a. RESTART_WDT(): Hm ny c dng Khi ng li watchdog timer. + C php:: restart_wdt() + Tham s: khng + Tr tr v: khng + Yu cu: #fuses b. SETUP_WDT(): Hm ny c dng nh ch hot ng cho watchdog timer. + C php: setup_wdt(mode) + Tham s: Mode c th l mt trong cc hng s sau WDT_18MS WDT_36MS WDT_72MS WDT_144MS WDT_288MS WDT_576MS WDT_1152MS WDT_2304MS + Tr tr v: khng + Yu cu: #fuses cc hng s phi c nh ngha trong device file PIC16F876.h c. SETUP_COUNTRES(): Hm ny c dng Set up RTCC hay WDT + C php: setup_counters(rtcc_state, ps_state) + Tham s: rtcc_state hng s, c nh ngha nh sau RTCC_INTERNAL RTCC_EXT_L_TO_H 32 RTCC_EXT_H_TO_L 48 ps_state hng s, c nh ngha nh sau RTCC_DIV_2 0 RTCC_DIV_4 1 RTCC_DIV_8 2 RTCC_DIV_16 3 RTCC_DIV_32 4 RTCC_DIV_64 5 RTCC_DIV_128 6 RTCC_DIV_256 7 RTCC_8_BIT 0 WDT_18MS 8 WDT_36MS 9 WDT_72MS 10 WDT_144MS 11 WDT_288MS 12 WDT_576MS 13 WDT_1152MS 14 WDT_2304MS 15 + Tr tr v: khng tr v + Yu cu: cc hng s phi c nh ngha trong device file .h d. GET_RTCC(), GET_TIMER0(): Trang 90

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler Hm ny c dng tr v gi tr bin m ca real time clock/counter. Khi gi tr timer vt qu 255, value c t tr li 0 v m tip tc (, 254, 255, 0, 1, 2, ) + C php:: value = get_rtcc() value = get_timer0() + Tham s: khng + Tr tr v: 8 bit int 0~255 + Yu cu: khng e. SET_RTCC(), SET_TIMER0(): Hm ny c dng t gi tr ban u cho real time clock/counter. Tt c cc bin u m tng. Khi gi tr timer vt qu 255, value c t tr li 0 v m tip tc (, 254, 255, 0, 1, 2, ) + C php: set_rtcc() set_timer0() + Tham s: 8 bit, value = 0~255 + Tr tr v: khng + Yu cu: khng f. SETUP_TIMER1(): Hm ny c dng khi ng timer 1. Sau timer 1 c th c ghi hay c dng lnh set_timer1() hay get_timer1(). Timer 1 l 16 bit timer. Vi xung clock l 20MHz, timer 1 tng 1 n v sau mi 1,6us (khi ta dng ch T1_DIV_BY_8) v trn sau 104,8576ms. + C php: setup_timer_1(mode) + Tham s: mode - tham s nh sau T1_DISABLED : tt timer1 T1_INTERNAL : xung clock ca timer1 bng xung clock ni ca IC (OSC/4) T1_EXTERNAL : ly xung ngoi qua chn C0 (khng ch ng b) T1_EXTERNAL_SYNC : ly xung ngoi qua chn C0 ch ng bo (khi ch ny nu CPU ch SLEEP T1_CLK_OUT : enable xung clock ra T1_DIV_BY_1 :65536-(samplingtime(s)/(4/20000000)) timemax=13.1ms T1_DIV_BY_2 :65536-(samplingtime(s)/(8/20000000)) timemax=26.2ms T1_DIV_BY_4 : 65536-(samplingtime (s)/(16/20000000))timemax=52.4ms T1_DIV_BY_8 :65536-(samplingtime(s)/(32/20000000))timemax=104.8ms + Tr tr v: khng + Yu cu: cc hng s phi c nh ngha trong device file .h g. GET_TIMER1(): Hm ny c dng tr v gi tr bin m ca real time clock/counter. Khi gi tr timer vt qu 65535, value c t tr li 0 v m tip tc (, 65534, 65535, 0, 1, 2, ) + C php:: value = get_timer1() + Tham s: khng + Tr tr v: 16 bit int 0~65535 + Yu cu: khng h. SET_TIMER1(): Hm ny c dng t gi tr ban u cho real time clock/counter. Tt c cc bin u m tng. Khi gi tr timer vt qu 65535, value c t tr li 0 v m tip tc (, 65534, 65535, 0, 1, 2, ) + C php:: set_timer1() + Tham s: 16 bit, value = 0~65535 + Tr tr v: khng Trang 91

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler + Yu cu: khng i. SETUP_TIMER2(): Hm ny c dng khi ng timer 2. mode qui nh s chia xung clock. Sau timer 2 c th c ghi hay c dng lnh set_timer2() hay get_timer2(). Timer 1 l 8 bit counter/timer. + C php: setup_timer_2(mode,period,postscale) + Tham s: mode - tham s nh sau T2_DISABLED : tt timer2 T2_DIV_BY_1 : T2_DIV_BY_4 : T2_DIV_BY_16 : Period 0~255 qui nh khi gi tr clock c reset Postscale 1~16 qui nh s ln reset timer trc khi ngt (interupt) + Tr tr v: khng + Yu cu: cc hng s phi c nh ngha trong device file PIC16F876.h V d: Hm ny c th dng t tn s cho PWM v c tnh nh sau
fre = [( OSC
oscillator fre. instruction fre.

/ 4) / timemode ] /
1 or 4 or 16

255
tick / rollover

SETUP_TIMER_2(T2_DIV_BY_1,255,1):PWM frequency=[(20MHz/4)/1]/255= 19,61kHz SETUP_TIMER_2(T2_DIV_BY_4,255,1): PWM frequency = [(20MHz/4)/4]/255 = 4,90kHz SETUP_TIMER_2(T2_DIV_BY_16,255,1): PWM frequency = [(20MHz/16)/1]/255 = 1,23kHz

j. GET_TIMER2(): Hm ny c dng tr v gi tr bin m ca real time clock/counter. Khi gi tr timer vt qu 255, value c t tr li 0 v m tip tc (, 254, 255, 0, 1, 2, ) C php: value = get_timer2() Tham s: khng Tr tr v: 8 bit int 0~255 Yu cu: khng k. SET_TIMER2(): Hm ny c dng t gi tr ban u cho real time clock/counter. Tt c cc bin u m tng. Khi gi tr timer vt qu 255, value c t tr li 0 v m tip tc (, 254, 255, 0, 1, 2, ) + C php: set_timer2(value) + Tham s: 8 bit, value = 0~255 + Tr tr v: khng + Yu cu: khng 12.Nhm Hm Qun L ADC: a. SETUP_ADC(): Hm ny c dng nh cu hnh cho b bin i A/D + C php: setup_adc(mode) + Tham s: mode mode chuyn i Analog ra Digital bao gm ADC_OFF: tt chc nng s dng A/D
ADC_CLOCK_INTERNAL: thi gian ly mu bng clock, clock l thi gian clock trong IC

ADC_CLOCK_DIV_2: thi gian ly mu bng clock/2 ADC_CLOCK_DIV_8: thi gian ly mu bng clock/8 ADC_CLOCK_DIV_32: thi gian ly mu bng clock/32 + Tr tr v: khng + Yu cu: cc hng s phi c nh ngha trong device file .h b. SETUP_ADC_PORT(): Hm ny c dng xc nh cng dng nhn tn hiu analog Trang 92

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler + C php: setup_adc_ports(value) + Tham s: value hng s c nh ngha nh sau NO_ANALOGS : khng s dng cng analog ALL_ANALOG : RA0 RA1 RA2 RA3 RA5 RE0 RE1 RE2 Ref=Vdd ANALOG_RA3_REF : RA0 RA1 RA2 RA5 RE0 RE1 RE2 Ref=RA3 A_ANALOG : RA0 RA1 RA2 RA3 RA5 Ref=Vdd A_ANALOG_RA3_REF : RA0 RA1 RA2 RA5 Ref=RA3 RA0_RA1_RA3_ANALOG : RA0 RA1 RA3 Ref=Vdd RA0_RA1_ANALOG_RA3_REF : RA0 RA1 Ref=RA3 ANALOG_RA3_RA2_REF : RA0 RA1 RA5 RE0 RE1 RE2 Ref=RA2,RA3 ANALOG_NOT_RE1_RE2 : RA0 RA1 RA2 RA3 RA5 RE0 Ref=Vdd ANALOG_NOT_RE1_RE2_REF_RA3 : RA0 RA1 RA2 RA5 RE0 Ref=RA3 ANALOG_NOT_RE1_RE2_REF_RA3_RA2 : RA0 RA1 RA5 RE0 Ref=RA2,RA3 A_ANALOG_RA3_RA2_REF : RA0 RA1 RA5 Ref=RA2,RA3 RA0_RA1_ANALOG_RA3_RA2_REF : RA0 RA1 Ref=RA2,RA3 RA0_ANALOG : RA0 RA0_ANALOG_RA3_RA2_REF : RA0 Ref=RA2,RA3 + Tr tr v: khng + Yu cu: cc hng s phi c nh ngha trong device file PIC16F876.h V d: setup_adc_ports(ALL_ANALOG) : dng tt c cc pins nhn tn hiu analog. setup_adc_ports(RA0_RA1_RA3_ANALOG) : dng pin A0, A1 v A3 nhn tn hiu analog. in p ngun cp cho IC c dng lm in p chun. setup_adc_ports(A0_RA1_ANALOGRA3_REF) : dng pin A0 v A1 nhn tn hiu analog. in p cp vo pin A3 c dng lm in p chun. c. SETUP_ADC_CHANNEL(): Hm ny c dng xc nh pin c gi tr Analog bng lnh READ_ADC() + C php:: setup_adc_channel(chan) + Tham s: chn : 0~7 chn pin ly tn hiu Analog bao gm 1 : pin A0 2 : pin A1 3 : pin A2 4 : pin A5 5 : pin E0 6 : pin E1 7 : pin E2 + Tr tr v: khng + Yu cu: khng d. READ_ADC(): Hm ny c dng c gi tr Digital t b bin i A/D. Cc hm setup_adc(), setup_adc_ports() v set_adc_channel() phi c dng trc khi dng hm read_adc(). i vi PIC16F877, b A/D mc nh l 8 bit. s dng A/D 10 bit ta phi dng thm lnh #device PIC16F877 *=16 ADC=10 ngay t u chng trnh. + C php: value = read_adc() + Tham s: khng + Tr tr v: 8 hoc 10 bit value = 0~255 nu dng A/D 8 bit (int) value = 0~1023 nu dng A/D 10 bit (long int) + Yu cu: khng Trang 93

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler e. SETUP_VREF(): Hm ny c dng thit lp in p chun bn trong MCU cho b analog compare hoc cho ng ra chn A2 + C php: setup_vref(mode/value) + Tham s: mode gm mt trong cc hng s sau FALSE (off) VREF_LOW for VDD*VALUE/24 VREF_HIGH for VDD*VALUE/32 + VDD/4 any may be or'ed with VREF_A2. value is an int 0-15. + Tr tr v: khng + Yu cu: cc hng s phi c nh ngha trong device file PIC16F87x .h 13.Nhm Hm Qun L Truyn Thng RS-232: a. GETC(), GETCH(), GETCHAR(): Hm ny c dng i nhn 1 k t t pin RS232 RCV. Nu khng mun i k t gi v, dng lnh kbhit(). + C php:: ch = getc() ch = getch() ch = getchar() + Tham s: khng + Tr tr v: k t 8 bit + Yu cu: #use rs232 V d: #include <16f877.h> #use delay(clock=20000000) #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7) char answer; void main() { printf("Continue (Y,N)?"); do { answer=getch(); } while(answer!='Y' && answer!='N'); } b. GETS(): Hm ny c dng c cc k t (dng GETC()) trong chui cho n khi gp lnh RETURN (gi tr 13). + C php:: gets(char *string) + Tham s: string l con tr (pointer) ch n dy k t + Tr tr v: khng + Yu cu: #use rs232 V d: #include <16f877.h> #include <string.h> #use delay(clock=20000000) #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7) char string[30]; void main() { printf("Input string: "); Trang 94

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler gets(string); printf("\n\r"); printf(string); } c. PUTC(), PUTCHAR(): Hm ny c dng gi mt k t thng qua pin RS232 XMIT. Phi dng #USE RS232 trc khi thc hin lnh ny xc nh tc (baud rate) v pin truyn. + C php: putc(cdata) putchar(cdata) + Tham s: cdata l k t 8 bit + Tr tr v: khng + Yu cu: #use rs232 V d: #include <16f877.h> #use delay(clock=20000000) #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7) int i; char string[10]; void main() { strcpy(string,"Hello !"); for(i=0; i<10; i++) putc(string[i]); }

//copy Hello ! to string //put each charater of string onto screen

d. PUTS(): Hm ny c dng gi mi k t trong chui n pin RS232 dng PUTC(). Sau khi chui c gi i th RETURN (13) v LINE-FEED (10) uc gi i. Lnh printf() thng dng hn lnh puts(). + C php: puts(string) + Tham s: string l chui hng (constant string) hay dy k t (character array) + Tr tr v: khng + Yu cu: #use rs232 V d: Dng PUTS() #include <16f877.h> #use delay(clock=20000000) #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7) void main() { puts(" ------------- "); puts(" | Hello | "); puts(" ------------- "); } Dng PRINTF() #include <16f877.h> #use delay(clock=20000000) #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7) void main() { printf(" ------------- \n\r"); printf(" | Hello | \n\r"); Trang 95

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler printf(" ---------------"); } e. KBHIT(): Hm ny c dng bo nhn c bit start. + C php:: value = kbhit() + Tham s: khng + Tr tr v: 0 (hay FALSE) nu getc() cn phi i nhn 1 k t t bn phm 1 (hay TRUE) nu c 1 k t sn sng nhn bng getc(). + Yu cu: #use rs232 f. PRINTF(): Hm ny c dng xut mt chui theo chun RS232 hoc theo mt hm xc nh. D liu c nh dng ph hp vi i s ca chui. Cc nh dng d liu nh sau: C Kiu k t S Chui hoc k t U S nguyn khng du x Hex int (xut ch thng) X Hex int (xut ch hoa) D s nguyn c du e S thc nh dng kiu s m f Kiu du chm ng Lx Hex long int (ch thng) LX Hex long int (ch hoa) Iu s thp phn khng du Id S thp phn c du. % Du % + C php: printf(string) printf(cstring, values...) printf(fname, cstring, values...) + Tham s: String l mt chui hng Hoc mt mng k t khng xc nh. Values l danh sch cc bin phn cch nhau bi du , , fname is l tn hm dng xut d liu (mc nhin l putc()). + Tr tr v: khng + Yu cu: #use rs232 g. SET_UART_SPEED(): Hm ny c dng t tc truyn d liu thng qua cng RS232. + C php:: set_uart_speed(baud) + Tham s: baud l hng s tc truyn (bit/giy) t 100 n 115200. + Tr tr v: khng + Yu cu: #use rs232 V d: // Set baud rate based on setting of pins B0 and B1 switch(input_b() & 3) { case 0 : set_uart_speed(2400); break; case 1 : set_uart_speed(4800); break; case 2 : set_uart_speed(9600); break; case 3 : set_uart_speed(19200); break; } V d s dng ng truyn RS232 ly d liu t ADC S mch dng PIC16F877 v chng trnh v d nh sau Trang 96

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler


5V 10K + 470uF-25V 0.1uF 10K 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Reset Button 1 2 U1 MCLR RA0 RA1 RA2 RA3 RA4 RA5 RE0 RE1 RE2 VDD GND OSC1 OSC2 RC0 RC1 RC2 RC3 RD0 RD1 RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 VDD GND RD7 RD6 RD5 RD4 RC7 RC6 RC5 RC4 RD3 RD2 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21

0.1uF 3

Analog Input

J1 4 3 2 1 to RS232

Osillator 20MHz

SCO-060

OUT

PIC16F877

//file name: using_rs232.c //using RS232 to get value from A/D converter //pins connections // A0: Analog input (from 10K variable resistor) #include <16f877.h> #device PIC16F877 *=16 ADC=10 //using 10 bit A/D converter #use delay(clock=20000000) //we're using a 20 MHz crystal #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7) int16 value; void AD_Init() //initialize A/D converter { setup_adc_ports(RA0_RA1_RA3_ANALOG); //set analog input ports: A0,A1,A3 setup_adc(ADC_CLOCK_INTERNAL); //using internal clock set_adc_channel(0); //input Analog at pin A0 delay_us(10); //sample hold time } void main() { AD_Init(); //initialize A/D converter while(1) { output_high(PIN_C0); //motor direction output_high(PIN_C3); //brake value=read_adc(); //for changing motor speed printf("A/D value %lu\r", value); } } 14. Nhm Hm Qun L Truyn Thng I2C: a. #USE I2C(): Th vin I2C gm cc hm dng cho I2C bus. #USE I2C dng vi cc lnh I2C_START, I2C_STOP, I2C_READ, I2C_WRITE and I2C_POLL. Cc hm phn mm c to ra tr khi dng lnh FORCE_HW. + C php: #use i2c(mode,SDA=pin,SCL=pin[options]) + Tham s: mode: master/slave - t master/slave mode Trang 97

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler SCL=pin ch nh pin SCL (pin l bit address) SDA=pin ch nh pin SDA options nh sau ADDRESS=nn : ch nh a ch slave mode FAST : s dng fast I2C specification SLOW : s dng slow I2C specification RESTART_WDT : khi ng li WDT trong khi ch c I2C_READ FORCE_HW : s dng chc nng I2C phn cng (hardware I2C functions) b. I2C_START(): Hm ny c dng Khi ng start bit (bit khi ng) I2C master mode. Sau khi khi ng start bit, xung clock mc thp ch n khi lnh I2C_WRITE() c thc hin. Ch I2C protocol ph thuc vo thit b slave. + C php:: i2c_start() + Tham s: khng + Tr tr v: khng + Yu cu: #use i2c V d: i2c_start(); i2c_write(0xa0); //Device address i2c_write(address); //Data to device i2c_start(); //Restart i2c_write(0xa1); //to change data direction data=i2c_read(0); //Now read from slave i2c_stop(); c. I2C_STOP(): Hm ny c s dng tt s dng I2C master mode. + C php: i2c_stop() + Tham s: khng + Tr tr v: khng + Yu cu: #use i2c V d: i2c_start(); //Start condition i2c_write(0xa0); //Device address i2c_write(5); //Device command i2c_write(12); //Device data i2c_stop(); //Stop condition d. I2C_POLL(): Hm ny c dng hi vng I2C, hm ny ch c dng khi SSP c dng. Hm ny tr v gi tr TRUE nu nhn c gi tr b m. Khi hm ny ln TRUE, nu dng hm I2C_READ th ta c gi tr c v. + C php: i2c_poll() + Tham s: khng + Tr tr v: 1 (TRUE) hay 0 (FALL) + Yu cu: #use i2c V d: i2c_start(); //Start condition i2c_write(0xc1); //Device address/Read count=0; while(count!=4) { while(!i2c_poll()) ; buffer[count++]= i2c_read(); //Read Next Trang 98

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler } i2c_stop(); // Stop condition e. I2C_READ(), I2CREAD(ACK): Hm ny c dng c mt byte qua cng I2C thit b master: lnh ny to xung clock v thet b claver, lnh ny ch c xung clock. There is no timeout for the slave, use I2C_POLL to prevent a lockup. Use RESTART_WDT in the #USE I2C to strobe the watch-dog timer in the slave mode while waiting. C php: i2c_stop() i2c_stop(ack) Tham s: ty chn, mc nh l 1 ack = 0: khng kim tra trng thi thu gi tn hiu (ack: acknowlegde) ack = 1: kim tra trng thi thu gi tn hiu Tr tr v: 8 bit int Yu cu: #use i2c V d: i2c_start(); i2c_write(0xa1); data1 = i2c_read(); data2 = i2c_read(); i2c_stop(); f. I2C_WRITE(): Hm ny c dng Gi tng byte thng qua giao din I2C. ch ch s pht ra xung Clock vi d liu v ch Slave s ch xung Clock t con ch truyn v. Khng t ng m ngoi l iu kin ca lnh ny. Lnh ny s tr v bit ACK. Pht LSB trc khi truyn khi xc nh hng truyn ca d liu truyn (0 cho master sang slave). Ch chun giao tip I2C ph thuc vo thit b slave. + C php: i2c_write(data) + Tham s: data: 8 bit int + Tr tr v: Lnh ny tr v bit ACK ack = 0: khng kim tra trng thi thu gi tn hiu (ack: acknowlegde) ack = 1: kim tra trng thi thu gi tn hiu + Yu cu: #use i2c V d: long cmd; ... i2c_start(); //Start condition i2c_write(0xa0); //Device address i2c_write(cmd); //Low byte of command i2c_write(cmd>>8); //High byte of command i2c_stop(); //Stop condition 15. Nhm Hm Qun L Vo / Ra (SPI): a. SETUP_SPI(): Hm ny c dng khi gn gi tr ban u cho cc port giao tip vi phng thc ni tip (Serial Port Interface (SPI)). + C php: setup_spi (mode) + Tham s: modes c th l: SPI_MASTER, SPI_SLAVE, SPI_SS_DISABLED SPI_L_TO_H, SPI_H_TO_L SPI_CLK_DIV_4, SPI_CLK_DIV_16, SPI_CLK_DIV_64, SPI_CLK_T2 Trang 99

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler Constants from each group may be or'ed together with |. + Tr tr v: Khng + Yu cu: Constants phi c khai bo trong tp tin tiu devices .h V d: setup_spi(spi_master |spi_l_to_h | spi_clk_div_16 ); b. SPI_READ(): Hm ny c dng Tr v gi tr c c bi SPI. Nu gi tr ph hp vi lnh SPI_READ th d liu pht xung clock ngoi v d liu nhn li khi tr v. Nu khng c d liu lc n c, SPI_READ s i d liu. Tr v gi tr c c bi SPI. Nu gi tr c truyn ti SPI_READ, th d liu s m xung ngoi, v sau d liu s c tr li khi kt thc. Nu cha c d liu ( tn hiu ) th SPI_read s ch d liu( tn hiu ). Nu c xung ri th thc hin SPI_WRITE( data ) tip theo SPI_READ() hoc thc hin SPI_READ( data ). C hai hnh ng u ging nhau v s to ra xung m. Nu khng c d liu pht i th ch cn thc hin SPI_READ(0) to xung. Nu c thit b khc cung cp xung th khi gi SPI_READ() phi i xung v d liu hoc s dng SPI_DATA_IS_IN() xc nh nu d liu sng sng. + C php: value = spi_read (data) + Tham s:: value = spi_read (data) + Tham s: d liu tu chn v l s nguyn 8 bit. + Tr tr v: l s nguyn 8 bit. + Li ch: Lnh ny ch s dng vi thit b c phn SPI Yu cu: Khng V d : in_data = spi_read(out_data); c. SPI_WRITE(): Hm ny c dng gi mt byte (8 bit) n SPI . Hm ny s ghi gi tr ln SPI. + C php: SPI_WRITE (value) + Tham s: value l s nguyn 8 bit + Tr tr v: khng + Yu cu : khng. V d: spi_write( data_out ); data_in = spi_read(); d. SPI_DATA_IS_IN(): Hm ny c dng tr v TRUE nu d liu c SPI nhn. + C php: result = spi_data_is_in() + Tham s: khng + Tr tr v: 0 (FALSE) or 1 (TRUE) + Yu cu : khng V d: while( !spi_data_is_in() && input(PIN_B2) ) ; if( spi_data_is_in() ) data = spi_read(); 16. Nhm Hm Qun L Xut Nhp Song Song: a. SETUP_PSP(): Hm ny c dng khi gn port giao tip song song(Parallel Slave Port (PSP)). Hm SET_TRIS_E(value) c th c s dng set d liu trc tip. D liu c th c hoc ghi bng vic s dng bin PSP_DATA. Trang 100

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler + C php: setup_psp (mode) + Tham s: mode c th l: PSP_ENABLED PSP_DISABLED + Tr tr v: khng + Yu cu: cc hng phi c nh ngha trong cc tp tin tiu devices .h. V d: setup_psp(PSP_ENABLED); b. PSP_OUTPUT_FULL(), PSP_INPUT_FULL(), PSP_OVERFLOW(): Hm ny c dng nhng hm ny kim tra cng song song Slave (Parallel Slave Port (PSP)) xc nh iu kin v tr v TRUE or FALSE. + C php: result = psp_output_full() result = psp_input_full() result = psp_overflow() + Tham s: khng + Tr tr v: 0 (FALSE) or 1 (TRUE) Yu cu: khng V d: while (psp_output_full()) ; psp_data = command; while(!psp_input_full()) ; if ( psp_overflow() ) error = TRUE; else data = psp_data; 17. Nhm Cc Hm iu Khin MCU: a. SLEEP(): Hm ny c dng duy tr trng thi ng ca chp cho n khi nhn c tc ng t bn ngoi + C php : sleep() + Tham s : khng + Tr tr v : khng + Yu cu : khng V d: SLEEP(); b. RESET_CPU(): Hm ny c dng reset MCU + C php: reset_cpu() + Tham s: khng + Tr tr v: khng + Yu cu : khng V d: if(checksum!=0) reset_cpu(); c. RESTART_CAUSE(): Hm ny c dng tr v nguyn nhn reset MCU ln cui cng. + C php: value = restart_cause() + Tham s: khng Trang 101

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler + Tr tr v: gi tr ch ra nguyn nhn gy reset cui cng trong b vi x l. Gi tr ny tu thuc vo mi loi chip c th. C th tham kho trn file device .h bit c cc gi tr t bit ny. V d: WDT_FROM_SLEEP WDT_TIMEOUT, MCLR_FROM_SLEEP and NORMAL_POWER_UP. + Yu cu: hng phi c khai bo trong cc tp tin tiu devices .h Examples: switch ( restart_cause() ) { case WDT_FROM_SLEEP: case WDT_TIMEOUT: handle_error(); } d. READ_BANK(): Hm ny c dng c mt byte d liu t vng RAM . + C php: value = read_bank (bank, offset) + Tham s: bank l RAM trong IC tu thuc vo loi IC (i vi 16f877 c 3 bank), offset l bc nhy khi thc thi (bt u l 0) + Tr tr v: s nguy 8 bit + Yu cu khng V d: // See write_bank example to see // how we got the data // Moves data from buffer to LCD i=0; do { c =read_bank(1,i++); if(c!=0x13) lcd_putc(c); } while (c!=0x13); e. WRITE_BANK(): Hm ny c dng ghi mt byte ln RAM + C php: : write_bank (bank, offset, value) + Tham s: tng t vi read_bank, value l d liu 8 bit + Tr tr v: khng + Yu cu : khng V d: i=0; // Uses bank 1 as a RS232 buffer do { c=getc(); write_bank(1,i++,c); } while (c!=0x13); 18. Nhm Hm Qun L CCP: Nhm ny bao gm cc hm: Trang 102

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler setup_ccpX() set_pwmX_duty() Capture Mode: Khi cc chn RC1/CCP2 v RC2/CCP1 xy ra cc s kin sau: Every falling edge : Nhn xung cnh xung Every rising edge : Nhn xung cnh ln Every 4th rising edge : Nhn xung cnh ln sau 4 xung Every 16th rising edge : Nhn xung cnh ln sau 16 xung. Th cc gi tr CCP1,CCP2 tng ng s mang gi tr ca TIMER1 ti thi im . Compare Mode: Khi gi tr m ca TIMER1 bng vi gi tr CCP1/CCP2 th xy ra cc s kin: Ng ra RC1/RC2 mc cao Ng ra RC1/RC2 mc thp Xy ra ngt Reset li Timer1. PWM Mode (Pulse Width Modulation): ch pht xung
PWM1

PWM2

a. SETUP_PWM1_DUTY(),SETUP_PWM1_DUTY(): Hm ny c dng xc nh % thi gian trong 1 chu k, PWM mc cao + C php: set_pwm1_duty(value) set_pwm2_duty(value) + Tham s: value c th l bin hay hng s vi 8 hay 16 bit + Tr tr v: khng + Yu cu: khng V d: set_pwm1_duty(512): t 50% mc cao (50% duty) b. SETUP_CCP1(),SETUP_CCP2(): Hm ny c dng Khi ng CCP. B m CCP c th c thc hin thng qua vec s dng CCP_1 v CCP_2. CCP hot ng 3 mode. capture mode, CCP copy gi tr m timer 1 vo CCP_x khi cng vo nhn xung. compare mode, CCP thc hin 1 tc v ch nh trc khi timer 1 v CCP_x bng nhau. ch PWM, CCP to mt xung vung. + C php: setup_ccp1(mode) setup_ccp2(mode) + Tham s: mode l hng s nh sau long CCP_1; #byte CCP_1 = 0x15 #byte CCP_1_LOW= 0x15 #byte CCP_1_HIGH= 0x16 long CCP_2; #byte CCP_2 = 0x1B #byte CCP_2_LOW= 0x1B #byte CCP_2_HIGH= 0x1C // Tt CCP CCP_OFF; // t CCP ch capture Trang 103

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler CCP_CAPTURE_FE; // Nhn cnh xung ca xung CCP_CAPTURE_RE; // Nhn cnh ln ca xung CCP_CAPTURE_DIV_4; // Nhn xung sau mi 4 xung vo CCP_CAPTURE_DIV_16; // Nhn xung sau mi 16 xung vo // t CCP ch compare CCP_COMPARE_SET_ON_MATC; // Output high on compare CP_COMPARE_CLR_ON_MATCH; //Output low on compare CP_COMPARE_INT; // Interrupt on compare CCP_COMPARE_RESET_TIMER // Reset timer on compare // t CCP ch PWM CCP_PWM // M PWM CCP_PWM_PLUS_1 CCP_PWM_PLUS_2 CCP_PWM_PLUS_3 + Tr tr v: khng + Yu cu: cc hng s phi c nh ngha trong device file PIC16F87x.h V d s dng PWM: S mch iu khin ng c DC s dng PIC16F877 v chng trnh v d nh sau
5V 10K + 470uF-25V 0.1uF 10K 1 2 0.1uF 3 Reset Button 1 2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 U1 MCLR RA0 RA1 RA2 RA3 RA4 RA5 RE0 RE1 RE2 VDD GND OSC1 OSC2 RC0 RC1 RC2 RC3 RD0 RD1 RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 VDD GND RD7 RD6 RD5 RD4 RC7 RC6 RC5 RC4 RD3 RD2 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21

Analog Input

J1 4 3 2 1 to RS232

8 Osillator 20MHz OU T SCO-060

PIC16F877

2 Dir Brake PWM Motor DC motor driver 1

//file name: using_PWM.c //using PWM to control DC motor, motor speed is controlled using Analog input at A0 //pins connections //A0: Analog input (from 10K variable resistor) //C0: motor direction C3: motor brake C2: PWM #include <16f877.h> #device PIC16F877 *=16 ADC=10 //using 10 bit A/D converter #use delay(clock=20000000) //we're using a 20 MHz crystal int16 value; void AD_Init() //initialize A/D converter { setup_adc_ports(RA0_RA1_RA3_ANALOG); //set analog input ports: A0,A1,A3 Trang 104

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler setup_adc(ADC_CLOCK_INTERNAL); //using internal clock set_adc_channel(0); //input Analog at pin A0 delay_us(10); //sample hold time } void main() { AD_Init(); //initialize A/D converter SETUP_CCP1(CCP_PWM); //set CCP1(RC2) to PWM mode SETUP_TIMER_2(T2_DIV_BY_1,255,1); //set the PWM frequency to [(20MHz/4)/1]/255=16.9KHz while(1) { output_high(PIN_C0); //motor direction output_high(PIN_C3); //brake value=read_adc(); //for changing motor speed set_PWM1_duty(value); //output PWM to motor driver } } 19. Nhm Hm Qun L Ngt: a. EXT_INT_EDGE(): Hm ny c dng qui nh thi im ngt tc ng: cnh ln hay xung. + C php:: ext_int_edge(source,edge) + Tham s: source: gi tr mc nh l 0 cho PIC16F877 edge: H_TO_L cnh xung 5V 0V L_TO_H cnh ln 0V 5V + Tr tr v: khng + Yu cu: cc hng s phi c nh ngha trong device file PIC16F87x.h b. #INT_xxx: Khai bo khi to hm ngt. Hm ngt c th khng c bt k tham s no. Trnh bin dch to code nhy n hm ngt khi lnh ngt thc hin. Trnh bin dch cng to nn code lu tr trng thi ca CPU v xa c ngt. Dng lnh NOCLEAR sau #INT_xxx khng xa c ngt ny. Trong chng trnh , phi dng lnh ENABLE_INTERRUPTS(INT_xxxx) cng vi lnh ENABLE_INTERRUPTS(GLOBAL) khi to ngt. + C php: #INT_AD Kt thc bin i A/D #INT_BUSCOL Xung t bus #INT_CCP1 Capture or Compare on unit 1 #INT_CCP2 Capture or Compare on unit 2 #INT_EEPROM Kt thc vit vo EEPROM #INT_EXT Ngt ngoi #INT_LOWVOLT Low voltage detected #INT_PSP Parallel Slave Port data in #INT_RB Port B any change on B4-B7 #INT_RDA RS232 receive data available #INT_RTCC Timer 0 (RTCC) overflow #INT_SSP SPI or I2C activity #INT_TBE RS232 transmit buffer empty #INT_TIMER1 Timer 1 overflow #INT_TIMER2 Timer 2 overflow c. DISABLE_INTERRUPTS(): Trang 105

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler Hm ny c dng Tt ngt ti mc quy nh bi level. Mc ton cc (GLOBAL level) khng tt bt k cc ngt trong chng trnh nhng ngn cn bt k ngt no trong chng trnh, c khi to trc . Cc mc ngt hp l ging nh c dng trong #int_xxx. GLOBAL level khng tt cc ngt gioao din (peripheral interrupt). Ch khng cn thit tt ngt bn trong mt ngt khc v cc ngt ny c t ng tt. + C php:: disable_interrupts(level) + Tham s: mt trong cc hng s sau GLOBAL INT_RTCC INT_RB INT_EXT INT_AD INT_TBE INT_RDA INT_TIMER1 INT_TIMER2 INT_CCP1 INT_CCP2 INT_SSP INT_PSP INT_BUSCOL INT_LOWVOLT INT_EEPROM + Tr tr v: khng + Yu cu: phi dng vi #int_xxx d. ENABLE_INTERRUPTS(): Hm ny c dng Khi to ngt ti mc quy nh bi level. Mt th tc ngt (interrupt procedure) cn c nh ngha. Mc ton cc (GLOBAL level) khng khi to bt k ngt ch nh no m ch khi to cc bin ngt c khi to trc . + C php:: enable_interrupts(level) + Tham s: level - mt trong cc hng s sau GLOBAL INT_RTCC INT_RB INT_EXT INT_AD INT_TBE INT_RDA INT_TIMER1 INT_TIMER2 INT_CCP1 INT_CCP2 INT_SSP INT_PSP INT_BUSCOL INT_LOWVOLT INT_EEPROM + Tr tr v: khng + Yu cu: phi dng vi #int_xxx Trang 106

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler e. Mt s v d s dng ngt: V d 1: vi d s dng enable_interrupts. S mch dng PIC16F877 v chng trnh v d nh sau
5V 10K 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 U1 MCLR RA0 RA1 RA2 RA3 RA4 RA5 RE0 RE1 RE2 VDD GND OSC1 OSC2 RC0 RC1 RC2 RC3 RD0 RD1 RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 VDD GND RD7 RD6 RD5 RD4 RC7 RC6 RC5 RC4 RD3 RD2 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 1 1 1 1 Buttons 2 2 2 2

2 Reset Button

LED

R 330

J1 4 3 2 1 to RS232

Osillator 20MHz

SCO-060

OUT

PIC16F877

//file name: using_interrupt_rb.c //using enable_interrupt(int_rb) //pins connections // B4-7: buttons // D4-7: LEDs #include <16F877.h> #device PIC16F877 *=16 ADC=10 #use delay(clock=20000000) #byte portb = 0x06 #byte portd = 0x08 #INT_RB rb_isr() { portd=portb; } void main() { set_tris_b(0xF0); set_tris_d(0x00); enable_interrupts(INT_RB); enable_interrupts(GLOBAL); while(1) { } } V d 2: V d s dng ngt ADC. S mch bin i A/D s dng PIC16F877 v chng trnh v d nh sau

Trang 107

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler


5V 10K 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Reset Button 1 2 U1 MCLR RA0 RA1 RA2 RA3 RA4 RA5 RE0 RE1 RE2 VDD GND OSC1 OSC2 RC0 RC1 RC2 RC3 RD0 RD1 RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 VDD GND RD7 RD6 RD5 RD4 RC7 RC6 RC5 RC4 RD3 RD2 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 Digital Output LED R 330

470uF-25V

0.1uF

10K 1

0.1uF 3

Analog Input

J1 4 3 2 1 to RS232

Osillator 20MHz

SCO-060

OUT

PIC16F877

//file name: using_adc.c //using A/D converter //pin conections // A0: Analog input // port B: Digital output (LED) #include <16f877.h> #use delay(clock=20000000) //use a 20 MHz crystal #byte portb=0x06 #INT_AD void int_ad() { //Lm chng trnh no } void main() { set_tris_b(0x00); //set register for I/O port B setup_adc_ports(RA0_RA1_RA3_ANALOG); setup_adc(ADC_CLOCK_INTERNAL); set_adc_channel(0); //analog input to pin A0 while(1) { delay_us(10); //sample hold time portb=read_adc(); //output portb digital value } } V d 3: S dng ngt timer 1 Chng trnh v d nh sau //file name: using_interrupt_ext.c //using external interrupts to get motor speed with encoder //pins connections // B0: from encoder #include <16F877.h> #use delay(clock=20000000) #include <4bit_7seg_display.c> int16 count; Trang 108

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler float speed; #INT_TIMER1 void Sampling_Time() { speed=(float)count*3; //rpm Encoder Resolution: 2000 count=0; set_timer1(59286); //10ms Prescaler:8 } #INT_EXT void HS_Input() { count++; } main() { count=0; setup_timer_1(T1_INTERNAL|T1_DIV_BY_8); ext_int_edge(L_TO_H); enable_interrupts(INT_TIMER1); enable_interrupts(INT_EXT); enable_interrupts(GLOBAL); set_timer1(59286); while(1) { BIN2BCD((int16)speed,0); } } V d 4: S dng ngt timer1 v ngt ngoi. S mch dng PIC16F877 v chng trnh v d nh sau
VCC PIC16F877 1 2 3 4 5 6 7 8 9 10 11 12 15 16 17 18 23 24 25 26 MCLR RB7 RA0 RB6 RA1 RB5 RA2 RB4 RA3 RB3 RA4 RB2 RA5 RB1 RE0 RB0 RE1 VDD RE2 GND VDD RD7 GND RD6 RC0 RD5 RC1 RD4 RC2 RD3 RC3 RD2 RC4 RD1 RC5 RD0 RC6 OSC1 RC7 OSC2 14 U2 40 39 38 37 36 35 34 33 32 31 30 29 28 27 22 21 20 19 13

XUNG B

XUNG A

ENCODER

XUNG A XUNG B

C1 Y2 ZTA C2

//Chng trnh dng hin th s vng quay ca Encoder, khi quay thun s vng quay tng, khi quay nghch s vng quay gim.

//This program is ued for display the number of pulses of encoder Trang 109

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler //When encoder rotates forward, the number will increase, otherwise decrease // pusle A is connectted to pin C0; // pulse B is connectted to pin B0 #include <16f877.h> #device PIC16F877 *=16 ADC=10 //khai bao ADC=10 de doc ve duoc so 10 bit #include <4bit_7seg_display_new.c> //the function BIN2BCD(int32 Num, char DecimalPoint) //is used to display LED 7 seg #use delay(clock=20000000) BOOLEAN forward=TRUE; int16 count; //external interrupt #INT_EXT void ext_isr() { if (input(PIN_C0)) forward=TRUE; else forward=FALSE; } //Timer1 interrupt #INT_TIMER1 void timer1_isr() { count++; } void main() { int16 temp1,countbackward,temp; temp=0; set_tris_b(0x01); ext_int_edge(0,L_TO_H); setup_timer_1(T1_EXTERNAL); enable_interrupts(INT_EXT); enable_interrupts(INT_TIMER1); enable_interrupts(GLOBAL); while (TRUE) { set_timer1(temp); while (forward) { temp=get_timer1(); BIN2BCD(temp,0); } set_timer1(0); while (!forward) { countbackward=get_timer1(); temp1=temp-countbackward; BIN2BCD(temp1,0); } Trang 110

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler temp=temp1; } } V d 5: S dng ngt CCP. S mch dng PIC16F877 v chng trnh v d nh sau:
VCC PIC16F877 1 2 3 4 5 6 7 8 9 10 11 12 15 16 17 18 23 24 25 26 MCLR RB7 RA0 RB6 RA1 RB5 RA2 RB4 RA3 RB3 RA4 RB2 RA5 RB1 RB0 RE0 RE1 VDD RE2 GND VDD RD7 GND RD6 RC0 RD5 RC1 RD4 RC2 RD3 RC3 RD2 RC4 RD1 RC5 RD0 RC6 OSC1 RC7 OSC2 14 U2 40 39 38 37 36 35 34 33 32 31 30 29 28 27 22 21 20 19 13 C1 Y2 ZTA C2

CCP1 CCP2

BO PHAT XUNG

//Chng trnh dng o rng ca xung. #include <16f877.h> #include <stdlib.h> #include <math.h> #include <4bit_7seg_display.c> #use delay(clock = 20000000) #use rs232(baud=9600,parity=N,xmit=PIN_C6, rcv=PIN_C7) // Connect a pulse generator to pin 3 (C2) and pin 2 (C1) int32 rise,fall,pulse_width; int32 count; int32 tam; #INT_CCP1 void ccp1_isr() { rise = CCP_1; count=0; } #INT_CCP2 void ccp2_isr() { fall = CCP_2; if (count==0) { pulse_width = fall - rise; tam=(2*pulse_width/10);//change into milisecond } Trang 111

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler else tam=((13107*count)+(fall*2/10)-(rise*2/10))/1; printf("%lu",tam); BIN2BCD(tam/10000,0); } #INT_TIMER1 void timer1_isr() { count++; } void main() { int16 tam; setup_ccp1(CCP_CAPTURE_RE); // Configure CCP1 to capture rise setup_ccp2(CCP_CAPTURE_FE); // Configure CCP2 to capture fall setup_timer_1(T1_INTERNAL);//|T1_DIV_BY_8); // Start timer 1 enable_interrupts(INT_CCP1); // Setup interrupt on rising edge enable_interrupts(INT_CCP2); // Setup interrupt on falling edge enable_interrupts(INT_TIMER1); // Setup interrupt Timer1 enable_interrupts(GLOBAL); BIN2BCD(0,0); while(TRUE) { } } V d 6: S dng ngt SPI. S mch dng PIC16F877 v chng trnh v d nh sau

Trang 112

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler


VCC 1 2 3 4 5 6 7 8 9 10 11 12 15 16 17 18 23 24 25 26

MASTER
PIC16F877 MCLR RB7 RA0 RB6 RA1 RB5 RA2 RB4 RB3 RA3 RA4 RB2 RA5 RB1 RE0 RB0 RE1 VDD RE2 GND VDD RD7 GND RD6 RC0 RD5 RC1 RD4 RC2 RD3 RC3 RD2 RC4 RD1 RC5 RD0 RC6 OSC1 RC7 14 U2 OSC2 40 39 38 37 36 35 34 33 32 31 30 29 28 27 22 21 20 19 13 Y2 ZTA

SS+D7

C1

C2

VCC 1 2 3 4 5 6 7 8 9 10 11 12 15 16 17 18 23 24 25 26

SLAVE
PIC16F877 MCLR RB7 RA0 RB6 RA1 RB5 RA2 RB4 RB3 RA3 RA4 RB2 RA5 RB1 RE0 RB0 RE1 VDD RE2 GND VDD RD7 GND RD6 RC0 RD5 RC1 RD4 RC2 RD3 RC3 RD2 RC4 RD1 RC5 RD0 RC6 OSC1 RC7 14 U1 OSC2 40 39 38 37 36 35 34 33 32 31 30 29 28 27 22 21 20 19 13

SS+D7

C1

Y1 ZTA

C2

CHNG TRNH MASTER: // I2C Communications // Master Controller #include <16F877.h> #device PIC16F877 *=16 ADC=10 #include <math.h> #include <stdlib.h> #include <4bit_7seg_display.c> #fuses hs, nowdt, noprotect, put, nolvp, brownout #use delay(clock=20000000) //20mhz #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7) void WriteTo(int16 Num) { int16 tmp; tmp=Num; spi_write(tmp); // Low byte of command delay_us(100); spi_write(tmp>>8);// High byte of command } void main() Trang 113

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler { int32 data_out=0; int32 data_in=0; while(true) { setup_spi(spi_master |spi_l_to_h |spi_clk_div_16 ); WriteTo(data_out); BIN2BCD(data_out,0); data_out++; delay_ms(200); if (data_out==9999) data_out=0; } } CHNG TRNH SLAVE: // Slave Controller: Address: 0xa0 #include <16F877.h> #device PIC16F877 *=16 ADC=10 #include <stdlib.h> #include <4bit_7seg_display.c> #include <math.h> #fuses hs, nowdt, noprotect, put, nolvp, brownout #use delay(clock=20000000) int16 data_in=0; int data_in_high,data_in_low; int1 ok=0; #INT_SSP void isr_ssp() { if (!ok) { data_in_low = spi_read(); ok=1; } else { data_in_high=spi_read(); data_in=make16(data_in_high,data_in_low); ok=0; BIN2BCD(data_in,0); } } void main() { setup_spi(spi_slave |spi_l_to_h |spi_clk_div_16 ); enable_interrupts(INT_SSP); enable_interrupts(GLOBAL); while(true) { Trang 114

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler } } V d 7: S dng ngt I2C S mch dng PIC16F877 v chng trnh v d nh sau
VCC 1 2 3 4 5 6 7 8 9 10 11 12 15 16 17 18 23 24 25 26

MASTER
PIC16F877 MCLR RB7 RA0 RB6 RA1 RB5 RA2 RB4 RA3 RB3 RA4 RB2 RA5 RB1 RE0 RB0 RE1 VDD RE2 GND VDD RD7 GND RD6 RC0 RD5 RC1 RD4 RC2 RD3 RC3 RD2 RC4 RD1 RC5 RD0 RC6 OSC1 RC7 14 U2 OSC2 40 39 38 37 36 35 34 33 32 31 30 29 28 27 22 21 20 19 13 Y2 ZTA

C1

C2

VCC 1 2 3 4 5 6 7 8 9 10 11 12 15 16 17 18 23 24 25 26

SLAVE
PIC16F877 MCLR RB7 RA0 RB6 RA1 RB5 RA2 RB4 RA3 RB3 RA4 RB2 RA5 RB1 RE0 RB0 RE1 VDD RE2 GND VDD RD7 GND RD6 RC0 RD5 RC1 RD4 RC2 RD3 RC3 RD2 RC4 RD1 RC5 RD0 RC6 OSC1 RC7 14 U1 OSC2 40 39 38 37 36 35 34 33 32 31 30 29 28 27 22 21 20 19 13 Y1 ZTA

C1

C2

CHNG TRNH MASTER: // I2C Communications // Master Controller #include <16F877.h> #device PIC16F877 *=16 ADC=10 #include <math.h> #include <stdlib.h> #include <4bit_7seg_display_new.c> #fuses hs,nowdt,noprotect,put,nolvp,brownout #use delay(clock=20000000) #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7) #use I2C(master, sda=PIN_C4, scl=PIN_C3,NOFORCE_SW) void WriteTo(int16 Num) Trang 115

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler { int16 tmp; tmp=Num; i2c_write(tmp); // Low byte of command delay_us(100); i2c_write(tmp>>8);// High byte of command } void main() { char s[10]; int16 tam; BIN2BCD(0,0); set_tris_c(0x80); i2c_start(); while(1) { gets(s); tam=atoi32(s); delay_ms(100); i2c_write(0xa0);//dia chi slave WriteTo(tam); delay_ms(100); BIN2BCD(tam,0); } i2c_stop(); } CHNG TRNH SLAVE: // Slave Controller: Address: 0xa0 // Slave receives 2 bytes #include <16F877.h> #device PIC16F877 *=16 ADC=10 #include <stdlib.h> #include <4bit_7seg_display_new.c> #fuses hs, nowdt, noprotect, put, nolvp, brownout #use delay(clock=20000000) #use I2C(slave,sda=PIN_C4,scl=PIN_C3,address=0xa0,NOFORCE_SW) int tam[3]; int i=0; #INT_SSP void ssp_isr() { if (i2c_poll()==TRUE) { tam[i++]=i2c_read(); if (i==3) i=0; } } void main() { Trang 116

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler int16 dem=0; tam[1]=0; tam[2]=0; enable_interrupts(GLOBAL); enable_interrupts(INT_SSP); BIN2BCD(0,0); while (1) { if (i==0) { dem=make16(tam[2],tam[1]); BIN2BCD(dem,0); delay_ms(10); } } }
Chng trnh giao tip vi keypad v my tnh c vit th vin ca phng.

V d 8: S dng ngt PSP S mch dng PIC16F877 v chng trnh v d nh sau


VCC 1 2 3 4 5 6 7 8 9 10 11 12 15 16 17 18 23 24 25 26

MASTER
PIC16F877 PSP_RD PSP_WR PSP_CS MCLR RB7 RA0 RB6 RA1 RB5 RA2 RB4 RA3 RB3 RA4 RB2 RA5 RB1 RE0 RB0 RE1 VDD RE2 GND VDD RD7 GND RD6 RC0 RD5 RC1 RD4 RC2 RD3 RC3 RD2 RC4 RD1 RC5 RD0 RC6 OSC1 RC7 OSC2 14 U2 40 39 38 37 36 35 34 33 32 31 30 29 28 27 22 21 20 19 13

PSP MASTER PSP MASTER PSP MASTER PSP MASTER PSP MASTER PSP MASTER PSP MASTER PSP MASTER C1 Y2 ZTA C2

VCC 1 2 3 4 5 6 7 8 9 10 11 12 15 16 17 18 23 24 25 26

SLAVE
PIC16F877 MCLR RB7 RA0 RB6 RA1 RB5 RA2 RB4 RA3 RB3 RA4 RB2 RA5 RB1 RB0 RE0 RE1 VDD RE2 GND VDD RD7 GND RD6 RC0 RD5 RC1 RD4 RC2 RD3 RC3 RD2 RC4 RD1 RC5 RD0 RC6 OSC1 RC7 OSC2 14 U1 40 39 38 37 36 35 34 33 32 31 30 29 28 27 22 21 20 19 13

PSP_RD PSP_WR PSP_CS

PSP MASTER PSP MASTER PSP MASTER PSP MASTER PSP MASTER PSP MASTER PSP MASTER PSP MASTER C1 Y1 C2 ZTA

Trang 117

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler CHNG TRNH MASTER: #include <16F877.h> #use delay(clock=20000000) #byte portb=0x06 #byte portd = 0x08 #define psp_rd pin_a0 #define psp_wr pin_a1 #define psp_cs pin_a2 void main () { set_tris_a(0x00); set_tris_b(0x00); portb = 0x00; output_high(psp_cs); output_high(psp_rd); output_high(psp_wr); while(TRUE) { portb++; output_low(psp_cs); delay_us(10); output_low(psp_wr); PSP_DATA=portb; delay_us(50); output_high(psp_wr); delay_us(20); output_high(psp_cs); delay_ms(700); } } CHNG TRNH SLAVE: #include <16F877.h> #device PIC16F877 *=16 ADC=10 #use delay(clock=20000000) #byte portb=0x06 #INT_PSP void psp_isr() { portb = PSP_DATA; delay_ms(100); } void main() { set_tris_b(0x00); //set_tris_d(0xff); portb=0x00; setup_psp(PSP_ENABLED); //enable_interrupts(global); //enable_interrupts(INT_PSP); Trang 118

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler while (TRUE) { while(!psp_input_full()); portb = PSP_DATA; delay_ms(100); } } V d: Dc bn phm hex c bn phm 12 phm nh s v xut gi tr ra led theo yu cu sau: + phm 0: tt c cc led sng. + phm 6: led chn RD2&RD1 sng. + phm 1: led chn RD0 sng. + phm 7: led chn RD2&RD1&RD0 sng. + phm 2: led chn RD1 sng. + phm 8: led chn RD3 sng. + phm 3: led chn RD1&RD0 sng. + phm 9: led chn RD3&RD0 sng. + phm 4: led chn RD2 sng. + phm *: Cc led chn RD0 ti RD3 sng. + phm 5: led chn RD2&RD0 sng. + phm #: Cc led chn RD4 ti RD7 sng.

Chng Trnh: #include "C:\Program Files\PICC\quetphim.h" #include <KBD.C> // Khai bo th vin c phn phm. #int_PSP PSP_isr() // Khai bo hm ngt cng vo ra song song. { Trang 119

Chng II: Lp Trnh Cho PIC Dng PIC C Compiler } void main() // Bt u chng trnh chnh. { char k; port_b_pullups(TRUE); kbd_init(); // Khoi tao gia tri ban dau cho ham doc ban phim enable_interrupts(INT_PSP); enable_interrupts(global); while(1) { k=kbd_getc(); // Goi ham doc ban phim, day la ham duoc dinh nghia trong file kbd.c switch(k) // Xut led port D. { case '0': set_tris_d(0xff); case '1': set_tris_d(0x01); case '2': set_tris_d(0x02); case '3': set_tris_d(0x03); case '4': set_tris_d(0x04); case '5': set_tris_d(0x05); case '6': set_tris_d(0x06); case '7': set_tris_d(0x07); case '8': set_tris_d(0x08); case '9': set_tris_d(0x09); case '*': set_tris_d(0x0f); case #: set_tris_d(0xf0); } } }

Trang 120

You might also like