You are on page 1of 49

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>
#FUSES NOWDT, HS, NOPUT, PROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=8000000) // 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) 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
Char -128 đến 127 Ký tự 8 bit

Float 3,4−38 đế𝑛 3,438 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; - Đảo (~)
- Dịch trái n bit biến a: a = a << n
float set = 75, temp;
- Dịch phải n bit biến a: a = a >> n
CONST int8 a[3] = {2, 7, 0x7a};
(Xem thêm trong HELP: operators)
unsigned int16 tmp1, tmp2;
* Các điều kiện logic:
char kitu; - 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 PIN_D0
- Phép gán (=) - #byte SET = 100
- Phép toán logic: AND (&); OR( | ) - #bit SW1 = 0x86.0 // RB0
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(0b11110000);

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ị 147 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:

Ví dụ:
switch (biểu thức )
{ Int8 a;

case giá trị 1: {lệnh 1; a = input_d();


break;} Switch(a)
case giá trị 2: { lệnh 2; { case 0: {output_high(PIN_C0);
break;} break;}

case 5: {output_high(PIN_C1);
case giá trị n: {lệnh n;
break;}
break;}
case 9: {output_high(PIN_C2);
Default: {lệnh;
break;}
break;}
} default: {output_c(0x00);
break;}
17
c) WHILE:

Ví dụ 1:
while (điều kiện )
{ Int8 i;

Khối lệnh; CONST int8 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 (điều kiện1; điều kiện 2; điều kiện 3)


{
Khối lệnh;
}

Ví dụ 1:
CONST int8 a[4] = {0x00, 0xff, 0x00, 0xff};
For (int8 i = 0; i<4; i++)
{output_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

a) LED đơn R1 VDD C2


10K

RST
PIC16F877A

32

31
U2

RESET
C3
1 40 ICSPDAT

GND
VCC
MCLR/Vpp RB7/PGD 39 ICSPCLK
1uF RB6/PGC 38
2 RB5 37
3 RA0/AN0 RB4 36
4 RA1/AN1 RB3/PGM 35
5 RA2/AN2/Vref - RB2 34
6 RA3/AN3/Vref + RB1 33
7 RA4/TOCKI RB0/INT
RA5/AN4/SS

C6 33P
13 8
OSC1/CLKIN RE0/RD/AN5 9
Y1 RE1/WR/AN6 10
14 RE2/CS/AN7
8M OSC2/CLKO
30
C11 33P 15 RD7/PSP7 29
16 RC0/T1OSO/T1CKI RD6/PSP6 28
17 RC1/T1OSI/CCP2 RD5/PSP5 27
18 RC2/CCP1 RD4/PSP4 22
23 RC3/SCL RD3/PSP3 21
24 RC4/SDA RD2/PSP2 20
25 RC5/SDO RD1/PSP1 19

GND
VCC
26 RC6/TX/CK RD0/PSP0 R10 R11
RC7/RX/DT
11 270 270

12 D1 D2
LED LED
VDD
J1
6 VDD
5 ICSPCLK
4 ICSPDAT
3
2 VDD
1 RST

20
JTAG
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, PROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=8000000) // 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, PROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=8000000) // 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 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, PROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=8000000) // 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);}
}

23
b) LED 7s

VDD
4.7uF - 10uF

R1 VDD C2
10K

RST
PIC16F877A
32

31
U2 R1 LED1 LED2 LED3 LED4
RESET

C3
1 VCC 40 R2 a 7 LED7S a 7 LED7S a 7 LED7S a 7 LED7S

GND
MCLR/Vpp RB7/PGD 39 R3 b 6 a b 6 a b 6 a b 6 a
1uF RB6/PGC 38 R4 c 4 b c 4 b c 4 b c 4 b
2 RB5 37 R5
R d 2 c d 2 c d 2 c d 2 c
3 RA0/AN0 RB4 36 R6
R e 1 d e 1 d e 1 d e 1 d
4 RA1/AN1 RB3/PGM 35 R7
R f 9 e f 9 e f 9 e f 9 e
5 RA2/AN2/Vref - RB2 34 R8
R g 10 f g 10 f g 10 f g 10 f
6 RA3/AN3/Vref + RB1 33 R p 5 g p 5 g p 5 g p 5 g

