You are on page 1of 34

Bài 03

TIMERS & INTERRUPTS

1
I. Timer:
 Hoạt động timer trong vi điều khiển: gồm một nguồn cấp xung
clock, một bộ đếm nhị phân và một bit báo trạng thái tràn bộ
đếm

BỘ ĐẾM NHỊ PHÂN 8/16 BIT TF

 Có thể đặt trƣớc giá trị ban đầu cho bộ đếm


 Giá trị đếm:
- 8 bit: 0, 1, 2, …. 255, 0, 1, …..
- 16 bit: 0, 1, 2, ….65535, 0, 1, …

2
1. Timer 0: 8 bit

3
4
 Các lệnh liên quan timer 0:
Setup_timer_0(RTCC_DIV_4| RTCC_INTERNAL)
- RTCC_INTERNAL: xung clock FOSC/4
- RTCC_DIV_4: tần số xung clock chia 4 trƣớc khi đƣa vào bộ
đếm

Set_timer0(byte)
- Đặt trƣớc giá trị ban đầu vào bộ đếm timer 0 (0 - 255)
- Ví dụ:
Set_timer0(56); // tràn sau 200 xung clock

Get_timer0()
- Đọc giá trị hiện tại trong timer 0
- Ví dụ:
a = get_timer0(); // đọc giá trị hiện tại của timer0 và gán vào biến a
5
 Ví dụ 01: cho tần số thạch anh là 4 MHz, tính thời gian tràn của timer 0
Setup_timer_0(RTCC_DIV_4| RTCC_INTERNAL);
Set_timer0(156);

 Ví dụ 02: Viết chƣơng trình delay 1 ms dùng timer 0 với thạch anh 4 MHz.
Sử dụng:
Setup_timer_0(RTCC_DIV_4| RTCC_INTERNAL);

 Ví dụ 03: Viết chƣơng trình delay x ms dùng timer 0 với thạch anh 8 MHz.
Sử dụng:
Setup_timer_0(RTCC_DIV_8| RTCC_INTERNAL);

6
2. Timer 1: 16 bit

7
8
 Các lệnh liên quan timer 1:
Setup_timer_1(T1_INTERNAL|T1_DIV_BY_8)
- T1_INTERNAL: xung clock FOSC/4
- T1_DIV_BY_8: tần số xung clock chia 8 trƣớc khi đƣa vào bộ đếm

Set_timer1(2 byte)
- Đặt trƣớc giá trị ban đầu vào bộ đếm timer 0 (0 - 65535)
- Ví dụ:
Set_timer1(5536); // tràn sau 60.000 xung clock

Get_timer1()
- Đọc giá trị hiện tại trong timer 1
- Ví dụ:
a = get_timer1(); // đọc giá trị hiện tại của timer1 và gán vào biến a
9
 Ví dụ 01: cho tần số thạch anh là 4 MHz, tính thời gian tràn của timer 1
Setup_timer_1(T1_INTERNAL|T1_DIV_BY_4)
Set_timer1(15536);

 Ví dụ 02: Viết chƣơng trình delay 1 ms dùng timer 1 với thạch anh 4 MHz.
Sử dụng:
Setup_timer_1(T1_INTERNAL|T1_DIV_BY_4)

 Ví dụ 03: Viết chƣơng trình delay x ms dùng timer 1 với thạch anh 8 MHz.
Sử dụng:
Setup_timer_1(T1_INTERNAL|T1_DIV_BY_8)

10
3. Timer 2: 8 bit

11
12
 Các lệnh liên quan timer 2:
Setup_timer_2(T2_DIV_BY_1,100,5)
- T2 luôn sử dụng xung clock FOSC/4
- Tần số xung clock chia 1 trƣớc khi đƣa vào bộ đếm
- Bộ đếm đến 101 thì tràn
- Timer 2 tràn bộ đếm 5 lần thì bit báo tràn sẽ báo 1 lần
Có thể sử dụng set_timer2(byte) và get_timer2()

Ví dụ: FOSC = 4 MHz


Setup_timer2(T2_DIV_BY_1,99,1)
Timer 2 báo tràn bộ đếm sau 100 μS

13
II. Interrupts (ngắt):
 Hoạt động ngắt trong vi điều khiển xảy ra khi xuất hiện sự kiện ngắt nhƣ:
