You are on page 1of 34

Bn cp nht ngy 5/7/2011 Index

Bi 1 - CCS cho PIC16F877A Bi 2 - I/O + Delay _ Delay 1s RB0 Bi 3 - Delay 1s portB Bi 4 - Timer Bi 5 - Interrupt Bi 6 - Ngt Timer0 *** Gii thch ca Mr.ntc *** Bi 7 - Ngt ngoi Bi 8 - Ngt ngoi trn RB4-RB7 Bi 9 - Gii m bn phm Bi 10 - Chng trnh gi k t ra 2x16 LCD dng CCS C Bi 11 - V d nh v ngt ngoi Bi 12 - Ngt ngoi v n 7 on Bi 13 - M t cch dng PWM do CCS cung cp Bi 14 - Chng trnh hin th phm s ra n 7 on (khng dng interrupt) Bi 15 - Chng trnh hin th phm s ra n 7 on (DNG INTERRUPT) Bi 16 - Tm hiu v LCD Bi 17 - Lp trnh cho LCD Bi 18 - Tnh ton timer0 v cc thit lp lin quan cho PIC18F4550 Bi 19 - S dng timer0 lm delay

Bi 1 - CCS C cho PIC16F877A


Cho c nh! lp trnh cho PIC, mi ngi c th chn cho mnh nhng ngn ng lp trnh khc nhau nh ASM, CCS C, HT-PIC, Pascal, Basic,... Vi nhh, u tin tm hiu v vit chng trnh c bn bng ASM hiu r cu trc sau th vit bng CCS C cng vit li nhng ci c bn v i dn ln, tc lc ny nhanh hn khi vit bng ASM rt nhiu. Khi vit bng CCS C thng thng th dch ra file.hex c di hn so vi khi vit bng ASM. Hai ngn ng CCS C v HT-PIC c a chung hn c, CCS C d hc, gn gi vi ASM cn HT-PIC l dng ANSI C. lp trnh v bin dch CCS C, dng chng trnh PIC C Complier,sau khi son tho cc bn n F9 dch, nu thnh cng s c thng bo nh sau:

Ngoi ra, xem code ASM nh th no,sau khi dch bn chn mc C/ASM List nh hnh di y:

Link download trnh bin dch CCS C y: http://www.tailieuvietnam.net/downlo...CCSC_3.249.rar Phin bn mi hn ti ti: www.kho.tailieuvietnam.net, vo Download Home > in t tn th > Vi iu khin - Vi x l - PLC Chng ta cng nhau tm hiu ln lt cc phn sau: 1. I/O + Delay 2. Timer v ngt Timer 3. Ngt ngoi 4. ADC, PWM,... (tp trung m x nhiu) 5...... Tm thi c nh vy , sau ny s tnh tip! No, chng ta bt u thi!

Bi 2 - I/O + Delay _ Delay 1s RB0


Chng trnh ny lm nhp nhy con led chn RB0 1s sng, 1s tt. Code: #include<16F877A.h> #fuses NOWDT,PUT,HS,NOPROTECT #use delay(clock=10000000) main() { while(true) { output_high(PIN_B0); delay_ms(1000); output_low(PIN_B0); delay_ms(1000); } } Trn y: Code: #include<16F877A.h> Khai bo con PIC bn s dng, file ny chng trnh vit sn nhm khai bo cc bit, thanh ghi quan trng trong con pic ny.Cc bn c th vo th mc ci t C:\Program Files\PICC\Devices\16F877A.h xem n khai bo c nhng g trong ! Code: #fuses NOWDT,PUT,HS,NOPROTECT Thit lp cc config Code: #use delay(clock=10000000) Khai bo tn s dao ng cp cho PIC Code: output_high(PIN_B0) Xut ra chn RB0 mc logic 1 (tc 5V), do khi thc hin hm ny bao hm lun vic tc ng ln thanh ghi TRISB (dng chn chn I/O) do vy ta khng cn vit lnh chn chn I/O na. Code: output_low(PIN_B0) Ngc li Code: delay_ms(1000) To tr khong thi gian theo mili giy l 1000 (tc 1s) Ch hm ny ch c tc dng khi c khai bo tn s dao ng cp cho PIC V by gi th lm cho tt c 8 led ni vi portB chp tt 1s xem no! Phi chng ta s lm nh sau (Vit trong vng lp while): Code: { output_high(PIN_B0); output_high(PIN_B1); output_high(PIN_B2); output_high(PIN_B3); output_high(PIN_B4); output_high(PIN_B5); output_high(PIN_B6); output_high(PIN_B7); delay_ms(1000); output_low(PIN_B0); output_low(PIN_B1); output_low(PIN_B2); output_low(PIN_B3);

output_low(PIN_B4); output_low(PIN_B5); output_low(PIN_B6); output_low(PIN_B7); delay_ms(1000); } Vit nh th ny th qu di v thiu chnh xc na, c cch no khc hay hn khng ? Sao ta khng xut y hn portB ln mc cao, to tr 1s ri p cho n xung mc thp, to tr 1s cng mt lc nh ! Bi tip theo s a ra cu tr li... File Km Theo Delay 1s RB0.rar (7.9 KB, 1731 ln ti)