C1

C2

C1

C2

C1

C2

C1

C2
7 RA4/TOCKI RB0/INT R p p p p
RA5/AN4/SS R
100X8

8
C6 33P
13 8 R9 4K7 Q1 R10 4K7 Q2 R11 4K7 Q3 R12 4K7 Q4
OSC1/CLKIN RE0/RD/AN5 9
Y1 RE1/WR/AN6 10
14 RE2/CS/AN7 A1013 A1013 A1013 A1013
8M OSC2/CLKO VCC
30
C11 33P 15 RD7/PSP7 29
16 RC0/T1OSO/T1CKI RD6/PSP6 28
17 RC1/T1OSI/CCP2 RD5/PSP5 27
18 RC2/CCP1 RD4/PSP4 22
23 RC3/SCL RD3/PSP3 21
24 RC4/SDA RD2/PSP2 20
25 RC5/SDO RD1/PSP1 19
GND
VCC

26 RC6/TX/CK RD0/PSP0
RC7/RX/DT
11

12

VDD

24
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, PROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=8000000) // 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
YÊU CẦU:
2. Viết chƣơng trình hiển thị 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, PROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=8000000) // Tần số thạch anh dùng trong hệ thống
//-------CHƢƠNG TRÌNH CHÍNH---------
Void main()
{
While (TRUE){
Output_d(0xff); Output_b(“H”7s); output_low(PIN_D3); delay_ms(5);
Output_d(0xff); Output_b(“E”7s); output_low(PIN_D2); delay_ms(5);
Output_d(0xff); Output_b(“L”7s); output_low(PIN_D1); delay_ms(5);
Output_d(0xff); Output_b(“P”7s); output_low(PIN_D0); delay_ms(5);}
}

26
Hướng dẫn: cách 02
#include <16F877A.h>
#FUSES NOWDT, HS, NOPUT, PROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=8000000) // Tần số thạch anh dùng trong hệ thống
CONST unsigned char LED7S[4] = {“H”7s, “E”7s, “L”7s, “P”7s };
CONST unsigned char dk[4] = {0xf7, 0xfb, 0xfd,0xfe};
Void quet_LED()
{ for (int8 i = 0; i < 4; i++)
{output_d(0xff); output_b(LED7S[i]); output_d(dk[i]); delay_ms(5);}
}
//-------CHƢƠNG TRÌNH CHÍNH---------
Void main()
{
Output_d(0xff);// tắt các led
While (TRUE){ quet_LED();}
}

27
YÊ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, PROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=8000000) // Tần số thạch anh dùng trong hệ thống
CONST unsigned char LED7S[10] = {0x03, 0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09 };
//-------CHƢƠNG TRÌNH CHÍNH---------
Void main()
{ unsigned char dem;
dem = 0;
Output_d(0xf7);// tắt các led, bật LED 1.
While (dem < 10){
Output_b(LED7S[dem]); delay_ms(500); dem++; }
while(1);// STOP
}
28
c) LCD
VDD
4.7uF - 10uF

R1 VDD C2
10K

RST
PIC16F877A

32

31
U2
RESET

C3
1 40
LCD1_TC1602A1

VCC

GND
MCLR/Vpp RB7/PGD 39
1uF RB6/PGC 38
2 RB5 37
RA0/AN0 RB4
TEXT LCD

LAMP
3 36
4 RA1/AN1 RB3/PGM 35
5
6
RA2/AN2/Vref -
RA3/AN3/Vref +
RB2
RB1
34
33
2 LINES x 16 CHARACTERS
RA4/TOCKI RB0/INT

CONST
7
RA5/AN4/SS

GND

VCC
R/W
RS

CS
D0
D1
D2
D3
D4
D5
D6
D7

A
K
C6 33P

10
11
12
13
14

15
16
13 8

7
8
9

2
OSC1/CLKIN RE0/RD/AN5 9
Y1 RE1/WR/AN6 10 LMP
RE2/CS/AN7

DT4
DT5
DT6
DT7
14 VCC