tràn timer, xuất hiện mức thấp (hoặc cạnh xuống) tại chân RB0, PORTB thay
đổi giá trị, nhận/truyền 1 byte trong USART,…..

14
 Hoạt động của một chƣơng trình ứng dụng có sử dụng sự kiện ngắt

Bắt đầu chƣơng trình

Bắt đầu Kết thúc


Các chƣơng trình con

Có sự kiện ngắt
2. BẮT ĐẦU
1
Chƣơng trình ngắt 1

3. KẾT THÚC
Chƣơng trình ngắt 2

1. Dừng chƣơng trình chính


4. Tiếp tục chƣơng trình chính
NỘI DUNG CHƢƠNG TRÌNH CHÍNH
CÓ SỬ DỤNG NGẮT
(Gọi chƣơng trình con)
15
 Hoạt động của một chƣơng trình ứng dụng có sử dụng sự kiện ngắt

 Một số ngắt sử dụng:


Bắt đầu chƣơng trình
1. #INT_TIMER0 (tràn timer 0)
2. #INT_RTCC (tràn timer 0)
Các chƣơng trình con
3. #INT_TIMER1 (tràn time 1)
Chƣơng trình ngắt: 4. #INT_TIMER2 (tràn timer 2)
#INT_xxx
Void CTN () 5. #INT_EXT (mức thấp tại RB0)
{
6. #INT_RDA (nhận một byte)
// Nội dung xử lý ngắt
}

NỘI DUNG CHƢƠNG TRÌNH CHÍNH


Enable_interrupts(GLOBAL)
Enable_interrupts(INT_xxx)
16
 Ví dụ 01: Cho sơ đồ mạch
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

17
Dùng ngắt timer 0 kiểm tra 2 phím nhấn, sử dụng:
Setup_timer_0(RTCC_DIV_4| RTCC_INTERNAL)
1. Tính chu kì quét phím của timer 0
2. Nếu phím 1 nhấn: sáng D1; phím 2 nhấn: tắt D1

HƯỚNG DẪN:
// Chu kì quét phím là: ~512 μS
#include <16F877A.h>
#FUSES NOWDT, HS, NOPUT, PROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=8000000)
#define D1 PIN_B4
#define SW1 PIN_C0
#define SW2 PIN_C1

18
// Chƣơng trình ngắt
#INT_RTCC
void ktra_sw()
{
if (!input(SW1)) output_high(D1);
if (!input(SW2)) output_low(D1);

}
//-------CHƢƠNG TRÌNH CHÍNH---------
Void main()
{
enable_interrupts(GLOBAL);// cho phép ngắt
enable_interrupts(INT_RTCC);// cho phép ngắt timer 0
setup_timer_0(RTCC_DIV_4|RTCC_INTERNAL);// cấu hình timer 0
while(TRUE);
}

19
 Ví dụ 02: 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 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

20
Yêu cầu 01: hiển thị chữ “HELP” trên 4 LED với thời gian delay 3 ms mỗi LED