Bi 3 - Delay 1s portB
V y l cu tr li cho vic delay led portB 1s Code: #include<16F877A.h> #fuses NOWDT,PUT,HS,NOPROTECT #use delay(clock=10000000) #use fast_io(b) #byte portb=0x6 main() { set_tris_b(0); while(true) { portb=255; //all led on delay_ms(1000); portb=0; //all led off delay_ms(1000); } } Code: #byte portb=0x6 Khai bo a ch portB, khng nh trong MPLAB nh ngha lun ci ny cho ta, nu khng c dng ny chng trnh s bo li cha nh ngha portB Code: set_tris_b(0) Tt c cc chn ca portB l output, mun set tt c cc chn l input th trong ngoc l 255,.... Trong HELP hng dn lnh ny nh sau: "These functions allow the I/O port direction (TRI-State) registers to be set. This must be used with FAST_IO and when I/O ports are accessed as memory such as when a #BYTE directive is used to access an I/O port. Using the default standard I/O the built in functions set the I/O direction automatically." R rng khi set byte lm I/O nu ta thm khai bo: Code: #use fast_io(b) Dng khai bo ny th CCS s ch thc hin ng mt lnh cho vic I/O cc chn trn port tng ng, nu ko n phi mt khong 3 hay 4 lnh g . Phn I/O + Delay tm thi xong nh vy, bc no c phn hi th tip tc tho lun. Xong phn ny c th vit v xut led 7 on, qut phm, LCD,... Hn gp li vi hm na bi Timer/Counter ! File Km Theo Delay 1s portB.rar (12.5 KB, 1320 ln ti) Mr. ncv Mt phng n khc: #include <16F877A.h> #fuses HS, NOWDT, NOLVP, XT #use delay(clock=4000000) void main() { byte leds = 0xff; set_tris_b(0x00); // configure pins of PORTB as output while (true) { output_b(leds); leds = ~leds; // toggle leds delay_ms(1000); } }

Bi 4 -

Timer

Hi....! Trong Pic16f877a c 3 timer : + Timer0 : 8 bit + Timer1 : 16 bit + Timer2 : 8 bit Timer dng cho nhiu ng dng : nh thi, capture, pwm, ... 1. Timer0 Thanh ghi tc ng: Cc lnh: Code: setup_TIMER_0(mode); setup_COUNTERS (rtcc_state, ps_state); // hay setup_WDT() set_TIMER0(value); // hay set_RTCC(value) :xc nh gi tr ban u (8bit) cho Timer0 get_TIMER0(); // hay get_RTCC() :tr v s nguyn (8bit) ca Timer0 Trong mode l mt hoc hai constant (nu dng hai th chn du "|" gia) c nh ngha trong file 16F877A.h gm : RTCC_INTERNAL : chn xung clock ni RTCC_EXT_L_TO_H : chn bit cnh ln trn chn RA4 RTCC_EXT_H_TO_L : chn bit cnh xung trn chn RA4 RTCC_DIV_2 :chia prescaler 1:2 RTCC_DIV_4 1:4 RTCC_DIV_8 1:8 RTCC_DIV_16 1:16 RTCC_DIV_32 1:32 RTCC_DIV_64 1:64 RTCC_DIV_128 1:128 RTCC_DIV_256 1:256 rtcc_state l mt trong nhng constant sau: RTCC_INTERNAL RTCC_EXT_L_TO_H RTCC_EXT_H_TO_L ps_state l mt trong nhng constant sau: RTCC_DIV_2 RTCC_DIV_4 RTCC_DIV_8 RTCC_DIV_16 RTCC_DIV_32 RTCC_DIV_64 RTCC_DIV_128 RTCC_DIV_256 WDT_18MS WDT_36MS WDT_72MS WDT_144MS WDT_288MS WDT_576MS WDT_1152MS WDT_2304MS Mnh cng cha hiu ngha ca hm WDT_..., ko bit c phi khai bo nh trn th sau khong thi gian ms bao nhiu t sau WDT_ th s reset li Pic ?????

2. Timer1 Thanh ghi tc ng: Cc lnh: Code: setup_TIMER_1(mode); set_TIMER1(value); get_TIMER1(); // xc nh gi tr ban u (16bit) cho Timer1 // tr v s nguyn (16bit) ca Timer1

mode gm (c th kt hp bng du "|"): T1_DISABLED : tt Timer1 T1_INTERNAL : xung clock ni (Fosc/4) T1_EXTERNAL : xung clock ngoi trn chn RC0 T1_EXTERNAL_SYNC : xung clock ngoi ng b T1_CLK_OUT T1_DIV_BY_1 T1_DIV_BY_2 T1_DIV_BY_4 T1_DIV_BY_8 3. Timer2 Thanh ghi tc ng: Cc lnh: Code: setup_TIMER_2(mode, period, postscale); set_TIMER2(value); // xc nh gi tr ban u (8bit) cho Timer2 get_TIMER2(); // tr v s nguyn 8bit Vi mode gm (co the ket hop bang dau "|"): T2_DISABLED T2_DIV_BY_1 T2_DIV_BY_4 T2_DIV_BY_16 period l s nguyn t 0-255, xc nh gi tr xung reset postscale l s nguyn 1-16, xc nh reset bao nhiu ln trc khi ngt.

Bi 5 - Interrupt
Cc lnh dng cho ngt: Code: enable_interrupts(level); disable_interrupts(level); ext_int_edge(edge); level bao gm: GLOBAL : ngt ton cc INT_RTCC : trn TMR0 INT_RB : c thay i trng thi mt trong cc chn RB4 n RB7 INT_EXT : ngt ngoi INT_AD : chuyn i AD hon tt INT_TBE : b m chuyn RS232 trng INT_RDA : data nhn t RS232 sn sng INT_TIMER1 : trn TMR1 INT_TIMER2 : trn TMR2 INT_CCP1 : c capture hay compare trn CCP1 INT_CCP2 : c capture hay compare trn CCP2 INT_SSP : c hot ng SPI hay I2C INT_PSP : c data vo cng parallel slave INT_BUSCOL : xung t bus INT_EEPROM : ghi vo eeprom hon tt INT_TIMER0 : trn TMR0 INT_COMP : kim tra bng nhau comparator edge bao gm: L_TO_H : cnh ln H_TO_L : cnh xung Sau khai bo trn vo on chng trnh ngt, khai bo: #INT_......... V d vo thc thi ngt ngoi, ta c on code: Code: #INT_EXT void ngat_ngoai() { //Chng trnh ngt ti y } //cho php ngt kiu level //cm ngt kiu level // chn cch ly xung loi

