Professional Documents
Culture Documents
3
TẬP LỆNH
& Firma convenzione
Politecnico di Milano e Veneranda Fabbrica
Xử lý (Process)
Dữ liệu ra (Output)
Kiểu tiêu chuẩn của C Kiểu mặc định của trình biên dịch CCS
short int1
char unsigned int8
int int8
long int16
long long int32
float float32
double Không có
Các phép toán 7
Ví dụ:
int a = 10, b = 20;
Max = (a>b)?a:b; à max = b = 20
Min = (a<b)?a:b; à min = a = 10
11
Toán tử chuyển kiểu
Dùng để chuyển một kiểu dữ liệu bất kỳ sang một kiểu dữ liệu
mong muốn
Cú pháp: <kiểu>biến
Ví dụ:
int a = 9, b = 2;
int c = a/b; à c = 4
float d = (float)a/b; à d = 4.5
12
Cấu trúc điều kiện – Lệnh if
Quyết định sẽ thực hiện hay không một lệnh/khối lệnh
if (biểu thức luận lý) if (biểu thức luận lý) if (b.thức luận lý 1)
{ { khối lệnh 1; } { khối lệnh 1; }
khối lệnh; else elseif (b.thức luận lý 2)
} { khối lệnh 2; } { khối lệnh 2; }
…
Vào Vào
elseif (b.thức luận lý n-1)
Sai Điều kiện
Sai { khối lệnh n-1; }
Điều kiện
Đúng Đúng else
Khối lệnh Khối lệnh 1 Khối lệnh 2 { khối lệnh n; }
Ra Ra
13
Cấu trúc điều kiện – Lệnh switch
Tương tự như lệnh if
switch (biểu thức) ü Biểu thức phải là kết quả có giá trị
{ nguyên (char, int, long…)
case giá trị 1: khối lệnh 1; ü Nếu khối lệnh từ 2 lệnh trở lên thì
break; đặt trong dấu { }
case giá trị 2: khối lệnh 2; ü Các từ khóa switch, case, break
break; phải viết bằng chữ thường
……………. ü Sau lệnh i, nếu không có lệnh
case giá trị n: khối lệnh n; break thì chương trình thực hiện
lệnh i+1. Nếu có thì thoát ra ngoài
break;
} ü Sau lệnh switch không có dấu ;
14
Cấu trúc điều kiện – Lệnh switch
Vào
Không
break;
Đúng
Giá trị = 2? Lệnh/khối lệnh 2
case giá trị 2: khối lệnh 2;
Có
break; break?
Sai
……………. Không
Đúng
case giá trị n: khối lệnh n; Giá trị = n? Lệnh/khối lệnh n
break; Có
break?
Sai
} Không
Ra
15
Cấu trúc điều kiện – Lệnh switch
switch (biểu thức) ü Biểu thức phải là kết quả có giá trị nguyên
{ (char, int, long…)
case giá trị 1: khối lệnh 1; ü Nếu khối lệnh từ 2 lệnh trở lên thì đặt trong
dấu { }
break;
ü Các từ khóa switch, case, break phải viết
case giá trị 2: khối lệnh 2;
bằng chữ thường
break;
ü Sau lệnh i, nếu không có lệnh break thì
……………. chương trình thực hiện lệnh i+1. Nếu có thì
case giá trị n: khối lệnh n; thoát ra ngoài
break; ü Sau lệnh switch không có dấu ;
default: khối lệnh n+1; ü Nếu giá trị biểu thức không trùng với bất
break; cứ giá trị i nào thì lệnh tương ứng với từ
khóa default sẽ được thực hiện
}
16
Cấu trúc điều kiện – Lệnh switch
Vào
switch (biểu thức)
Đúng
{ switch (biểu thức) Giá trị = 1? Lệnh/khối lệnh 1
break; Có
break?
Sai
……………. Không
Đúng
case giá trị n: khối lệnh n; Giá trị = n? Lệnh/khối lệnh n
break; Có
break?
Sai
default: khối lệnh n+1; Không
int main()
{
for (g.trị bắt đầu ; điều kiện kết thúc ; thay đổi giá trị) int i;
{ for (i = 1; i <= 10; i++)
{
khối lệnh; printf("%-5d", i);
}
} }
Thay đổi biến điều khiển từ 1
đến 100, mỗi lần tăng 1:
ü Nếu điều kiện để kết thúc vòng lặp không for(i = 1; i <=100; i++)
có à vòng lặp luôn lặp
Thay đổi biến điều khiển từ
ü Để kết thúc vòng lặp à break; return; 100 đến 1, mỗi lần giảm 1:
goto for(i = 100; i >= 1; i--)
ü Trong thân for (khối lệnh) có thể chứa một Thay đổi biến điều khiển từ 7
đến 77, mỗi lần tăng 7:
hoặc nhiều cấu trúc điều khiển khác, vòng for(i = 7; i <= 77; i+=7)
lặp khác.
Thay đổi biến điều khiển từ 20
đến 2, mỗi lần giảm 2:
for(i = 20; i >= 2; i –= 2)
18
Vòng lặp while
while(biểu thức) ü Trước tiên biểu thức được kiểm tra.
ü Nếu sai à thoát khỏi vòng lặp (khối lệnh chưa được
{ thực thi một lần nào.
ü Nếu đúng à thực hiện khối lệnh + kiểm tra biểu thức.
khối lệnh; ü Khối lệnh có thể 1 hoặc nhiều lệnh.
ü Nếu biểu thức là một hằng khác không thì nó luôn đúng
} và vòng lặp diễn ra vô hạn. Muốn thoát khỏi vòng lặp
while tùy ý có thể dùng các lệnh break, goto, return.
19
Vòng lặp while, do...while
do Vào
{
khối lệnh;
} Đúng Khối lệnh
while (biểu thức)
ü Trước tiên thực hiện khối lệnh.
Điều kiện?
ü Kiểm tra biểu thức. Nếu sai à
thoát khỏi vòng lặp (khối lệnh Sai
được thực thi một lần.
Ra
ü Nếu đúng à thực hiện khối lệnh.
20
Một chương trình trong CCS
#include <16F877A.h> // các chỉ thị tiền xử lý
#device ADC=10
#use delay(clock = 4000000) // cần thiết
#FUSES NOWDT, NOPROTECT, NODEBUG, NOBROWNOUT
……
#use rs232(baud=9600, parity=N, xmit=PIN_C6, RCV=PIN_C6)//giao tiếp nối tiếp
#use i2c(Master , SDA=PIN_C3 , SCL=PIN_C4)
#INCLUDE
#include <filename>
§ Filename : tên file cho thiết bị *.h , *.c
§ Khai báo chỉ định đường dẫn cho trình biên dịch
§ Luôn phải có để khai báo chương trình viết cho VĐK
nào , và luôn đặt ở dòng đầu tiên
§ Ví dụ: #include <16F877A.h>
#include < I2C.h>
24
Các chỉ thị tiền xử lý
#BIT
#bit name = x.y
§ Tạo biến 1bit có tên là name đặt ở byte x vị trí y.
§ Thường dùng để kiểm tra hoặc gán giá trị cho thanh
ghi.
§ Ví dụ: #bit TMR1IF = 0x0B.2; => tạo biến 1bit tên
TMR1IF đặt ở byte có địa chỉ 0x0B ở vị trí thứ 2.
25
Các chỉ thị tiền xử lý
#BYTE
#byte name = x
§ Gán tên biến name cho địa chỉ x
§ Name thường trùng với tên thanh ghi có địa chỉ x
§ Ví dụ: #byte portB = 0x06;
26
Các chỉ thị tiền xử lý
#DEFINE
#define name text
§ Dùng để khai báo một chuỗi, một biến, hoặc số có tên
là name
§ Ví dụ: #define constant 123456;
#define LED_D5 PIN_E2
27
Các chỉ thị tiền xử lý
#USE
#use delay(clock = speed)
§ Dùng để khai báo tốc độ dao động của thạch anh
§ Có chỉ thị này thì mới sử dụng được các hàm trễ thời
gian delay_ms hay delay_us
#use I2C(options)
§ Thiết lập giao tiếp I2C
§ #use i2c(master , SDA = PIN_B1 , SCL = PIN_B4)
28
Các chỉ thị tiền xử lý
#USE
#use fast_io(port)
§ Port là các cổng vào ra của PIC (từ A -> E)
§ Có chỉ thị này thì chúng ta có thể điều chỉnh các port
chỉ với 1 lệnh như output_low() , input_high()
§ Trong hàm main à phải dùng hàm set_tris_x() để
chỉ rõ chân vào ra thì chỉ thị trên mới có hiệu lực,
nếu không chương trình sẽ chạy sai
§ Ví dụ: #use fast_io(A)
#use fast_io(all)
29
Các hàm xử lý I/O
ü output_low(pin), output_high(pin)
§ Thiết lập 1 chân vi điều khiển là OUTPUT, điện áp xuất ra là
mức 0 hoặc mức 1.
§ output_low(PIN_B0); // chân 0 của PORTB xuất ra điện áp
0V (mức 0)
output_high(PIN_A0); // chân 0 của PORTA xuất ra điện áp
5V (mức 1)
ü output_x(byte)
§ Thiết lập PORT x là OUTPUT, giá trị xuất ra là byte.
§ output_b(0x35); // giá trị xuất ra ở PORTB là 0x00110101
output_d(0x76); // giá trị xuất ra ở PORTD là 0x01110110
30
Các hàm xử lý I/O
output_bit(pin,value)
§ Thiết lập 1 chân vi điều khiển là OUTPUT, mức logic
thiết lập là value (0 hoặc 1).
§ Thường dùng khi giá trị ra tùy thuộc giá trị của 1
biến nào đó
output_bit(PIN_B1,0);
à chân 1 của PORTB xuất ra mức logic 0 (0V)
à output_bit(PIN_C2,input(PIN_B2));
à chân C2 xuất ra mức logic = giá trị đầu vào của chân B2
31
Các hàm xử lý I/O
ü output_toggle(pin)
§ Đảo trạng thái của chân chỉ định
§ output_toggle(PIN_B1); //đảo trạng thái của chân B1
ü output_float(pin)
§ Hàm này thiết lập chân chỉ định đến chế độ input
(nhập),với trạng thái trở kháng cao.
§ output_float(PIN_B3); // chân B3 trở thành input
ü output_drive(pin)
§ Thiết lập chân chân chỉ định đến chế độ OUTPUT (TRIS
bit 0).
§ output_drive(PIN_B1); // chân B1 trở thành output
32
Các hàm xử lý I/O
ü input(pin)
§ Trả về trạng thái của một chân vi điều khiển, giá trị trả về có
kiểu bit (0 hoặc 1).
§ if(input(PIN_C5)) output_b(0xFF); // nếu chân C5 ở mức
cao à PORTB = 0xff
if(!input(PIN_C5)) output_b(0x00); // nếu chân C5 ở mức
thấp à PORTB = 0x00
ü input_x()
§ trả về trạng thái của PORT x, giá trị trả về là 1 byte
§ int8 DATA;
DATA = input_a(); // biến DATA sẽ chứa giá trị trạng thái
của PORTA
33
Các hàm xử lý I/O
ü port_b_pullups(value)
§ value = 1 à thiết lập điện trở kéo lên cho PORTB khi sử
dụng là chức năng INPUT (đối với 16F877A thì chỉ có
PORTB có điện trở nội kéo lên).
ü set_tris_x(byte)
§ Thiết lập hướng IN/OUT cho PORT x trong đó 0: OUTPUT, 1:
INPUT.
§ set_tris_b(0xF0); // chân 0,1,2,3 là OUTPUT ; chân 4,5,6,7
là INPUT
34
Bài tập
Bài tập 1: Chớp tắt LED điểm
Viết chương trình chớp/tắt 1 LED điểm với tần số 1MHz
Bài tập 2: Điều khiển nhiều LED điểm
Viết chương trình quét 8 LED điểm (mỗi lần chỉ 1 LED sáng) với tần
số 1Hz
Bài tập 3: Nút nhấn
Viết chương trình sáng/tắt LED điểm khi nhấn nút
Bài tập 4: Hiển thị LED 7 đoạn
Viết chương trình vòng lặp đếm số từ 0 đến 9 trên LED 7 đoạn
Bài tập 5: Nút nhấn và LED 7 đoạn
Viết chương trình hiển thị số trên LED 7 đoạn bằng nút nhấn. Giá trị
tăng lên 1 sau mỗi lần nhấn nút. Giá trị LED 7 đoạn sẽ quay về số 0
nếu giá trị trước đó là 9.