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 File.hex
(Chng (Chng
trnh vit trnh di
cho PIC dng m Thit b
di dng Bin dch hex np lp trnh
C) cho PIC)

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
getc() fputc() perror()
putc() fputs() assert()
fgetc() printf() getchar()
gets() kbhit() putchar()
puts() fprintf() setup_uart()
fgets() set_uart_speed()

Cc hm phc v cng giao tip d liu ni tip ng b SPI


Trang 73
Chng II: Lp Trnh Cho PIC Dng PIC C Compiler
setup_spi() spi_write()
spi_read() spi_data_is_in()
Nhm cc hm ph v cng vo ra s
output_low() input() input_X()
output_high() output_X() port_b_pullups()
output_float() output_toggle() set_tris_X()
output_bit() input_state()
Cc hm ton hc chun ca C
abs() sinh() atan2()
acos() log() frexp()
asin() log10() ldexp()
atan() pow() modf()
ceil() sin() sqrt()
cos() cosh() tan()
exp() tanh() div()
floor() fabs() ldiv()
labs() fmod()
Hm phc v in p tham chiu cho
setup_vref()
Hm phc v chuyn i ADC
setup_adc_ports() set_adc_channel()
setup_adc() read_adc()
Cc hm phc v timer
setup_timer_X() get_timer_X() setup_wdt()
set_timer_X() setup_counters() restart_wdt()
Cc hm qun l b nh
memset() malloc() memmove()
memcpy() calloc() memcmp()
offsetof() free() memchr()
offsetofbit() realloc()
Cc hm phc v CCP
setup_ccpX() setup_power_pwm() set_power_pwmx_duty()
set_pwmX_duty() setup_power_pwm_pins() set_power_pwm_override()
Cc hm k t chun ca C
atoi() isxdigit() strtok()
atoi32() strlen() strspn()
atol() strcpy() strcspn()
atof() strncpy() strpbrk()
tolower() strcmp() strlwr()
toupper() stricmp() sprintf()
isalnum() strncmp() isprint()
isalpha() strcat() strtod()
isamoung() strstr() strtol()
isdigit() strchr() strtoul()
islower() strrchr() strncat()
isspace() isgraph() strcoll(), strxfrm()
isupper() 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
Chng II: Lp Trnh Cho PIC Dng PIC C Compiler
+ Tr tr v : s thc
+ Yu cu : #include <math.h>
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
+ Tr tr v : mt k t 8 bit
+ Yu cu : khng
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
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: Chn IC phi c nh ngha trong tp tin tiu devices .h
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
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 = [( 
/ 4) / timemode
OSC 
] / 255 N
oscillator fre. tick / rollover

1 or 4 or 16
instruction fre.

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 !"); //copy Hello ! to string
for(i=0; i<10; i++) putc(string[i]); //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

Reset Button
5V 1 2

10K U1
1 40
2 MCLR RB7 39
+ 3 RA0 RB6 38
RA1 RB5

2
470uF-25V 0.1uF 10K 0.1uF 4 37
1 3 5 RA2 RB4 36
6 RA3 RB3 35
Analog Input 7 RA4 RB2 34
8 RA5 RB1 33
9 RE0 RB0 32
10 RE1 VDD 31
11 RE2 GND 30
12 VDD RD7 29
13 GND RD6 28
14 OSC1 RD5 27 J1
15 OSC2 RD4 26
RC0 RC7 4

8
16 25
17 RC1 RC6 24 3

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

Dir Brake PWM


Motor

DC motor driver

//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 U1 Buttons
1 40 1 2
2 MCLR RB7 39 1 2
3 RA0 RB6 38 1 2
4 RA1 RB5 37 1 2
RA2 RB4

2
5 36
Reset 6 RA3 RB3 35
Button 7 RA4 RB2 34
8 RA5 RB1 33
9 RE0 RB0 32 LED R 330
10 RE1 VDD 31

1
11 RE2 GND 30
12 VDD RD7 29
13 GND RD6 28
14 OSC1 RD5 27 J1
15 OSC2 RD4 26
8
16 RC0 RC7 25 4
17 RC1 RC6 24 3
OUT

Osillator 18 RC2 RC5 23 2


20MHz 19 RC3 RC4 22 1
20 RD0 RD3 21 to RS232
SCO-060 RD1 RD2
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
Reset Button Digital Output
5V 1 2

10K U1 LED R 330


1 40
2 MCLR RB7 39
+ 3 RA0 RB6 38
RA1 RB5

2
470uF-25V 0.1uF 10K 0.1uF 4 37
1 3 5 RA2 RB4 36
6 RA3 RB3 35
Analog Input 7 RA4 RB2 34
8 RA5 RB1 33
9 RE0 RB0 32
10 RE1 VDD 31
11 RE2 GND 30
12 VDD RD7 29
13 GND RD6 28
14 OSC1 RD5 27 J1
15 OSC2 RD4 26
RC0 RC7 4

8
16 25
17 RC1 RC6 24 3

OUT
Osillator 18 RC2 RC5 23 2
20MHz 19 RC3 RC4 22 1
20 RD0 RD3 21 to RS232
SCO-060 RD1 RD2
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 40
2 MCLR RB7 39
3 RA0 RB6 38
4 RA1 RB5 37
5 RA2 RB4 36
6 RA3 RB3 35
7 RA4 RB2 34
8 RA5 RB1 33 XUNG B
9 RE0 RB0 32
10 RE1 VDD 31
11 RE2 GND 30
12 VDD RD7 29
XUNG A 15 GND RD6 28
16 RC0 RD5 27
17 RC1 RD4 22
18 RC2 RD3 21
23 RC3 RD2 20
24 RC4 RD1 19
RC5 RD0