edge

Bi 6 - Ngt Timer0
y l chng trnh dng ngt Timer0 nh th 1s. u tin led chn RB0 sng, sau 1s s dch sang tri, ngha l led 1 trn chn RB1 sng , ln lt nh vy cho cc led trn portB v lp li mi mi. Code: #include <16F877A.h> #fuses NOWDT,PUT,XT,NOPROTECT #use delay(clock=4000000) #byte PORTB = 0x06 int16 count; int8 a; //Chuong trinh ngat TMR0 #int_timer0 void interrupt_timer0() { set_timer0(6); ++count; if(count == 2000) // 2000*500us = 1000.000us = 1s { count=0; rotate_left(&a,1); } } //Chuong trinh chinh void main(void) { set_tris_b(0); enable_interrupts(int_timer0); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); enable_interrupts(global); set_timer0(6);// T_dinhthi = 2*(256 - 6)*1us = 500us a = 0x01; count=0; // khi ng while(true) { PORTB = a; } }

Mr. ncv Mt cch vit khc tham kho vi hy vng vit C sao cho d hiu :-) #include <16F877A.h> #fuses NOWDT, PUT, XT, NOPROTECT #use delay(clock=4000000) #define INITIAL_VALUE 6 byte count; byte led; void change_led(void); #int_timer0 void interrupt_timer0() { set_timer0(INITIAL_VALUE); count++; if (count == 2000) { count = 0; //khi ng change_led(); }

10

} void main() { set_tris_b(0); enable_interrupts(GLOBAL); enable_interrupts(INT_TIMER0); setup_timer_0(RTCC_INTERNAL | RTCC_DIV_2); // set mod set_timer0(INITIAL_VALUE); // set initial value count = 0; led = 1; while (true) output_b(led); } void change_led() { led = led << 1; if (led == 0) led = 1; }

11

Trch:

*** Gii thch ca Mr.ntc ***

Mnh cng cha hiu ngha ca hm WDT_..., ko bit c phi khai bo nh trn th sau khong thi gian ms bao nhiu t sau WDT_ th s reset li Pic ????? WDT l "ch gi nh" (Watchdog Timer). B phn ny c nhim v reset li PIC sau mt khong thi gian nh trc. WDT s reset vi iu khin khi b m ca WDT b trn. Mc ch ca n l trnh trng hp vi iu khin b "treo" khi phi hot ng lin tc trong mt khong thi gian lu di. Thi gian nh trc ny ph thuc vo tn s loi thch anh s dng v b chia tn s trc (prescaler) ca WDT. Ta thy WDT ch lin quan n Timer 0, cn cc Timer khc khng c lin quan. l ti v WDT c b chia tn s (prescaler) dng chung vi Timer 0. Lu l mun s dng WDT cn ch n phn khai bo cc "fuse" u chng trnh. Trch: rtcc_state l mt trong nhng constant sau: RTCC_INTERNAL RTCC_EXT_L_TO_H RTCC_EXT_H_TO_L Mi Timer u c 2 tc dng: Tc dng nh thi: Timer s da vo cc xung to ra bi b dao ng (thch anh, dao ng RC, ...) cung cp cho vi iu khin m. V da vo tn s b dao ng, gi tr cc b chia tn s v gi tr ca Timer, ta c th xc nh c thi gian thc. Nh vy trong trng hp mun Timer hot ng ch nh thi, ta phi khai bo rtcc_state l "RTCC_INTERNAL" (x dng tn s dao ng ni). Tc dng m: Timer s da vo cc xung ly t mi trng bn ngoi m. Ty theo Timer m ta s dng chn ly xung tng ng (Timer 0 l chn RA4, Timer1 l chn RC0). Cc xung ny c tc dng phn nh cc hin tng trong thc t, v vic m cc xung cng ng ngha vi vic m cc hin tng . V linh ng hn trong qu trnh x l, Timer cn cho php chn cnh tc ng ln b m (ch ny ch c Timer 0). Nh vy mun Timer hot ng ch m, ta phi khai bo rtcc_state l mt trong 2 trng hp cn li (s dng dao ng ngoi). Trch: ps_state l mt trong nhng constant sau: RTCC_DIV_2 RTCC_DIV_4 RTCC_DIV_8 RTCC_DIV_16 RTCC_DIV_32 RTCC_DIV_64 RTCC_DIV_128 RTCC_DIV_256 WDT_18MS WDT_36MS WDT_72MS WDT_144MS WDT_288MS WDT_576MS WDT_1152MS WDT_2304MS y c n 2 hm dng n nh t s chia ca prescaler, mt hm l "RTCC_DIV_...", mt hm l "WDT_ ...". l bi v Timer 0 v WDT dng chung b chia tn s. Khi b chia c Timer 0 s dng th WDT khng oc h tr vi b chia ny na. Nh vy s khc bit v thao tc gia 2 hm ny c th l nh sau:

12

Hm "RTCC_DIV_..." : cho php Timer 0 s dng b chia tn s, khng cho php WDT s dng v n nh t s chia ca n. Hm "WDT_ ..." : cho php WDT 0 s dng b chia tn s, khng cho php Timer 0 s dng v n nh t s chia ca n. Trch: T2_DISABLED T2_DIV_BY_1 T2_DIV_BY_4 T2_DIV_BY_16 period l s nguyn t 0-255, xc nh gi tr xung reset postscale l s nguyn 1-16, xc nh reset bao nhiu ln trc khi ngt. hm nay 09:30 AM Ta c th nhn thy l Timer 2 c n 2 b chia tn s trc v sau, mt b prescaler c nh km vo cc ch hot ng ca Timer 2 (T2_DIV_BY_1, T2_DIV_BY_4, T2_DIV_BY_16), mt b l postscaler cis t s chia t 1:16. Nh vy n cho php vic la chn t s chia linh ng hn. Timer 2 khng hot ng ch m. Chc nng ca n ch yu l tc ng ln tc baud cho MSSP th phi. Khng nh r lm. Trch: postscale l s nguyn 1-16, xc nh reset bao nhiu ln trc khi ngt. Ci ny mnh coi li , ti sao n li xc nh reset bao nhiu ln trc khi ngt ??. Phi coi li ci s khi ca Timer 2 mi bit c.

13

Bi 7 - Ngt ngoi
Cho c nh ! Sao khng thy bc no post bi vo lung ny vy k ! Trm qu...! Trm qu...! Hay ci CCS C ny khng hp dn mi ngi chng! Khng ai vit g, t vn post cho n trm....! v d v ngt Timer, sau y l 2 v d v ngt ngoi trn chn RB0 v trn cc chn RB4 n RB7: Chng trnh sau dng ngt ngoi trn RB0 m s ln ci button c nhn xung, hin th ln led 7 on (common cathode). Nu s ln nhn vt qu 9, chng trnh s quay v hin th ln led t s 1. Code: //*************************************************************************** ** // Author : nhh // Date : 03/04/06 // Hardware: PIC16F877A //*************************************************************************** ** #include <16F877A.h> #fuses NOWDT,PUT,XT,NOPROTECT #use delay(clock=4000000) #use fast_io(b) #use fast_io(d) #byte portb=0x06 #byte portd=0x08 const unsigned char digital[]={0b00000110, 0b01011011, 0b01001111, 0b01100110, 0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01101111}; int i; // ma hoa digital duoi dang mang // Chuong trinh ngat #int_ext void ngat_RB0() { if(i<9) { portd=digital[i]; ++i; } if(i==9) { i=0; } } // Chuong trinh chinh main() { set_tris_b(0b00000001); set_tris_d(0); enable_interrupts(global); enable_interrupts(int_ext); ext_int_edge(H_to_L); portd=0b00111111; while(true) { // chi doi ngat nen vong lap nay ko co gi ca ! } } File Km Theo dem1-9dungngatngoai.rar (13.6 KB, 752 ln ti)

14

Bi 8 - Ngt ngoi trn RB4-RB7


Cn y l ng dng ngt ngoi trn RB4 n RB7 thay i kiu cng nh tc chp nhy my con led ch ... ngm cho vui mt ! n sw1, n sw2, n sw3, n sw4, Code: led1 nhp nhy vi delay 250ms led1, 2 nhp nhy vi delay 200ms led1, 2, 3 nhp nhy vi delay 150ms led1, 2, 3, 4 nhp nhy vi delay 100ms

//*************************************************************************** // Author : nhh // Date : 03/04/06 // Hardware: PIC16F877A //*************************************************************************** ** #include <16F877A.h> #fuses NOWDT,PUT,XT,NOPROTECT #use delay(clock=4000000) #use fast_io(b) #byte portb=0x06 #byte intcon=0x000B #bit RB4=portb.4 #bit RB5=portb.5 #bit RB6=portb.6 #bit RB7=portb.7 #bit RBIF=intcon.0 //dinh nghia co ngat RB #bit RBIE=intcon.3 //dinh nghia bit cho phep ngat RB int led=0,speed; // Chuong trinh ngat #int_RB void ngat_RB() { if((RBIF)&&(RBIE)) { //Kiem tra sw1 { if(RB4==0) { led=0b00000001; //led1 sang speed=250; } } //Kiem tra sw2 { if(RB5==0) { led=0b00000011; //led1,2 sang speed=200; } } //Kiem tra sw3 { if(RB6==0) { led=0b00000111; //led1,2,3 sang speed=150; } } //Kiem tra sw4 { if(RB7==0) { led=0b00001111; //led1,2,3,4 sang speed=100;

15

} // Chuong trinh chinh main() { set_tris_b(0b11110000); portb=0b00001111; enable_interrupts(global); enable_interrupts(int_RB); ext_int_edge(H_to_L); while(true) { portb=led; delay_ms(speed); portb=0; delay_ms(speed); } }

} } RBIF=0; //Xoa co ngat RB }