RW
RS

CS
8M OSC2/CLKO
30 R4
C11 33P 15 RD7/PSP7 29 5/3W
16 RC0/T1OSO/T1CKI RD6/PSP6 28
17 RC1/T1OSI/CCP2 RD5/PSP5 27 R3 10K
18 RC2/CCP1 RD4/PSP4 22
23 RC3/SCL RD3/PSP3 21 LMP Q2 VCC
24 RC4/SDA RD2/PSP2 20
25 RC5/SDO RD1/PSP1 19 R6 4K7 A1013
GND
VCC

26 RC6/TX/CK RD0/PSP0
RC7/RX/DT
11

12

VDD

29
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
Hướng dẫn:
- Sử dụng thƣ viện “lcd.c” có sẵn trong CCS
- Mặc định kết nối phần cứng trong “lcd.c”:
PIC LCD
RD4 ---------------------D4
RD5 ---------------------D5
RD6 ---------------------D6
RD7 ---------------------D7
RD0 ---------------------CS (E)
RD1 ---------------------RS
RD2 ---------------------RW
- Khởi động LCD và đặt trạng thái PORTD = 0x00
lcd_init();
set_tris_d(0x00);
output_d(0x00);
- Tham khảo thêm hàm printf trong HELP của CCS
30
Hướng dẫn:
#include <16F877A.h>
#FUSES NOWDT, HS, NOPUT, PROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=8000000)
#include <lcd.c>
//================================================================
void main()
{
lcd_init();
set_tris_d(0x00);
output_d(0x00);
while(TRUE)
{
lcd_gotoxy(1,1); // Di chuyển đến vị trí đầu dòng 01 LCD
printf(lcd_putc,"Welcome to");
delay_ms(3);
lcd_gotoxy(1,2); //Di chuyển đến đầu dòng 02 LCD
printf(lcd_putc,"*****HUTECH*****");
delay_ms(3);
}

}//end main

31
YÊ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à 300 ms.
Hướng dẫn:
#include <16F877A.h>
#FUSES NOWDT, HS, NOPUT, PROTECT, NODEBUG, NOBROWNOUT,
NOLVP
#use delay(clock=8000000)
#include <lcd.c>
//=========================================================
void main()
{
int8 sodem;
lcd_init();
set_tris_d(0x00);
output_d(0x00);
sodem = 0;

32
Hướng dẫn:

lcd_gotoxy(1,1);
printf(lcd_putc,"Counter:");
//--------------------------
while(TRUE)
{
lcd_gotoxy(10,2);
printf(lcd_putc,"%03u",sodem);// hiển thị 3 chữ số
delay_ms(300);
sodem++;
if(sodem == 100) break;
}
}//end main

33
c) Phím nhấn
VDD
4.7uF - 10uF

R1 VDD C2
10K

RST
PIC16F877A

32

31
U2
RESET C3
1 40

VCC

GND
MCLR/Vpp RB7/PGD 39
1uF RB6/PGC 38
2 RB5 37
3 RA0/AN0 RB4 36
4 RA1/AN1 RB3/PGM 35
5 RA2/AN2/Vref - RB2 34
6 RA3/AN3/Vref + RB1 33
7 RA4/TOCKI RB0/INT R23 R24
RA5/AN4/SS
270 270

C6 33P
13 8 D1 D2
OSC1/CLKIN RE0/RD/AN5 9
Y1 RE1/WR/AN6 10 LED LED
14 RE2/CS/AN7
8M OSC2/CLKO
30
C11 33P 15 RD7/PSP7 29
16 RC0/T1OSO/T1CKI RD6/PSP6 28
17 RC1/T1OSI/CCP2 RD5/PSP5 27
18 RC2/CCP1 RD4/PSP4 22
23 RC3/SCL RD3/PSP3 21
VDD VDD 24 RC4/SDA RD2/PSP2 20
25 RC5/SDO RD1/PSP1 19
GND
VCC

26 RC6/TX/CK RD0/PSP0
R21 R22 RC7/RX/DT
11

12

10K 10K
SW1

SW2

VDD

