You are on page 1of 34

CHƯƠNG

3
TẬP LỆNH
& Firma convenzione
Politecnico di Milano e Veneranda Fabbrica

CHỈ THỊ TIỀN XỬ LÝ


del Duomo di Milano
Aula Magna – Rettorato
Mercoledì 27 maggio 2015
2
Ký hiệu của lưu đồ thuật toán
Hình dạng (Symbol) Hành động (Activity)
Dữ liệu vào (Input)

Xử lý (Process)

Dữ liệu ra (Output)

Quyết định (Decision), sử dụng điều kiện

Luồng xử lý (Flow lines)

Gọi CT con, hàm… (Procedure, Function…)

Bắt đầu, kết thúc (Begin, End)

Điểm ghép nối (Connector)


3
Ví dụ lưu đồ thuật toán
4
Khai báo biến
Cú pháp: <kiểu dữ liệu> <tên biến>
Ví dụ: int a, b, c;
Vị trí biến:
ü Biến toàn cục
ü Biến cục bộ
Ký hiệu Diễn giải Ví dụ
{ } Bắt đầu và kết thúc hàm hay khối lệnh. void main() { }
; Kết thúc khai báo biến, một lệnh, một int a;
lời gọi hàm, hay khai báo nguyên mẫu void NhapMang(int a[]);
hàm.
// Chú thích (ghi chú) cho một dòng. Chỉ có //Nhap mang
tác dụng đối với người đọc chương void NhapMang(int a[]);
trình.
/* Tương tự như ký hiệu //, nhưng cho /* Dau tien nhap vao n.
*/ trường hợp nhiều dòng. Sau do nhap tung phan tu*/
NhapMang(int a[], int &n);
5
Khai báo biến
Unsigned Signed
Kiểu Kích cỡ
(Không dấu) (Có dấu)
Số 1 bit = true
int1 hay 0 đến 1 Không có
false ( 0 hay 1)
Số nguyên 1 byte
int8 0 đến 255 -128 đến 127
( 8 bit)
int16 Số nguyên 16 bit 0 đến 65535 -32768 đến 32767
-2147483648 đến
int32 Số nguyên 32 bit 0 đến 4294967295 2147483647
0 đến -140737488355328 đến
int48 Số nguyên 48 bit 281474976710655 140737488355327
-9223372036854775808
int64 Số nguyên 64 bit Không Có đến
9223372036854775807
float32 Số thực 32 bit -1.5 x 1045 đến 3.4 x 1038
6
Khai báo biến

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

PHÉP TOÁN SỐ HỌC (TOÁN TỬ 2 NGÔI)


+ Cộng
- Trừ
* Nhân
/ Chia lấy phần nguyên
% Chia lấy phần dư
PHÉP TOÁN QUAN HỆ
> Lớn hơn
< Nhỏ hơn
>= Lớn hơn hoặc bằng
<= Nhỏ hơn hoặc bằng
== Bằng nhau
!= Khác nhau
Các phép toán 8

PHÉP TOÁN LOGIC


! NOT
&& AND dùng để kiểm tra điều kiện
|| OR dùng để kiểm tra điều kiện
TOÁN TỬ TĂNG GIẢM (TOÁN TỬ 1 NGÔI)
++ Tăng 1 Nếu toán tử tăng giảm đặt trước thì tăng
-- Giảm 1 giảm trước rồi tính biểu thức hoặc ngược
lại.
PHÉP TOÁN THAO TÁC TRÊN BIT
& AND
| OR
^ XOR
<< Dịch trái
>> Dịch phải
~ Lấy phần bù theo bit
9
Dịch trái & dịch phải
10
Toán tử biểu thức điều kiện
Đây là toán tử 3 ngôi (tác động lên 3 toán hạng), được ký hiệu: “?:”
Cú pháp: <biểu thức 1>?< biểu thức 2 >:< biểu thức 3 >
Biểu thức này cho ra kết quả là:
ü biểu thức 2 nếu biểu thức 1 đúng
ü biểu thức 3 nếu biểu thức 1 sai

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

switch (biểu thức) Đúng


switch (biểu thức) Giá trị = 1? Lệnh/khối lệnh 1
{

case giá trị 1: khối lệnh 1; Sai break?

Không
break;
Đúng
Giá trị = 2? Lệnh/khối lệnh 2
case giá trị 2: khối lệnh 2;

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

case giá trị 1: khối lệnh 1; Có


Sai break?
break; Không
Đúng
case giá trị 2: khối lệnh 2; Giá trị = 2? Lệnh/khối lệnh 2

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

break; default: Lệnh/khối


lệnh n+1
}
Ra
17
Vòng lặp for #include <stdio.h>

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)

int a = 0, b = 1, c = 2; // các khai báo biến

#int_TIMER1{ // chương trình con ngắt


…}

void chuong_trinh_con() { // chương trình con


…}

void main() {… } // chương trình chính


21
Các hàm trong CCS

1. Hàm không trả về giá trị void sang_led(led)


void <tên_hàm>(các tham số) {
{ output_high(led);
nội dung hàm; }
}

2. Hàm có giá trị trả về


<kiểu dữ liệu trả về> <tên_hàm> (tham int tinh_toan(int a, int b)
số) {
{ int z = a + b;
nội dung hàm; return z;
}
return giá trị trả về;
}
22
Hàm delay trong CCS
ü Để dùng hàm delay, cần có khai báo
§ #use delay(clock = 4000000)

ü delay_cycles(unsigned int8 X) à delay X chu kỳ lệnh (X: 1 – 255)


§ 1 chu kỳ lệnh = 4 chu kỳ máy

ü delay_ms(unsigned int16 X) à delay X ms


§ X là biến hoặc hằng từ 0 đến 65535

ü delay_us(unsigned int16 X) à delay X us


§ X là biến hoặc hằng từ 0 đến 65535
23
Các chỉ thị tiền xử lý

#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.

You might also like