Khng nh trong MPLAB, nh ngha sng cc thanh ghi v bit tng ng, cn CCS C ch nh ngha chn PIC, nhng thanh ghi, nhng bit m CCS C cho l cn thit, ta xem trong file PIC16F887A.h, thanh ghi, bit no cha nh ngha m mun s dng th phi nh ngha n. Ta c th vit ring 1 file.h loi ny sao cho mnh d nh nht, n khi mun s dng ch cn khai bo #include<file.h> vo l xi thi! File Km Theo thaydoitocdochopleddungngatngoai.rar (14.0 KB, 730 ln ti)

16

Bi 9 - Gii m bn phm
Mch qut 16 phm, hin kt qu ln led 7 on. Code: //*************************************************************************** // Author : nhh // Date : 03/04/06 // Hardware: PIC16F877A //*************************************************************************** #include <16F877A.h> #fuses NOWDT,PUT,XT,NOPROTECT #use delay(clock=4000000) #use fast_io(b) #use fast_io(c) #byte portb = 0x06 #byte portc = 0x07 #byte intcon = 0x0B #bit RB0 = 0x06.0 #bit RB1 = 0x06.1 #bit RB2 = 0x06.2 #bit RB3 = 0x06.3 #bit RB4 = 0x06.4 #bit RB5 = 0x06.5 #bit RB6 = 0x06.6 #bit RB7 = 0x06.7 #bit RBIF=intcon.0 //dinh nghia co ngat RB #bit RBIE=intcon.3 //dinh nghia bit cho phep ngat RB int a; const unsigned char dig[]={0b00111111,0b00000110, 0b01011011,0b01001111, 0b01100110,0b01101101,0b01111101,0b00000111,0b01111111,0b01101111,0b01110111, 0b01111100,0b00111001,0b01011110,0b11111001,0b11110001}; // ma hoa digital duoi dang mang // Chuong trinh ngat #int_RB void ngat_RB() { if((RBIF)&&(RBIE)) { { if(RB4&&RB0)a=dig[0]; } { if(RB4&&RB1)a=dig[4]; } { if(RB4&&RB2)a=dig[8]; } { if(RB4&&RB3)a=dig[12]; } //....... { if(RB5&&RB0)a=dig[1]; } { if(RB5&&RB1)a=dig[5]; } { if(RB5&&RB2)a=dig[9]; } { if(RB5&&RB3)a=dig[13]; } //........ { if(RB6&&RB0)a=dig[2];