ENCODER
OSC2

XUNG A 25 13
26 RC6 OSC1 C1
XUNG B RC7
U2 Y2
14

C2
ZTA

//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 40
2 MCLR RB7 39
3 RA0 RB6 38
4 RA1 RB5 37
5 RA2 RB4 36
6 RA3 RB3 35
7 RA4 RB2 34
8 RA5 RB1 33
9 RE0 RB0 32
10 RE1 VDD 31
11 RE2 GND 30
12 VDD RD7 29
15 GND RD6 28
CCP1 16 RC0 RD5 27
CCP2 17 RC1 RD4 22
18 RC2 RD3 21
23 RC3 RD2 20
24 RC4 RD1 19
RC5 RD0

OSC2
25 13
RC6 OSC1

BO
26 C1
RC7
U2 Y2

PHAT
14
C2
ZTA

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 MASTER
PIC16F877
1 40
2 MCLR RB7 39
3 RA0 RB6 38
4 RA1 RB5 37
5 RA2 RB4 36
6 RA3 RB3 35
SS+D7 7 RA4 RB2 34
8 RA5 RB1 33
9 RE0 RB0 32
10 RE1 VDD 31
11 RE2 GND 30
12 VDD RD7 29
15 GND RD6 28
16 RC0 RD5 27
17 RC1 RD4 22
18 RC2 RD3 21
23 RC3 RD2 20
24 RC4 RD1 19 C1
RC5 RD0

OSC2
25 13
26 RC6 OSC1
RC7
U2 Y2

14
C2
ZTA

VCC SLAVE
PIC16F877
1 40
2 MCLR RB7 39
3 RA0 RB6 38
4 RA1 RB5 37
5 RA2 RB4 36
6 RA3 RB3 35
7 RA4 RB2 34
8 RA5 RB1 33
9 RE0 RB0 32
10 RE1 VDD 31
11 RE2 GND 30 SS+D7
12 VDD RD7 29
15 GND RD6 28
16 RC0 RD5 27
17 RC1 RD4 22
18 RC2 RD3 21
23 RC3 RD2 20
24 RC4 RD1 19 C1
RC5 RD0
OSC2

25 13
26 RC6 OSC1
RC7
U1 Y1
14

C2
ZTA

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 MASTER
PIC16F877
1 40
2 MCLR RB7 39
3 RA0 RB6 38
4 RA1 RB5 37
5 RA2 RB4 36
6 RA3 RB3 35
7 RA4 RB2 34
8 RA5 RB1 33
9 RE0 RB0 32
10 RE1 VDD 31
11 RE2 GND 30
12 VDD RD7 29
15 GND RD6 28
16 RC0 RD5 27
17 RC1 RD4 22
18 RC2 RD3 21
23 RC3 RD2 20
24 RC4 RD1 19 C1
25 RC5 RD0
OSC2 13
26 RC6 OSC1
RC7
U2 Y2
14

C2
ZTA

VCC SLAVE
PIC16F877
1 40
2 MCLR RB7 39
3 RA0 RB6 38
4 RA1 RB5 37
5 RA2 RB4 36
6 RA3 RB3 35
7 RA4 RB2 34
8 RA5 RB1 33
9 RE0 RB0 32
10 RE1 VDD 31
11 RE2 GND 30
12 VDD RD7 29
15 GND RD6 28
16 RC0 RD5 27
17 RC1 RD4 22
18 RC2 RD3 21
23 RC3 RD2 20
24 RC4 RD1 19 C1
RC5 RD0
OSC2

25 13
26 RC6 OSC1
RC7
U1 Y1
14

C2
ZTA

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
MASTER
PIC16F877
1 40
PSP_RD 2 MCLR RB7 39
PSP_WR 3 RA0 RB6 38
PSP_CS 4 RA1 RB5 37
5 RA2 RB4 36
6 RA3 RB3 35
7 RA4 RB2 34
8 RA5 RB1 33
9 RE0 RB0 32
10 RE1 VDD 31
11 RE2 GND 30 PSP MASTER
12 VDD RD7 29 PSP MASTER
15 GND RD6 28 PSP MASTER
16 RC0 RD5 27 PSP MASTER
17 RC1 RD4 22 PSP MASTER
18 RC2 RD3 21 PSP MASTER
23 RC3 RD2 20 PSP MASTER
24 RC4 RD1 19 PSP MASTER
RC5 RD0
OSC2

25 13
26 RC6 OSC1 C1
RC7
U2 Y2
14

C2
ZTA

VCC SLAVE
PIC16F877
1 40
2 MCLR RB7 39
3 RA0 RB6 38
4 RA1 RB5 37
5 RA2 RB4 36
6 RA3 RB3 35
7 RA4 RB2 34
PSP_RD 8 RA5 RB1 33
PSP_WR 9 RE0 RB0 32
PSP_CS 10 RE1 VDD 31
11 RE2 GND 30 PSP MASTER
12 VDD RD7 29 PSP MASTER
15 GND RD6 28 PSP MASTER
16 RC0 RD5 27 PSP MASTER
17 RC1 RD4 22 PSP MASTER
18 RC2 RD3 21 PSP MASTER
23 RC3 RD2 20 PSP MASTER
24 RC4 RD1 19 PSP MASTER
RC5 RD0
OSC2

25 13
26 RC6 OSC1 C1
RC7
U1 Y1
14

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