HƯỚNG DẪN:
#include <16F877A.h>
#FUSES NOWDT, HS, NOPUT, PROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=8000000)
//-------------------------------------------------------------
Void main()
{
While (1){
Output_d(0xff);// tắt các led
Output_b(0x91); output_low(PIN_D3); delay_ms(3);// “H”
Output_d(0xff);// tắt các led
Output_b(0x61); output_low(PIN_D2); delay_ms(3); // “E”
Output_d(0xff);// tắt các led
Output_b(0xe3); output_low(PIN_D1); delay_ms(3);// “L”
Output_d(0xff);// tắt các led
Output_b(0x31); output_low(PIN_D0); delay_ms(3);// “P”}
}

21
Yêu cầu 02: Dùng ngắt timer 1 để quét LED, thời gian delay mỗi led 3 ms. Sử
dụng:
Setup_timer_1(T1_INTERNAL| T1_DIV_BY_1)
1. Tính chu kì quét LED của timer 1
2. Hiển thị chữ “HELP” trên 4 LED

HƯỚNG DẪN:
// Chu kì quét 4 LED là: ~33 mS
#include <16F877A.h>
#FUSES NOWDT, HS, NOPUT, PROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=8000000)

22
// Chƣơng trình ngắt timer 1
#INT_TIMER1
void qled()
{
Output_d(0xff);// tắt các led
Output_b(0x91); output_low(PIN_D3); delay_ms(3);// “H”
Output_d(0xff);// tắt các led
Output_b(0x61); output_low(PIN_D2); delay_ms(3); // “E”
Output_d(0xff);// tắt các led
Output_b(0xe3); output_low(PIN_D1); delay_ms(3);// “L”
Output_d(0xff);// tắt các led
Output_b(0x31); output_low(PIN_D0); delay_ms(3);// “P”
}
//-------CHUONG TRÌNH CHÍNH---------
Void main()
{
enable_interrupts(GLOBAL);
enable_interrupts(INT_TIMER1);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
while(TRUE);
}

* Ứng dụng để viết chương trình hiển thị các số tăng dần từ 00 đến 99 trên LED1 và
2; delay 200 ms khi tăng 1 đơn vị. 23
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

24
BÀI TẬP
1. Dùng ngắt timer 1 để kiểm tra phím. Sử dụng:
Setup_timer_1(T1_INTERNAL| T1_DIV_BY_1)
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).
2. Dùng ngắt timer 0 kiểm tra 2 phím nhấn, sử dụng:
Setup_timer_0(RTCC_DIV_4| RTCC_INTERNAL)
Viết chƣơng trình hiển thị chữ “DONG HO” tại (5,1) và hiển thị
giờ:phút: giây (bắt đầu từ 00:00:00) tại (4,2). Dùng SW1 để chỉnh giờ (0 - 23) và
SW2 để chỉnh phút (0-59).
25
BÀI TẬP
VDD

R1 VDD
4.7uF - 10uF

C2
Cho sơ đồ mạch:
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

D8
D1 D2 D3 D4 D5 D6 D7 D8

R25 R26 R27 R28 R29 R30 R31 R32


270X8

26
BÀI TẬP
3. Dùng ngắt timer 0 để quét led, thời gian delay mỗi led là 2 ms. Sử dụng:
Setup_timer_0(RTCC_DIV_128|RTCC_INTERNAL)
Viết chƣơng trình thực hiện: hiển thị chữ “StoP” trên 4 LED. Tính thời gian ngắt
timer 0.
4. Dùng ngắt timer 0 để quét led, thời gian delay mỗi led là 2 ms. Sử dụng:
Setup_timer_0(RTCC_DIV_64|RTCC_INTERNAL)
- Tính thời gian ngắt timer 0.
- Viết chƣơng trình hiển thị số tăng dần từ 000 đến 999 trên LED 7S 2, 3 và 4
5. Dùng ngắt timer 1 để quét led, thời gian delay mỗi led là 3 ms. Sử dụng:
Setup_timer_1(T1_INTERNAL| T1_DIV_BY_1)
- Tính thời gian ngắt timer 1.
- Viết chƣơng trình led sáng dần từ D1 đến D8, thời gian delay 200 ms, lặp lại
50 lần đồng thời hiển thị số lần trên LED1 đến LED4 theo dạng: “Ct.XX”
27
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 15 RD7/PSP7 29
16 RC0/T1OSO/T1CKI RD6/PSP6 28
17 RC1/T1OSI/CCP2 RD5/PSP5 27
18 RC2/CCP1 RD4/PSP4 22
VDD VDD 23 RC3/SCL RD3/PSP3 21
24 RC4/SDA RD2/PSP2 20
25 RC5/SDO RD1/PSP1 19
GND
VCC

R21 R22 26 RC6/TX/CK RD0/PSP0


RC7/RX/DT
10K 10K
11

12
SW1

SW2

VDD

28
BÀI TẬP
6. Dùng ngắt timer 0 để quét led, thời gian delay mỗi led là 2 ms. Sử dụng:
Setup_timer_0(RTCC_DIV_4|RTCC_INTERNAL)
Viết chƣơng trình thực hiện hiển thị số đếm trên 4 LED, giá trị ban đầu là 0, và:
- Nhấn SW1: nếu số đếm < 1000: sodem = sodem+10
- Nhấn SW2: nếu số đếm > 0: sodem = sodem-1
7*. Yêu cầu giống bài 5 nhƣng nếu nhấn và giữ phím thì giá trị sẽ tăng/giảm với
thời gian delay 400 ms.
8*. Yêu cầu giống bài 5 nhƣng nếu nhấn phím liên tục hơn 2 giây thì giá trị sẽ
tăng/giảm nhanh với thời gian delay 100 ms (bình thƣờng phím tăng giảm với
thời gian 400 ms)