17

} { if(RB6&&RB1) a=dig[6]; } { if(RB6&&RB2) a=dig[10]; } { if(RB6&&RB3) a=dig[14]; } //........ { if(RB7&&RB0) a=dig[3]; } { if(RB7&&RB1) a=dig[7]; } { if(RB7&&RB2) a=dig[11]; } { if(RB7&&RB3) a=dig[15]; } RBIF=0; //Xoa co ngat RB } } // Chuong trinh chinh main() { set_tris_b(0b11110000); set_tris_c(0); enable_interrupts(global); enable_interrupts(int_RB); ext_int_edge(H_to_L); portb=0; portc=0; while(true) { portb=1; portb=2; portb=4; portb=8; portc=a; } } File Km Theo Giaimabanphim.rar (27.8 KB, 889 ln ti) Bc nn treo cc chn ln ngun v qut mc thp v nu bc b h chn nh th th c kh nng nhiu lm cho chng trnh mt n nh. Chc sc khe (mr.hpecom)

18

Bi 10 - Chng trnh gi k t ra 2x16 LCD dng CCS C


Chng trnh gi k t ra 2x16 LCD dng CCS C #include "16F877A.h" // PIC16F877A header file #use delay(clock=4000000) // for 4Mhz crystal #fuses XT, NOWDT, NOPROTECT, NOLVP // for debug mode #define WRITE_DATA 0 #define WRITE_COMMAND 1 #define NCHAR_PER_LINE 16 // max char numbers per line #define MS10 10 // 10 milliseconds #define US400 400 // 400 microseconds #define LCD_RS PIN_A1 #define LCD_RW PIN_A2 #define LCD_E PIN_A3 /////////////////////////////////////////////////////////// // /* private */ void lcd_write(byte dat, int1 option) { delay_us(US400); if (option == WRITE_DATA) output_high(LCD_RS); else // option == WRITE_COMMAND output_low(LCD_RS); output_low(LCD_RW); output_b(dat); output_high(LCD_E); delay_us(US400); output_low(LCD_E); } /////////////////////////////////////////////////////////// // void lcd_init(void) { output_low(LCD_E); // Let LCD E line low lcd_write(0x38, WRITE_COMMAND); // Set LCD 16x2, 5x7, 8bits data delay_ms(15); lcd_write(0x01, WRITE_COMMAND); // Clear LCD display delay_ms(MS10); lcd_write(0x0f, WRITE_COMMAND); // Open display & current delay_ms(MS10); lcd_write(0x06, WRITE_COMMAND); // Window fixed (Character Entry Mode?) delay_ms(MS10); } /////////////////////////////////////////////////////////// // void lcd_display_char(int8 line, int8 pos, char ch) { line = (line == 0) ? 0 : 1; pos = (pos > NCHAR_PER_LINE) ? NCHAR_PER_LINE : pos; lcd_write(0x80 + 0x40 * line + pos, WRITE_COMMAND); lcd_write(ch, WRITE_DATA); } /////////////////////////////////////////////////////////// void lcd_display_str(int8 line, char str[], int8 nchars) {

19

int8 i; for (i = 0; i < nchars; i++) lcd_display_char(line, i, str[i]); } /////////////////////////////////////////////////////////// /** * Display characters to a 2x16 LCD * * (1) LCD1 to GND * (2) LCD2 to VDD 5 volts * (3) LCD4 (RS) - LCD5 (RW) - LCD6 (E) to A1, A2, A3 * (4) LCD7-LCD14 to B0-B7 (bus data) * * Ref: http://pic16.com/bbs/dispbbs.asp?boa...ID=5879&page=1 */ void main(void) { int8 i; char LINE1[] = { "SGN Tech" }; char LINE2[] = { "Xin chao" }; lcd_init(); // use of lcd_display_char() for (i = 0; i < 8; i++) lcd_display_char(0, i, LINE1[i]); // use of lcd_display_str lcd_display_str(1, LINE2, 8); } CCS C c mt v d hay hn: Ch cn dng 4 bits D4-D7 ca LCD: trong mc Examples\EX_LCDKB.C

20

Bi 11 - V d nh v ngt ngoi
Bnh thng th LED6 sng, LED7 ti. Khi nhn phm, LED6 ti, LED7 sng trong vng 0,5 giy, ri tr v trng thi ban u (LED6 sng, LED7 ti) #include <16F877A.h> #fuses NOWDT, XT #use delay(clock=4000000) void high_b6_low_b7() { output_high(PIN_B6); output_low(PIN_B7); } void low_b6_high_b7() { output_low(PIN_B6); output_high(PIN_B7); } /////////////////////////////////////////////////////////// #INT_EXT void RB0_handler() { low_b6_high_b7(); delay_ms(500); high_b6_low_b7(); } /////////////////////////////////////////////////////////// /** * Keep B6 on and B7 off. Pressing the button causes interrupt: * B6 off and B7 on, delay half second, then B6 on and B7 off * * Wiring (TM Board) * (1) PIC's B0 to Matrix Key R0 * Matrix Key C0 to GND * (2) PIC's B6-B7 to LED6-LED7 * * Ref: Interrupt Mechanism * http://www.mikroelektronika.co.yu/en...sicbook/06.htm */ void main() { enable_interrupts(GLOBAL); // enable all interrupts enable_interrupts(INT_EXT); // enable external interrupt from pin RB0/INT high_b6_low_b7(); while (true) { // do nothing } }

