Hướng dẫn sử dụng chương trình CCS: 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 // No WatchDog, High Speed, No Power Up Timer, No Low Voltage
Trang 1Bài 02
CCS C COMPILER
Trang 2 Cài đặt trình biên dịch C dùng phần mềm CCS:
Cửa sổ CCS:
1 Hướng dẫn sử dụng chương trình CCS:
2
Trang 3 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
Trang 4Biê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
Trang 5 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
Trang 72 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
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)
Trang 8Chươ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;
// 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
}
Trang 93 Biến chương trình:
int1 True hay False ( 0 hay 1) số 1 bit
int8 0 đến 255 Số nguyên 1 byte ( 8 bit)
int16 0 đến 65,535 Số nguyên 2 byte
int32 0 đến 4,294,967,295 Số nguyên 4 byte
Float 3,4 đế 3,4 Số thực 32 bit
Lưu ý: có thể sử dụng signed hoặc unsigned trước các kiểu để chỉ cho
Trang 10Ví dụ:
unsigned char a, i, j;
float set, temp;
CONST int8 a[3] = {2, 7, 0x7a};
- Phép toán logic: AND (&); OR( | )
- 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:
Trang 12b) Hàm I/O: xuất/ nhập một giá trị ra/ từ PIN (bit) hoặc PORT (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àobit = 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
Trang 14- input_x(): x là a, b, c,d, hoặc e (port a, b, c,d, hoặc e)
Trang 15c) Hàm truy xuất bộ nhớ EEPROM: ghi/ đọc nhớ
Trong đó:
address: địa chỉ vùng nhớ EEPROM (0 – 255)
Value: giá trị 8 bit cần ghi vào bộ nhớ
Trang 165 Các cấu trúc điều kiện thông dụng:
Trang 18i ;}
Ví dụ 2:
While(1){output_toggle(PIN_D4); delay_ms(300);}
18
Trang 206 Các ứng dụng cơ bản: LED đơn, LED 7 đoạn, Text LCD, phím
nhấn đơn
a) LED đơn
D2 LED ICSPCLK
VDD J1
JTAG
1 2 3 4 5 6
R1 10K C3 1uF
R11 270
RST
U2 PIC16F877A
1
2 3 4 5 6 7
8 9 10
13
14
15 16 17 18
19 20 21 22 23
24 25 26
27 28 29 30
33 34 35 36 37 38 39 40
MCLR/Vpp
RA0/AN0 RA1/AN1 RA2/AN2/Vref - RA3/AN3/Vref + RA4/TOCKI RA5/AN4/SS
RE0/RD/AN5 RE1/WR/AN6 RE2/CS/AN7
RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCL
RD0/PSP0 RD1/PSP1 RD2/PSP2 RD3/PSP3 RC4/SDA
RC5/SDO RC6/TX/CK RC7/RX/DT
RD4/PSP4 RD5/PSP5 RD6/PSP6 RD7/PSP7
Y 1 8M
RST
VDD
C2 4.7uF - 10uF
ICSPDAT
R10 270
VDD
ICSPDAT
VDD VDD
20
Trang 21#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=8M) // Tần số thạch anh dùng trong hệ thống
Trang 22#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=8M) // Tần số thạch anh dùng trong hệ thống
Trang 23YÊ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
Trang 24b) LED 7s
g R4
R
e
C2 4.7uF - 10uF
8 9 10
13
14
15 16 17 18
19 20 21 22 23
24 25 26
27 28 29 30
33 34 35 36 37 38 39 40
MCLR/Vpp
RA0/AN0 RA1/AN1 RA2/AN2/Vref - RA3/AN3/Vref + RA4/TOCKI RA5/AN4/SS
RE0/RD/AN5 RE1/WR/AN6 RE2/CS/AN7
RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCL
RD0/PSP0 RD1/PSP1 RD2/PSP2 RD3/PSP3 RC4/SDA
RC5/SDO RC6/TX/CK RC7/RX/DT
RD4/PSP4 RD5/PSP5 RD6/PSP6 RD7/PSP7
b
C6 33P
LED2 LED7S
7 6 4 2 1 9 10 5
a b c d e f g
p C C
b
LED1 LED7S
7 6 4 2 1 9 10 5
a b c d e f g
p C C
a
R7 R
VDD
a d
LED3 LED7S
7 6 4 2 1 9 10 5
a b c d e f g
p C C
d R3
R
c
f g b
Y 1 8M
c
LED4 LED7S
7 6 4 2 1 9 10 5
a b c d e f g
p C C
f p R6
R
a a
R11 4K7 c
Q1 A1013
R5 R
g
Q4 A1013
RST
b
24
Trang 25YÊ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
Trang 26YÊU CẦU:
2 Viết chương trình hiển thị số chữ “HELP” trên 4 led, sử dụng
delay 5 ms để quét led
Hướng dẫn: cách 01
#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
26
Trang 27Hướng dẫn: cách 02
#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
int8 data_led7[4] = {“H”7s, “E”7s, “L”7s, “P”7s };
int8 control_led7[4] = {0xF7, 0xFB, 0xFD,0xFE};
Void quet_LED()
{ for (int8 i = 0; i < 4; i++)
{output_d(0xFF); output_b(data_led7[i]); output_d(control_led7[i]); delay_ms(5);}
}
Trang 28YÊU CẦU:
3 Viết chương trình hiển thị số tăng dần từ 0-9 và dừng lại trên LED
1; thời gian delay 500 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
28
Trang 29c) LCD (Liquid Crystal Display)
R4 5/3W
U2 PIC16F877A
1
2 3 4 5 6 7
8 9 10
11 12
13
14
15 16 17 18
19 20 21
22 23
24 25 26
27 28 29 30
33 34 35 36 37 38 39
40
MCLR/Vpp
RA0/AN0 RA1/AN1 RA2/AN2/Vref - RA3/AN3/Vref + RA4/TOCKI RA5/AN4/SS
RE0/RD/AN5 RE1/WR/AN6 RE2/CS/AN7
RD0/PSP0 RD1/PSP1 RD2/PSP2
RD3/PSP3 RC4/SDA
RC5/SDO RC6/TX/CK RC7/RX/DT
RD4/PSP4 RD5/PSP5 RD6/PSP6 RD7/PSP7
R6 4K7
Trang 30- Khởi động LCD và đặt trạng thái PORTD = 0x00
lcd_init();
set_tris_d(0x00);
output_d(0x00);
- Dùng hàm lcd_gotoxy để chuyển con trỏ và hàm printf để xuất chuỗi ra LCD.
YÊU CẦU:
1 Viết chương trình hiển thị chữ: “Welcome to” và
“*****HUTECH*****” trên dòng 01 và 02 của LCD
Trang 32YÊU CẦU:
2 Viết chương trình hiển thị chữ: “Counter:” trên dòng 1 và số đếm từ 00
– 99 trên dòng 2 từ tọa độ (x,y) = (10,2); thời gian delay để tăng số đếm là
Trang 34c) Phím nhấn
D1 LED
R24 270
VDD VDD
VDD
R22 10K
RST
VDD
R1 10K
R21 10K
C3 1uF
U2 PIC16F877A
1
2 3 4 5 6 7
8 9 10
13
14
15 16 17 18
19 20 21
22 23
24 25 26
27 28 29 30
33 34 35 36 37 38 39
40
MCLR/Vpp
RA0/AN0 RA1/AN1 RA2/AN2/Vref - RA3/AN3/Vref + RA4/TOCKI RA5/AN4/SS
RE0/RD/AN5 RE1/WR/AN6 RE2/CS/AN7
RD0/PSP0 RD1/PSP1 RD2/PSP2
RD3/PSP3 RC4/SDA
RC5/SDO RC6/TX/CK RC7/RX/DT
RD4/PSP4 RD5/PSP5 RD6/PSP6 RD7/PSP7
C11 33P
C6 33P
R23 270
VDD
D2 LED
Y 1 8M
C2 4.7uF - 10uF
34
Trang 36if(!input(SW2)) output_low(D1);
}
Trang 37YÊU CẦU:
2 Viết chương trình điều khiển:
Trang 38}//end main
38
Trang 39}//end main
Trang 40BÀI TẬP
c R4
7 6 4 2 1 9 10 5
a b c d e f g
p C C
R32 270X8
d
U2 PIC16F877A
1
2 3 4 5 6 7
8 9 10
13
14
15 16 17 18
19 20 21 22 23
24 25 26
27 28 29 30
33 34 35 36 37 38 39 40
MCLR/Vpp
RA0/AN0 RA1/AN1 RA2/AN2/Vref - RA3/AN3/Vref + RA4/TOCKI RA5/AN4/SS
RE0/RD/AN5 RE1/WR/AN6 RE2/CS/AN7
RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCL
RD0/PSP0 RD1/PSP1 RD2/PSP2 RD3/PSP3 RC4/SDA
RC5/SDO RC6/TX/CK RC7/RX/DT
RD4/PSP4 RD5/PSP5 RD6/PSP6 RD7/PSP7
RST
Q4 A1013
D5
R8 100X8
c f a
C2 4.7uF - 10uF
e
D7
R12 4K7 a
D6 e
R25
LED3 LED7S
7 6 4 2 1 9 10 5
a b c d e f g
7 6 4 2 1 9 10 5
a b c d e f g
p C C
b R2
f c
R26
R6 R
g f
7 6 4 2 1 9 10 5
a b c d e f g
Q1 A1013
D8
R9 4K7
a
R7 R
VDD
b R5
Cho sơ đồ mạch:
40
Trang 41(D1,D8), lặp lại vô hạn lần; delay 200 ms.
delay 3 ms
5 ms
đồng thời hiển thị số lần trên LED 7 đoạn 4; delay 500 ms
Trang 42BÀI TẬP
Cho sơ đồ mạch:
Q2 A1013 LMP
R1 10K
U2 PIC16F877A
1
2 3 4 5 6 7
8 9 10
13
14
15 16 17 18
19 20 21 22 23
24 25 26
27 28 29 30
33 34 35 36 37 38 39 40
MCLR/Vpp
RA0/AN0 RA1/AN1 RA2/AN2/Vref - RA3/AN3/Vref + RA4/TOCKI RA5/AN4/SS
RE0/RD/AN5 RE1/WR/AN6 RE2/CS/AN7
RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCL
RD0/PSP0 RD1/PSP1 RD2/PSP2 RD3/PSP3 RC4/SDA
RC5/SDO RC6/TX/CK RC7/RX/DT
RD4/PSP4 RD5/PSP5 RD6/PSP6 RD7/PSP7
R22 10K
42
Trang 43BÀI TẬP
7 Viết chương trình thực hiện:
(1,1)
8 Viết chương trình thực hiện: hiển thị chữ “Set value:” trên dòng 1 tại (x,y) = (5,1) và hiển thị biến set_val (khởi động = 0) trên dòng 2 tại (x,y) = (8,2); và nếu:
Nội dung thay đổi của set_val được cập nhật tức thời trên dòng 2 LCD tại vị trí (x,y) = (8,2)
Trang 4410 Viết chương trình thực hiện: hiển thị chữ “DONG HO” trên dòng 1 tại (4,1)
và hiển thị “giờ:phút:giây” tại (6,2); thời gian bắt đầu là “00:00:00” và nếu:
44
Trang 45BÀI TẬP
11 Viết chương trình hiển thị các LED đơn sáng dần từ D1 đến D8, delay 250
ms, lặp lại 8 lần, sau đó tắt dần từ D1 đến D8, delay 300 ms, lặp lại 20 lần
12 Viết chương trình hiển thị các LED đơn sáng dần từ D8 đến D1, delay 450
ms, sau đó tắt dần từ D8 đến D1, delay 500 ms, lặp lại hai quá trình trên 10 lần
BT* Viết chương trình hiển thị led đơn sáng dần từ D1 đến D8, thời gian delay
250 ms (dùng Timer 0) Lặp lại quá trình 17 lần
Trang 46BÀI TẬP
Cho sơ đồ mạch:
R3 R 0
Y1 8M
7
R7 R
E
R6 R
RST
R4 R
VDD
B
C6 33P
R14 10K
C2 4.7uF - 10uF
6
R1 10K 8
C11 33P
R13 10K
R5 R C
VDD
R16 10K
R8 270X8
4
R1 R
VDD
R15 10K
LED1 LED7S
7 6 4 2 1 9 10 5
a b c d e f g
p C C
U2 PIC16F877A
1
2 3 4 5 6 7
8 9 10
13
14
15 16 17 18
19 20 21 22 23
24 25 26
27 28 29 30
33 34 35 36 37 38 39 40
MCLR/Vpp
RA0/AN0 RA1/AN1 RA2/AN2/Vref - RA3/AN3/Vref + RA4/TOCKI RA5/AN4/SS
RE0/RD/AN5 RE1/WR/AN6 RE2/CS/AN7
RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCL
RD0/PSP0 RD1/PSP1 RD2/PSP2 RD3/PSP3 RC4/SDA
RC5/SDO RC6/TX/CK RC7/RX/DT
RD4/PSP4 RD5/PSP5 RD6/PSP6 RD7/PSP7
F
46