29
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

30
BÀI TẬP
9. 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
a) Quét phím trong chƣơng trình chính
b) Quét phím dùng ngắt timer1
Setup_timer_1(T1_INTERNAL| T1_DIV_BY_1)

HƢỚNG DẪN:
Cấu hình PORT C với 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.

31
BÀI TẬP
VDD
4.7uF - 10uF

Cho sơ đồ mạch: VDD R1


10K
VDD C2

RST
PIC16F877A

32

31
R13 R14 R15 R16 C3 U2

RESET
0 4 8 C 1 40 S1

VCC

GND
10K 10K 10K 10K MCLR/Vpp RB7/PGD 39 S2
1uF RB6/PGC 38 S3
2 RB5 37 S4
3 RA0/AN0 RB4 36 S5
4 RA1/AN1 RB3/PGM 35 S6
5 RA2/AN2/Vref - RB2 34 S7
6 RA3/AN3/Vref + RB1 33 S8
1 5 9 D 7 RA4/TOCKI RB0/INT
RA5/AN4/SS

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 D11 D12
C11 33P 15 RD7/PSP7 29
16 RC0/T1OSO/T1CKI RD6/PSP6 28 LED LED
17 RC1/T1OSI/CCP2 RD5/PSP5 27
18 RC2/CCP1 RD4/PSP4 22 Q1
23 RC3/SCL RD3/PSP3 21 Q2
24 RC4/SDA RD2/PSP2 20 Q3 R26 R27
25 RC5/SDO RD1/PSP1 19 Q4 270 270

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

11

12
VDD

R1 LED1 LED2 LED3 LED4


S1 R2 a 7 LED7S a 7 LED7S a 7 LED7S a 7 LED7S
S2 R3 b 6 a b 6 a b 6 a b 6 a
S3 R4 c 4 b c 4 b c 4 b c 4 b
S4 R5
R d 2 c d 2 c d 2 c d 2 c
S5 R6
R e 1 d e 1 d e 1 d e 1 d
S6 R7
R f 9 e f 9 e f 9 e f 9 e
S7 R8
R g 10 f g 10 f g 10 f g 10 f
S8 R p 5 g p 5 g p 5 g p 5 g
C1

C2

C1

C2

C1

C2

C1

C2
R p p p p
R
100X8
3

8
R9 4K7 Q1 R10 4K7 Q2 R11 4K7 Q3 R12 4K7 Q4

A1013 A1013 A1013 A1013


VDD

Q1
Q2
Q3
Q4 32
BÀI TẬP
10. Cho phép nhập vào các số 0000 đến 9999 từ bàn phím và hiển thị trên 4 led
7 đoạn. Nếu số nhập vào > 100, led D11 sáng; số > 500: cả 2 led D11 và D12
sáng. Chọn nút “F” là nút xóa (CLEAR) số nhập vào.
Quét phím và led 7 đoạn dùng ngắt timer1
Setup_timer_1(T1_INTERNAL| T1_DIV_BY_1)

HƢỚNG DẪN:
Quét phím ma trận: cấu hình PORT C với 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.

33
KIỂM TRA GIỮA KỲ (vẽ mạch và ghi đúng đề)

ĐỀ 01: Viết chƣơng trình hiển thị các led sáng dần từ D1 đến D8
sau đó tắt dần từ D8 đến D1 lặp lại quá trình 10 lần (delay 200ms)
ĐỀ 02: Viết chƣơng trình hiển thị các led tắt dần từ D8 đến D1 sau
đó sáng dần từ D1 đến D8 lặp lại quá trình 8 lần (delay 350ms)

ĐỀ 03: Viết chƣơng trình hiển thị các led tắt dần từ D1 đến D8 sau
đó sáng dần từ D8 đến D1 lặp lại quá trình 47 lần (delay 400ms)

ĐỀ 04: Viết chƣơng trình hiển thị các led tắt dần từ D8 đến D1 sau
đó sáng/tắt 8 led 3 lần và lặp lại quá trình 17 lần (delay 300ms)

34

You might also like