21

Bi 12 - Ngt ngoi v n 7 on
Mt phng n khc: #include <16F877A.h> #fuses NOWDT, XT #fuses NOLVP // important #use delay(clock=4000000) // 0 1 2 3 4 5 6 7 8 9 byte const DIGITS[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f }; int8 i = 0; /////////////////////////////////////////////////////////// /* private */void off_on_led_transistor() { output_low(PIN_D1); delay_ms(1); output_high(PIN_D1); } /////////////////////////////////////////////////////////// /* private */void display(int8 digit) { output_c(DIGITS[digit] ^ 0xff); off_on_led_transistor(); } /////////////////////////////////////////////////////////// #INT_EXT void ngat_RB0() { i = (i < 9) ? i+1 : 1; delay_ms(200); // switch debounce period } /////////////////////////////////////////////////////////// /** * Count number of key presses and display it on a 7-segment LED. * If the number is 9, the next count will be 1 * * Wiring (TM Board) * (1) PIC's B0 to R0 * Matrix Key C0 to GND * (2) PIC's C0-C6 to 7-segment LED's A-G * PIC's D1 to 7-segment LED's C2 */ void main() { enable_interrupts(GLOBAL); enable_interrupts(INT_EXT); while (true) display(i); }

22

Bi 13 - M t cch dng PWM do CCS cung cp


PWM l g? s dng n vo mc ch g? 1) PWM l g? PWM l mt b iu ch rng xung. C hai thng s (tm gi n gin nh vy, v c l cng ch quan tm n hai thng s ny vi PWM) quan trng ca PWM l chu k xung T v thi gian t1 ca mc logic 0, trong v d ny th t1 tng ng vi value. "iu ch rng xung" th chng ta s gi nguyn T v thay i t1, theo yu cu ca bi ton c th. Value trong v d sau ly c t u vo anlaog, chu k (hay tn s) ca xung c chn la t PC thng qua cng truyn thng ni tip RS232. 2) PWM dng vo mc ch g? C nhiu ng dng cho n, v d truyn thng, iu khin cc van bn dn trong cc bin tn, lm b ngun chuyn mch,...i nhiu lm! Bt u vit nh: #if defined(__PCM__) #include <16F877.h> #fuses HS,NOWDT,NOPROTECT,NOLVP #use delay(clock=4000000) #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, BRGH1OK) #elif defined(__PCH__) #include <18F452.h> #fuses HS,NOWDT,NOPROTECT,NOLVP #use delay(clock=10000000) #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, BRGH1OK) #endif void main() { char selection=1; int8 value; printf("\r\nFrequency:\r\n"); printf(" 1) 7.8 khz\r\n"); printf(" 2) 19.5 khz\r\n"); printf(" 3) 0.48 khz\r\n"); do { selection=getc(); }while((selection<'1')||(selection>'3')); setup_ccp1(CCP_PWM); // Configure CCP1 as a PWM // // // // // // The cycle time will be (1/clock)*4*t2div*(period+1) In this program clock=4000000 and period=127 (below) For the three possible selections the cycle time is: (1/4000000)*4*1*128 = 12.8 us or 7.8 khz (1/4000000)*4*4*128 = 51.2 us or 19.5 khz (1/4000000)*4*16*128= 204.8 us or 0.48 khz

switch(selection) { case '1' : setup_timer_2(T2_DIV_BY_1, 127, 1); break; case '2' : setup_timer_2(T2_DIV_BY_4, 127, 1); break; case '3' : setup_timer_2(T2_DIV_BY_16, 127, 1); break; } setup_port_a(ALL_ANALOG); setup_adc(adc_clock_internal); set_adc_channel( 0 );

23