34
YÊU CẦU:
1. Viết chƣơng trình điều khiển:
- Nhấn SW1: D1 sáng
- Nhấn SW2: D1 tắt

Hướng dẫn:
- Các phím SW1 và SW2 tích cực mức thấp; các LED D1 và D2 tích cực mức
cao
- Đặt cấu hình cho RC0 và RC1 là ngõ vào
- Sử dụng hàm: input(PIN) để kiểm tra trạng thái phím nhấn

35
Hướng dẫn:

#include <16F877A.h>
#FUSES NOWDT, HS, NOPUT, PROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=8000000)
//--------------------------------------------
#define D1 PIN_B4
#define D2 PIN_B5
#define SW1 PIN_C0
#define SW2 PIN_C1
//================================================================
void main()
{

//--------------------------
while(TRUE)
{
if(!input(SW1)) output_high(D1);
if(!input(SW2)) output_low(D1);
}

}//end main

36
YÊU CẦU:
2. Viết chƣơng trình điều khiển:
- Nhấn SW1: D2 tắt trong khi D1 sáng/tắt vô hạn; thời gian delay 200 ms
- Nhấn SW2: D1 tắt trong khi D2 sáng/tắt vô hạn; thời gian delay 500 ms

Hướng dẫn:

#include <16F877A.h>
#FUSES NOWDT, HS, NOPUT, PROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=8000000)
#define D1 PIN_B4
#define D2 PIN_B5
#define SW1 PIN_C0
#define SW2 PIN_C1
//================================================================

37
Hướng dẫn (Cách 01):
void main()
{
while(TRUE)
{
if(!input(SW1))
{
output_low(D2);
while(1){
output_toggle(D1);
delay_ms(200);
if (!input(SW2)) break;
}
}
if(!input(SW2))
{
output_low(D1);
while(1){
output_toggle(D2);
delay_ms(500);
if (!input(SW1)) break;
}
}
}
}//end main
38
Hướng dẫn (Cách 02):
void main()
{ int8 SW = 0;
while(TRUE)
{
if(!input(SW1)) SW = 1;
if (!input(SW2)) SW = 2;
switch(SW)
{
case 1: { output_low(D2);
output_toggle(D1);
delay_ms(200);
break;}
case 2: { output_low(D1);
output_toggle(D2);
delay_ms(500);
break; }
}
}
}//end main

39
BÀI TẬP

Cho sơ đồ mạch:
VDD
4.7uF - 10uF

R1 VDD C2
10K

RST
PIC16F877A

32

31
U2 R1 LED1 LED2 LED3 LED4
RESET

C3
1 40 R2 a 7 LED7S a 7 LED7S a 7 LED7S a 7 LED7S

GND
VCC
MCLR/Vpp RB7/PGD 39 R3 b 6 a b 6 a b 6 a b 6 a
1uF RB6/PGC 38 R4 c 4 b c 4 b c 4 b c 4 b
2 RB5 37 R5
R d 2 c d 2 c d 2 c d 2 c
3 RA0/AN0 RB4 36 R6
R e 1 d e 1 d e 1 d e 1 d
4 RA1/AN1 RB3/PGM 35 R7
R f 9 e f 9 e f 9 e f 9 e
5 RA2/AN2/Vref - RB2 34 R8
R g 10 f g 10 f g 10 f g 10 f
6 RA3/AN3/Vref + RB1 33 R p 5 g p 5 g p 5 g p 5 g

C1

C2

C1

C2

C1

C2

C1

C2
7 RA4/TOCKI RB0/INT R p p p p
RA5/AN4/SS R
100X8

8
C6 33P
13 8 R9 4K7 Q1 R10 4K7 Q2 R11 4K7 Q3 R12 4K7 Q4
OSC1/CLKIN RE0/RD/AN5 9
Y1 RE1/WR/AN6 10
14 RE2/CS/AN7 A1013 A1013 A1013 A1013
8M OSC2/CLKO VCC
30
C11 33P D1 15 RD7/PSP7 29
D2 16 RC0/T1OSO/T1CKI RD6/PSP6 28
D3 17 RC1/T1OSI/CCP2 RD5/PSP5 27
D4 18 RC2/CCP1 RD4/PSP4 22
D5 23 RC3/SCL RD3/PSP3 21
D6 24 RC4/SDA RD2/PSP2 20
D7 25 RC5/SDO RD1/PSP1 19
GND
VCC

