Bài 02
CCS C COMPILER
1
1. Hướng dẫn sử dụng chương trình CCS:
Cài đặt trình biên dịch C dùng phần mềm CCS:
Cửa sổ CCS:
2
Tạo mới một source file: File->Source file (hoặc dùng project Wizard
như hướng dẫn trong giáo trình)
1. Chọn thư mục lưu trữ source file
2. Đặt tên file
3. Lưu file
3
Biên dịch chương trình tạo file *.HEX dùng Compile hoặc Rebuild
4. Chọn Device PIC16F877A và PCM 14 bit
Cửa sổ soạn thảo nội
dung chương trình
Cửa sổ thông báo lỗi và
cảnh báo khi biên dịch
chương trình
4
Sử dụng HELP của CCS: chứa tất cả các trợ giúp sử dụng cho các
khai báo và các hàm trong CCS dùng cho PIC
1. Click chuột trái vào biểu tượng HELP ở
góc trên bên phải cửa sổ CCS
2. Chọn Contents hoặc Index
5
Sử dụng HELP của CCS
3. Nhập vào nội dung cần tìm
Hướng dẫn sử dụng
Ví dụ
Các nội dung liên quan
6
2. Các thành phần chính của source file:
Các khai báo chính của chương trình:
#include <16F877A.h>
// No WatchDog, High Speed, No Power Up Timer, No Low Voltage Programming
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=8M) // Tần số thạch anh dùng trong hệ thống
Các định nghĩa và biến toàn cục
#Define
LED
PIN_D0
#BYTE
TMP
25
CONST unsigned char a[10] = {0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};
unsigned char Time;
Chương trình con và ngắt (Interrupt)
Void Quet_LED ( )
{
// Nội dung
}
Chương trình chính
Void main( )
{
// Nội dung
}
7
Chương trình chính chi tiết
Void main( )
{
/* 1. Khai báo biến cục bộ: là các biến chỉ dùng trong chương trình chính, không dùng
được trong chương trình con*/
unsigned char i,j;
Int temperature;
// 2. Cấu hình thiết bị và ngắt (interrupt)
//============================================
//setup_adc(ADC_CLOCK_INTERNAL);
//setup_adc_ports( ALL_ANALOG );
//============================================
enable_interrupts(GLOBAL);
enable_interrupts(INT_RTCC);
setup_timer_0(RTCC_8_BIT);
// 3. Vòng lặp vô hạn để thực hiện nội dung chương trình
While (TRUE) // hoặc while (1)
{
// Nội dung chính của chương trình
}
}
8
3. Biến chương trình:
Kiểu biến
Giá trị
Ý nghĩa
int1
True hay False ( 0 hay 1)
int8
0 đến 255
int16
0 đến 65,535
Số nguyên 2 byte
int32
0 đến 4,294,967,295
Số nguyên 4 byte
Char
-128 đến 127
Float
3,4
đế 3,4
số 1 bit
Số nguyên 1 byte ( 8 bit)
Ký tự 8 bit
Số thực 32 bit
short
Mặc định như kiểu int1
Byte
Mặc định như kiểu int8
Int
Mặc định như kiểu int8
Long
Mặc định như kiểu int16
Lưu ý: có thể sử dụng signed hoặc unsigned trước các kiểu để chỉ cho
trường hợp có dấu và không có dấu.
9
Ví dụ:
unsigned char a, i, j;
float set, temp;
CONST int8 a[3] = {2, 7, 0x7a};
unsigned int16 tmp1, tmp2;
char kitu;
- Dịch trái n bit biến a: a = a << n
- Dịch phải n bit biến a: a = a >> n
(Xem thêm trong HELP: operators)
* Các điều kiện logic:
- AND (&&)
* Các phép toán trong CCS:
- OR ( || )
- Cộng (+)
- EQUAL (==)
- Trừ (-)
- Phủ định (!)
- Nhân (*)
- Chia (/)
* Các định nghĩa trong CCS:
- Chia lấy phần dư (%)
- #define
LED
- Đảo (~)
- #byte
SET = 100
- Phép toán logic: AND (&); OR( | )
- #bit
SW1 = 0x86.0 // RB0
PIN_D0
10
4. Các hàm thông dụng trong CCS:
a) Hàm delay: liên quan đến #use delay(clock = tần số thạch anh)
- delay_ms(giá trị 2 byte)
Ví dụ:
1.
delay_ms(1000): trì hoãn 1000 ms
2.
delay_ms(200): trì hoãn 200 ms
- delay_us(giá trị 2 byte)
Ví dụ:
1.
delay_us(10): trì hoãn 10 μs
2.
delay_us(5): trì hoãn 5 μ s
- delay_cycles(giá trị 2 byte)
Ví dụ:
delay_cycles(1): trì hoãn 1 xung clock = 1/(fXTAL/4 )
11
b) Hàm I/O: xuất/ nhập một giá trị ra/ từ PIN (bit) hoặc PORT (byte)
-
set_tris_x(byte)
Trong đó:
x: a, b, c, d, e
Byte: xác định ngõ vào hoặc ngõ ra cho các tín hiệu của một PORT
bit = 1: tín hiệu tương ứng là ngõ vào
bit = 0: tín hiệu tương ứng là ngõ ra
Ví dụ: cấu hình PORT D với RD0 và RD1 là ngõ vào, RD7 đến RD2 là ngõ
ra
Set_tris_d(0x03);// 0x03 = 00000011b
Hoặc: cấu hình RC7-RC4 là ngõ vào, RC3-RC0 là ngõ ra
Set_tris_c(11110000b);
12
- output_high(PIN)
Ví dụ:
Output_high(PIN_C0); // RC0 = 1
- output_low(PIN)
Ví dụ:
Output_low(PIN_D0); // RD0 = 0
- output_toggle(PIN)
Ví dụ:
Output_toggle(PIN_C4); // RC4 = ~RC4
- output_x(byte): x là a, b, c,d, hoặc e (port a, b, c,d, hoặc e)
Ví dụ:
Output_d(0xc0); // PORTD = C0H
13
- input(PIN)
Ví dụ 1:
State = input(PIN_E0); // State là biến nhị phân (int1 State)
Ví dụ 2:
#define SW1
PIN_D4
#define LED
PIN_C1
………….
If (!input(SW1))
{ output_toggle(LED); delay_ms(300);}
- input_x(): x là a, b, c,d, hoặc e (port a, b, c,d, hoặc e)
Ví dụ:
Unsigned char a;
a = input_d(); // đọc 1 byte từ port d và gán vào a
14
c) Hàm truy xuất bộ nhớ EEPROM: ghi/ đọc nhớ
-
Write_eeprom(address, value)
Trong đó:
address: địa chỉ vùng nhớ EEPROM (0 – 255)
Value: giá trị 8 bit cần ghi vào bộ nhớ
Ví dụ:
Write_eeprom(15,147);// ghi giá trị 247 vào eeprom tại địa chỉ 15
-
Read_eeprom(address)
Trong đó:
address: địa chỉ vùng nhớ EEPROM (0 – 255)
Ví dụ:
Int8 a;
a = read_eeprom(15);
15
5. Các cấu trúc điều kiện thông dụng:
a) IF:
If (biểu thức điều kiện)
{ khối lệnh 1;}
Else
{khối lệnh 2;}
Ví dụ 1:
If ((a==1)&&(b==2))
{ c = a+b; a++;}
Else {c = 0; b++;}
Ví dụ 2:
If (!input(PIN_C0)||!input(PIN_C1)) output_low(PIN_D2);
Else output_high(PIN_D2);
16
b) SWITCH:
switch (biểu thức )
Ví dụ:
{
Int8 a;
case giá trị 1: lệnh 1;
a = input_d();
break;
case giá trị 2: lệnh 2;
break;
…
{
case 0: {output_high(PIN_C0);
break;}
case 5: {output_high(PIN_C1);
case giá trị n: lệnh n;
break;
Default:
Switch(a)
lệnh;
break;}
break;}
case 9: {output_high(PIN_C2);
break;}
default: {output_c(0x00);
break;}
17
c) WHILE:
while (điều kiện )
Ví dụ 1:
{
Int8 i;
Khối lệnh;
CONST a[4] = {0x00, 0xff, 0x00, 0xff};
}
i=4;
while(i>0)
{output_d(a[i-1]);
Delay_ms(100);
i--;}
Ví dụ 2:
While(1)
{output_toggle(PIN_D4); delay_ms(300);}
18
d) FOR:
for (biểu thức 1; điều kiện; biểu thức 2)
{
Khối lệnh;
}
Ví dụ 1:
CONST a[4] = {0x00, 0xff, 0x00, 0xff};
For (int8 i = 0; i<4; i++)
{ouput_d(a[i]);
Delay_ms(100);
}
19
6. Các ứng dụng cơ bản: LED đơn, LED 7 đoạn, Text LCD, phím
nhấn đơn
VDD
4.7uF - 10uF
VDD
R1
10K
a) LED đơn
C2
1uF
2
3
4
5
6
7
PIC16F877A
31
32
MCLR/Vpp
GND
1
VCC
U2
C3
RA0/AN0
RA1/AN1
RA2/AN2/Vref RA3/AN3/Vref +
RA4/TOCKI
RA5/AN4/SS
RB7/PGD
RB6/PGC
RB5
RB4
RB3/PGM
RB2
RB1
RB0/INT
40
39
38
37
36
35
34
33
ICSPDAT
ICSPCLK
C6 33P
13
OSC1/CLKIN
RE0/RD/AN5
RE1/WR/AN6
RE2/CS/AN7
Y1
14
GND
RC0/T1OSO/T1CKI
RC1/T1OSI/CCP2
RC2/CCP1
RC3/SCL
RC4/SDA
RC5/SDO
RC6/TX/CK
RC7/RX/DT
RD7/PSP7
RD6/PSP6
RD5/PSP5
RD4/PSP4
RD3/PSP3
RD2/PSP2
RD1/PSP1
RD0/PSP0
12
15
16
17
18
23
24
25
26
VCC
C11 33P
8
9
10
OSC2/CLKO
8M
11
RESET
RST
30
29
28
27
22
21
20
19
R10
R11
270
270
D1
D2
LED
LED
VDD
J1
6
5
4
3
2
1
JTAG
VDD
ICSPCLK
ICSPDAT
VDD
RST
20
YÊU CẦU:
1. Viết chương trình điều khiển LED D1 chớp tắt vô hạn lần, thời
gian delay là 300 ms.
Hướng dẫn:
#include <16F877A.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=8M) // Tần số thạch anh dùng trong hệ thống
#define
D1
PIN_D3
//-------CHƯƠNG TRÌNH CHÍNH--------Void main()
{
While(1)
{output_toggle(D1); delay_ms(300);}
}
21
YÊU CẦU:
2. Viết chương trình điều khiển LED D2 sáng 500 ms và tắt 100 ms
lặp lại vô hạn lần.
Hướng dẫn:
#include <16F877A.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=8M) // Tần số thạch anh dùng trong hệ thống
#define
D2
PIN_D7
//-------CHƯƠNG TRÌNH CHÍNH--------Void main()
{
While(1)
{output_low(D2); delay_ms(500);
Output_high(D2); delay_ms(100);}
}
22
YÊU CẦU:
3. Viết chương trình điều khiển LED D2 sáng/tắt (nhấp nháy) với
thời gian delay 500 ms, lặp lại 10 lần.
Hướng dẫn:
#include <16F877A.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=8M) // Tần số thạch anh dùng trong hệ thống
#define
D2
PIN_D7
//-------CHƯƠNG TRÌNH CHÍNH--------Void main()
{
For (int8 i = 0; i <20; i++)
{output_toggle(D2); delay_ms(500);}
While(1) ;
}
23
b) LED 7s
VDD
4.7uF - 10uF
VDD
R1
10K
C2
C6 33P
OSC1/CLKIN
RE0/RD/AN5
RE1/WR/AN6
RE2/CS/AN7
Y1
15
16
17
18
23
24
25
26
R9 4K7
Q1
R10 4K7
R11 4K7
Q2
A1013
LED4
A1013
LED7S
a
b
c
d
e
f
g
p
R12 4K7
Q4
A1013
RC0/T1OSO/T1CKI
RC1/T1OSI/CCP2
RC2/CCP1
RC3/SCL
RC4/SDA
RC5/SDO
RC6/TX/CK
RC7/RX/DT
RD7/PSP7
RD6/PSP6
RD5/PSP5
RD4/PSP4
RD3/PSP3
RD2/PSP2
RD1/PSP1
RD0/PSP0
30
29
28
27
22
21
20
19
VDD
24
C2
7
6
4
2
1
9
10
5
C1
a
b
c
d
e
f
g
p
3
C1
Q3
C2
LED7S
a
b
c
d
e
f
g
p
3
C2
7
6
4
2
1
9
10
5
8
LED3
a
b
c
d
e
f
g
p
LED7S
C1
a
b
c
d
e
f
g
p
8
7
6
4
2
1
9
10
5
3
a
b
c
d
e
f
g
p
8
LED2
LED7S
VCC
GND
C11 33P
a
b
c
d
e
f
g
p
A1013
OSC2/CLKO
VCC
14
8M
8
9
10
LED1
a 7
b 6
c
4
d 2
e 1
f
9
g 10
p 5
12
13
R1
R2
R3
R4
R5
R
R6
R
R7
R
R8
R
R
R
R
100X8
C2
40
39
38
37
36
35
34
33
C1
RA0/AN0
RA1/AN1
RA2/AN2/Vref RA3/AN3/Vref +
RA4/TOCKI
RA5/AN4/SS
RB7/PGD
RB6/PGC
RB5
RB4
RB3/PGM
RB2
RB1
RB0/INT
8
2
3
4
5
6
7
PIC16F877A
3
1uF
31
32
MCLR/Vpp
GND
1
VCC
U2
C3
11
RESET
RST
YÊU CẦU:
1. Viết chương trình hiển thị số 1 trên LED 4.
Hướng dẫn:
#include <16F877A.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=8M) // Tần số thạch anh dùng trong hệ thống
//-------CHƯƠNG TRÌNH CHÍNH--------Void main()
{
Output_d(0xFF);// tắt các led
Output_b(0x9F);
Output_low(PIN_D0);
While(1);// STOP
}
25