printf("%c\r\n",selection); while( TRUE ) { value=read_adc(); //value++; printf("%2X\r",value); set_pwm1_duty(value); //value may be an 8 or 16 bit constant or variable // // // // // // // // // // // // // } } This sets the time the pulse is high each cycle. We use the A/D input to make a easy demo. the high time will be: if value is LONG INT: value*(1/clock)*t2div if value is INT: value*4*(1/clock)*t2div for example a value of 30 and t2div of 1 the high time is 30us WARNING: A value too high or low will prevent the output from changing.

24

Bi 14 - Chng trnh hin th phm s ra n 7 on (khng dng interrupt)


Code: #include <16F877A.h> #fuses NOWDT, XT #fuses NOLVP // important #use delay(clock=4000000) #include <kbd.c> // in PICC\Drivers // 0 1 2 3 4 5 6 7 8 9 byte const DIGITS[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f }; /////////////////////////////////////////////////////////// /* private */void off_on_led_transistor() { output_low(PIN_D1); delay_ms(1); output_high(PIN_D1); } /////////////////////////////////////////////////////////// void display(int8 digit) { output_c(DIGITS[digit] ^ 0xff); off_on_led_transistor(); } /////////////////////////////////////////////////////////// int8 char_to_digit(char c) { return c & 0b00001111; // first 4 bits only } /////////////////////////////////////////////////////////// int1 digit_key_pressed(char key) { byte pattern; pattern = 0b00110000; return (key & pattern) == pattern; } /////////////////////////////////////////////////////////// /** * Echo digit-key presses (0 to 9) of a 4x3 keypad to the 7-segment LED * * Configuration: * Use PORTB for keypad by uncommenting the following line in PICC\Drivers\KBDD.c * #define use_portb_kbd TRUE * * Wiring: (TM Board) * (1) PIC's B1-B7 to Matrix Keypad's R3-R0&C2-C0 (notice the reverse order) * (2) PIC's C0-C6 to 7-segment LED's A-G * PIC's D1 to 7-segment LED's C2 */ void main() { int8 i, digit; char key; kbd_init(); while (true) { key = kbd_getc(); if (digit_key_pressed(key)) { digit = char_to_digit(key); for (i = 0; i < 200; i++) // repeat the display for human eyes display(digit); } } }

25

Bi 15 - Chng trnh hin th phm s ra n 7 on (DNG INTERRUPT)


#include <16F877A.h> #fuses NOWDT, XT #fuses NOLVP // important #use delay(clock=4000000) #include <kbd.c> // in PICC\Drivers // 0 1 2 3 4 5 6 7 8 9 byte const DIGITS[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f }; /////////////////////////////////////////////////////////// /* private */void off_on_led_transistor() { output_low(PIN_D1); delay_ms(1); output_high(PIN_D1); } /////////////////////////////////////////////////////////// void display(int8 digit) { output_c(DIGITS[digit] ^ 0xff); off_on_led_transistor(); } /////////////////////////////////////////////////////////// int8 char_to_digit(char c) { return c & 0b00001111; // first 4 bits only } /////////////////////////////////////////////////////////// int1 digit_key_pressed(char key) { byte pattern; pattern = 0b00110000; return (key & pattern) == pattern; } /////////////////////////////////////////////////////////// #INT_RB void RB_handler() { int8 i, digit; char key; key = kbd_getc(); if (digit_key_pressed(key)) { digit = char_to_digit(key); for (i = 0; i < 200; i++) // repeat the display for human eyes display(digit); } } /////////////////////////////////////////////////////////// /** * Echo digit-key presses (0 to 9) of a 4x3 keypad to the 7-segment LED * * Configuration: * Use PORTB for keypad by uncommenting the following line in PICC\Drivers\KBDD.c * #define use_portb_kbd TRUE * * Wiring: (TM Board) * (1) PIC's B1-B7 to Matrix Keypad's R3-R0&C2-C0 (notice the reverse order) * (2) PIC's C0-C6 to 7-segment LED's A-G * PIC's D1 to 7-segment LED's C2

26

*/ void main() { enable_interrupts(GLOBAL); enable_interrupts(INT_RB); kbd_init(); while (true) { // do nothing } }

27

Bi 16 - Tm hiu v LCD
LCD c tm hiu y l HD44780 ca hng Hitachi, gm 2 dng, mi dng 16 k t.

HD44780 c 14 chn, chc nng ca cc chn: 1. Cc chn VCC, VSS v VEE: Chn VCC_Cp dng ngun 5V, chn VCC_Ni t, chn VEE c dng iu khin tng phn ca mn hnh LCD. 2. Chn chn thanh ghi RS (Register Select): C hai thanh ghi rt quan trng bn trong LCD, chn RS c dng chn cc thanh ghi ny nh sau: Nu RS = 0 th thanh ghi m lnh c chn cho php ngi dng gi mt lnh chng hn nh xo mn hnh, a con tr v u dng, Nu RS = 1 th thanh ghi d liu c chn cho php ngi dng gi d liu cn hin th trn LCD. 3. Chn c/ghi R/W: u vo c/ghi cho php ngi dng ghi thng tin ln LCD khi R/W = 0 hoc c thng tin t n khi R/W = 1. 4. Chn cho php E (Enable): Chn cho php E c s dng bi LCD cht thng tin hin hu trn chn d liu ca n. Khi d liu c cp n chn d liu th mt xung mc cao xung thp phi c p n chn ny LCD cht d liu trn cc chn d liu. Xung ny phi rng ti thiu l 450ns. 5. Cc chn D0 - D7: y l 8 chn d liu 8 bt, c dng gi thng tin ln LCD hoc c ni dung ca cc thanh ghi trong LCD. hin th cc ch ci v cc con s, chng ta gi cc m ASCII ca cc ch ci t A n Z, a n f v cc con s t 0 - 9,... n cc chn ny khi bt RS = 1. Cng c cc m lnh m c th c gi n LCD xo mn hnh hoc a con tr v u dng hoc nhp nhy con tr. Di y l bng lit k cc m lnh: Chng ta cng s dng RS = 0 kim tra bt c bn xem LCD c sn sng nhn thng tin cha. C bn l D7 v c th c c khi R/W = 1 v RS = 0 nh sau: Nu R/W = 1, RS = 0 khi D7 = 1 (c bn 1) th LCD bn bi cc cng vic bn trong v s khng nhn bt k thng tin mi no. Khi D7 = 0 th LCD sn sng nhn thng tin mi. Lu chng ta nn kim tra c bn trc khi ghi bt k d liu no ln LCD. C th di chuyn con tr n v tr bt k trn mn hnh LCD bng cch np vo cc gi tr tng ng nh bng sau v gi yu cu n LCD:

28

Tham kho thm v LCD ti y: http://www.iaehv.nl/users/pouweha/lcd.htm

29

Bi 17 - Lp trnh cho LCD


C hai cch lp trnh cho LCD: dng 8bit interface (n gin) hoc 4bit interface (phc tp hn) 1. 8bit interface Code: /* LCD thc thi cc lnh iu khin:*/ RS = 0; R/W = 0; E= 1; E= 0; //chn thanh ghi lnh //ghi d liu, R/W = 1;//c d liu //a chn E ln mc cao //to sn xung cht d liu

/* LCD thc thi cc lnh hin th:*/ RS = 1; R/W = 0; E = 1; E = 0; //chn thanh ghi d liu //ghi d liu //a chn E ln mc cao //to sn xung cht d liu

S dng 8 chn D0 - D7 truyn thng tin, d liu n LCD. - iu khin LCD (Chn ch LCD, bt/tt hin th, bt/tt/nhp nhy/di chuyn con tr,...): Nhp gi tr tng ng vo D0-D7 ri gi lnh yu cu LCD thc thi lnh iu khin, tip theo cho LCD thi gian tr thc thi (hoc hi c bn xem LCD sn sng thc hin lnh tip theo cha?) - hin th d liu ln LCD:Nhp d liu cn hin th vo D0-D7 ri gi lnh yu cu LCD thc thi lnh hin th d liu, tip theo cho LCD thi gian tr thc thi (hoc hi c bn xem LCD sn sng thc hin lnh tip theo cha?) y l mch nguyn l kt ni LCD dng 8 chn interface vi PIC16F877A qua PORTB: 2. 4bit interface S dng 4 chn D4 - D7 (hoc D0-D3 <- t dng) truyn thng tin, d liu n LCD. - iu khin LCD (Chn ch LCD, bt/tt hin th, bt/tt/nhp nhy/di chuyn con tr,...): Nhp gi tr tng ng vo D0-D7,ly gi tr 4bit cao D4-D7 ri gi lnh yu cu LCD thc thi lnh iu khin, tip theo cho LCD thi gian tr thc thi (hoc hi c bn xem LCD sn sng thc hin lnh tip theo cha?).Tip tc, gi 4bit thp D0-D3 ri gi lnh yu cu LCD thc thi lnh iu khin, tip theo cho LCD thi gian tr thc thi (hoc hi c bn xem LCD sn sng thc hin lnh tip theo cha?) - hin th d liu ln LCD:Cng lm tng t trn nhng thay yu cu LCD iu khin bng yu cu LCD hin th. y l mch nguyn l kt ni LCD dng 4 chn interface vi PIC16F877A qua PORTB: ??? Nu trong ng dng s dng ngt ngoi th c th chuyn sang ni vi PORTD hoc ty thch.

30

Bi 18 - Tnh ton timer0 v cc thit lp lin quan cho PIC18F4550


1. Tnh ton tng qut Tnh set_timer0(initialVALUE) Tnh th = Nu fXTAL tnh bng MHz th Tnh th T suy ra cng thc: preScaler * (256-initialVALUE) *4 fXTAL [Hz] tnh bng s Tnh th * fXTAL 4 * preScaler [s]
th

v InitialValue (gi tr thit lp ban u cho timer0 - lnh

initialVALUE = 256 -

V d: ... #use delay(clock=4000000) // fXTAL = 4 MHz ... void main() { enable_interrupts(int_timer0); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); // preScaler = 2 enable_interrupts(global); set_timer0(6); // initialVALUE = 6 ... } C th: cn tnh initialVALUE vi fXTAL = 4 MHz, preScaler = 2, nh thi 500 s 256 - (500*4)/(4*2) = 256 - 250 = 6 2. Cc thit lp ban u cho PIC18F4550 c gii thch thng qua on chng trnh mu: #include <18f4550.h> #fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,PLL3,CPUDIV1,VREGEN #device *=16 ADC=8 #use delay(clock=48000000) // thch anh lp vo mch l 12MHz HSPLL, has a different meaning, than HSPLL on most other chips. When selected, it means 'use the USB PLL circuit'. This takes a 4MHz frequency, and multiplies it to generate 96MHz. Now the frequency fed into this circuit is determined by the PLL prescaler, which is set by the 'PLL3' fuse, to be /3. So these two fuses together, mean take the incoming clock, divide it by 3, then multiply it up to give 96MHz! PLL3 l lin quan n thch anh cng 12MHz cp 12/3=4MHz cho b nhn tn; CPUDIV1 c ngha l chia 2 96/2=48MHz cp clock cho CPU. Tnh ton timer0 cho PIC18F4550, c 1 s khc bit so vi PIC16F:

Timer 0 (AKA RTCC) returns a 8 bit int except on the PIC18XXX where it returns a 16 bit int.
Ngha l timer0 PIC18F4550 c 2 ch : 8 bit v 16 bit. Ta c cc lnh tng ng: setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_1|RTCC_8_BIT); Cng thc tnh nh c: Tnh th * fXTAL initialVALUE = 256 4 * preScaler setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); Cng thc tnh

Tnh th * fXTAL 4 * preScaler Nh vy nu khng ch ra RTCC_8_BIT th mc nh l ch 16 bit. initialVALUE = 65536 Tham kho: Timer c nhiu kiu chia tn, dng chia trc v sau (prescale v postscale) l chia trc v chia sau, c nhiu cch t t l cho Timer t 1:1 - 1:256 tc l cch chia ny gip cho ta nhn c xung kch vo Timer s c chm i n ln ( 1:n ) so vi 1Tcy (Fosc/4), v nh vy ta s c xung kich chm hn: setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4); // 4Mhz => dng dao ng ni, ch prescal 1:4 =>

31

clock cho Timer0 la Fosc/4/4 = Fosc/16. Khi ny ta c Fosc/4 => Tcy = 1us. Ttimer0 = Fosc/16 => 4us Timer0 trn 8 bit => 4x8bit = 1024us. 8 bit c 256 trng thi ch khng phi 255 trng thi, do x256, Cn cch th 2 Postscale (Only Timer2) th n s m s ln trn ca Timer2, Ngha l 1:2 - 2 ln trn cho ra 1 ln xung ..... 1:16 - 16 ln Timer2 trn gi s p dng vi Timer2 thay Timer0 trn v vi postscale 1:8 ta s thu c u ra l : 4x256x8 = 8192 us

32

Bi 19 - S dng timer0 lm delay


Phi hp set preScale v get_timer0() vi mc nh set_timer0(0).

33

Filename: CCS_.doc Directory: D:\Eletrik\CCS\DOC Template: C:\Documents and Settings\Lance Lord\Application Data\Microsoft\Templates\Normal.dotm Title: Subject: Author: Do Tien Dzung Keywords: Comments: Creation Date: 7/6/2011 2:59:00 PM Change Number: 2 Last Saved On: 7/6/2011 2:59:00 PM Last Saved By: Lance Lord Total Editing Time: 0 Minutes Last Printed On: 7/6/2011 3:10:00 PM As of Last Complete Printing Number of Pages: 33 Number of Words: 5,925 (approx.) Number of Characters: 33,778 (approx.)

You might also like