D8 26 RC6/TX/CK RD0/PSP0
RC7/RX/DT
11

12

VDD
D1

D2

D3

D4

D5

D6

D7

D1 D2 D3 D4 D5 D6 D7D8 D8

R25 R26 R27 R28 R29 R30 R31 R32


270X8

40
BÀI TẬP

1. Viết chƣơng trình hiển thị các LED đơn sáng dần từ D1 đến D8, lặp lại vô
hạn lần; delay 300 ms.
2. Viết chƣơng trình hiển thị các LED đơn sáng dần từ D8 đến D1, lặp lại 10
lần; delay 500 ms.
3. Viết chƣơng trình hiển thị các LED đơn sáng dần từ trong (D4,D5) ra ngoài
(D1,D8), lặp lại vô hạn lần; delay 200 ms.
4. Viết chƣơng trình hiển thị số “14.25” trên 4 led; quét led với thời gian delay
3 ms.
5. Viết chƣơng trình hiển thị chữ “StOP” trên 4 led; quét led với thời gian delay
5 ms.
6. Viết chƣơng trình hiển thị các LED đơn sáng dần từ D1 đến D8, delay 500
ms; lặp lại 8 lần đồng thời hiển thị số lần trên LED 7 đoạn 4
41
7*. Cho mạch điện, viết chƣơng trình thực hiện theo yêu cầu ở Hình a,b,c,d (delay 300ms):
RC0

RC1

RC2

RC3

RC4

RC5

RC6

RC7

RB2

RB0

RB1

RB3

RB7

RB6

RB5

RB4
R1 R2 R3 R4 R5 R6 R7 R8 (270 x 8) R1 R2 R3 R4 R5 R6 R7 R8 (270 x 8)

D1 D2 D3 D4 D5 D6 D7 D8 D1 D2 D3 D4 D5 D6 D7 D8

VDD VDD

Hình 7a: Sáng dần từ D1 đến D8; Hình 7b: Tắt dần từ D8 đến D1;
lặp 8 lần Lặp lại 10 lần
RD0

RD2

RD1

RD7

RD3

RD4

RD5

RD6

RC2

RC3

RC4

RC1

RC0

RC5

RC6

RC7
R1 R2 R3 R4 R5 R6 R7 R8 (270 x 8) R4 R5 R1 R2 R3 R6 R7 R8 (270 x 8)

D1 D2 D3 D4 D5 D6 D7 D8 D1 D2 D3 D4 D5 D6 D7 D8

VDD VDD VDD

Hình 7c: Một LED sáng dịch từ D1 – D8; Hình 7d: Sáng dần từ trong ra ngoài;
Lặp lại vô hạn lần lặp lại 15 lần 42
6b. Cho mạch điện, viết chƣơng trình thực hiện:
a) Hiển thị chữ “FILL” sau ~6s đổi sang hiển thị chữ “StoP”
b) Viết chƣơng trình hiển thị số tăng dần từ 00-99 trên LED 3,4; thời gian tăng
~300ms

43
BÀI TẬP
Cho sơ đồ mạch:
VDD
4.7uF - 10uF

R1 VDD C2
10K

RST
PIC16F877A

32

31
U2
RESET

C3
1 40
LCD1_TC1602A1

VCC

GND
MCLR/Vpp RB7/PGD 39
1uF RB6/PGC 38
2 RB5 37
RA0/AN0 RB4
TEXT LCD

LAMP
3 36
4 RA1/AN1 RB3/PGM 35
5
6
RA2/AN2/Vref -
RA3/AN3/Vref +
RB2
RB1
34
33
2 LINES x 16 CHARACTERS
7 RA4/TOCKI RB0/INT

CONST
RA5/AN4/SS

GND

VCC
R/W
RS

CS
D0
D1
D2
D3
D4
D5
D6
D7

A
K
C6 33P

10
11
12
13
14

15
16
13 8

7
8
9

2
OSC1/CLKIN RE0/RD/AN5 9
Y1 RE1/WR/AN6 10 LMP
RE2/CS/AN7

DT4
DT5
DT6
DT7
14 VCC

RW
RS

CS
8M OSC2/CLKO
30 R4
C11 33P 15 RD7/PSP7 29 5/3W
16 RC0/T1OSO/T1CKI RD6/PSP6 28
17 RC1/T1OSI/CCP2 RD5/PSP5 27 R3 10K
18 RC2/CCP1 RD4/PSP4 22
23 RC3/SCL RD3/PSP3 21 LMP Q2 VCC
24 RC4/SDA RD2/PSP2 20
25 RC5/SDO RD1/PSP1 19 R6 4K7 A1013
GND
VCC

26 RC6/TX/CK RD0/PSP0
VDD VDD RC7/RX/DT
11

12

R21 R22

10K 10K

VDD
SW1

SW2

44
BÀI TẬP

7. Viết chƣơng trình thực hiện:


- Nhấn SW1: hiển thị chữ “Xin chao cac ban” trên dòng 01 LCD tại (x,y) =
(1,1)
- Nhấn SW2: hiển thị chữ “HUTECH” trên dòng 02 tại (x,y) = (10,2)

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:
- Nhấn SW1: nếu set_val < 200: set_val = set_val + 5
- Nhấn SW2: Nếu set_val > 0: set_val = set_val -1
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).

45
BÀI TẬP

9. Viết chƣơng trình đồng hồ đếm giây: dòng 1 tại (1,1) hiển thị “DONG HO
DEM GIAY”, dòng 2 tai (4,2) hiển thị “00:00”, và khi:
- Nhấn SW1: bắt đầu đếm “giây : phần trăm giây”
- Nhấn SW2: dừng đếm
- Nhấn giữ SW2 hơn 5 giây sẽ xóa số đếm về 0

10. 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:
- Nhấn SW1: cho phép chỉnh giờ (0-23)
- Nhấn SW2: cho phép chỉnh phút (0-59)

46
BÀ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.

47
BÀI TẬP
Cho sơ đồ mạch:
VDD
4.7uF - 10uF

VDD R1 VDD C2
10K

RST
PIC16F877A

32

31
U2 R1 LED1

RESET
R13 R14 R15 R16 C3
0 4 8 C 1 40 R2 7 LED7S

VCC

GND
10K 10K 10K 10K MCLR/Vpp RB7/PGD 39 R3 6 a
1uF RB6/PGC 38 R4 4 b
2 RB5 37 R5
R 2 c
3 RA0/AN0 RB4 36 R6
R 1 d
4 RA1/AN1 RB3/PGM 35 R7
R 9 e
5 RA2/AN2/Vref - RB2 34 R8
R 10 f
6 RA3/AN3/Vref + RB1 33 R 5 g

C1

C2
1 5 9 D 7 RA4/TOCKI RB0/INT R p
RA5/AN4/SS R
270X8

8
VDD
C6 33P
13 8
OSC1/CLKIN RE0/RD/AN5 9
Y1 RE1/WR/AN6 10
2 6 A E 14 RE2/CS/AN7
8M OSC2/CLKO
30
C11 33P 15 RD7/PSP7 29
16 RC0/T1OSO/T1CKI RD6/PSP6 28
17 RC1/T1OSI/CCP2 RD5/PSP5 27
18 RC2/CCP1 RD4/PSP4 22
23 RC3/SCL RD3/PSP3 21
24 RC4/SDA RD2/PSP2 20
25 RC5/SDO RD1/PSP1 19

GND
VCC
3 7 B F 26 RC6/TX/CK RD0/PSP0
RC7/RX/DT

11

12
VDD

48
BÀI TẬP
13. Viết chƣơng trình đọc bàn phím HEX và hiển thị giá trị HEX trên led 7
đoạn

HƢỚNG DẪN:
RC0-RC3 là ngõ vào; RC4-RC7 là ngõ ra. Xuất lần lƣợt giá trị 0 ra các cột và
kiểm tra hàng tƣơng ứng để biết phím nào đang nhấn.

49

You might also like