Bai 004 VXL Pic Port PDF

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 20

BÀI 4

 GIỚI THIỆU
 CÁC PORT XUẤT NHẬP IO
 PORTA và thanh ghi TRISA
 PORTB và thanh ghi TRISB
 PORTC và thanh ghi TRISC
 PORTD và thanh ghi TRISD
 PORTE và thanh ghi TRISE

 TẬP LỆNH C CHO CÁC PORT


 LỆNH SET_TRIS_X() - LỆNH ĐỊNH CẤU HÌNH VÀO/RA CHO PORT
 LỆNH OUTPUT_X(VALUE) - XUẤT DỮ LIIỆU 8 BIT RA PORT
 LỆNH OUTPUT_HIGH(PIN) - LỆNH LÀM 1 CHÂN CỦA PORT LÊN MỨC CAO
 LỆNH OUTPUT_LOW(PIN) - LỆNH LÀM 1 CHÂN CỦA PORT XUỐNG MỨC 0
 LỆNH OUTPUT_TOGGLE(PIN) - LỆNH ĐẢO TRẠNG THÁI CỦA 1 CHÂN
 LỆNH OUTPUT_BIT(PIN,VALUE) - LỆNH XUẤT DỮ LIỆU RA 1 CHÂN
 LỆNH value = GET_TRIS_x() - LỆNH ĐỌC THANH GHI ĐỊNH CẤU HÌNH
 LỆNH value = INPUT(pin) - LỆNH ĐỌC DỮ LIỆU TỪ 1 CHÂN CỦA PORT
 LỆNH INPUT_STATE() - LỆNH ĐỌC TRẠNG THÁI NGÕ VÀO
 Value = INPUT_x()
 LỆNH INPUT_STATE() - LỆNH ĐỌC TRẠNG THÁI NGÕ VÀO
 LỆNH OUTPUT_DRIVE(PIN) - LỆNH ĐỌC TRẠNG THÁI NGÕ VÀO
 LỆNH OUTPUT_FLOAT(PIN) - LỆNH THÃ NỖI CHÂN TÍN HIỆU
 LỆNH PORT_B_PULLUP( ) - LỆNH TREO PORT B QUA ĐIỆN TRỞ LÊN NGUỒN

 CÁC CHƯƠNG TRÌNH VÍ DỤ CHO CÁC PORT


Ñaïi hoïc sö phaïm kyõ thuaät tp HCM Khoa ñieän – ñieän töû Nguyeãn Ñình Phuù
I. GIỚI THIỆU
Vi điều khiển có các port để xuất nhập dữ liệu giao tiếp với các đối tƣợng điều khiển. Tín hiệu điều
khiển từ CPU gởi ra port để điều khiển, đồng thời có các port nhận dữ liệu về để xử lý. Trong một hệ thống
luôn có các tín hiệu vào ra ví nhƣ hệ thống điều khiển robo nhƣ hình sau:

Hình 4-1: Sơ đồ kết nối port với đối tượng điều khiển.
Mỗi vi điều khiển khác nhau có cấu hình các port cũng khác nhau, phần này sẽ khảo sát các port của
vi điều khiển PIC bao gồm port A, B, C, D , E và các lệnh ngôn ngữ C liên quan đến các port.
Mỗi port của vi điều khiển PIC gồm có thanh ghi port và thanh ghi định hƣớng cho Port ví dụ nhƣ
hình 4-2 là PORTA và TRISA. Bit của thanh ghi định hƣớng TRIS bằng 0 thì port có chức năng xuất dữ
liệu, nếu bằng 1 thì có chức năng nhập dữ liệu.
Chú ý: '0' tƣơng ứng với 'OUT', '1' tƣơng ứng với 'IN'.

Hình 4-2: Sơ đồ kết nối port: xuất nhập tín hiệu điều khiển.
Phần tiếp sẽ khảo sát chi tiết từng port.
II. CÁC PORT XUẤT NHẬP (IO)
1. PORTA và thanh ghi TRISA:
28 Baøi 4: Caáu hình port vaø leänh C duøng cho caùc port cuûa PIC
Ñaïi hoïc sö phaïm kyõ thuaät tp HCM Khoa ñieän – ñieän töû Nguyeãn Ñình Phuù
PORTA là port hai chiều 6 bit, thanh ghi định hƣớng là TRISA.

Chân RA4 đƣợc đa hợp với ngõ vào xung clock của module Timer0 có tên là RA4/T0CKI – có cấu
hình Schmitt trigger và cực máng để hở. Tất cả các chân còn lại của PORTA ở chuẩn TTL khi nó là ngõ vào
và khi xuất dữ liệu thì theo chuẩn CMOS.

Hình 4-3: Sơ đồ mạch chân RA3:RA0. Hình 4-4: Sơ đồ mạch chân RA4/T0CKI.
Những chân khác của PortA đƣợc đa hợp với các ngõ vào tƣơng tự cho các bộ chuyển đổi A/D và các
bộ so sánh. Thanh ghi ADCON1 sẽ thiết lập các bit cho portA làm việc tƣơng tự hay số.
Thanh ghi TRISA điều khiển hƣớng cho PortA cho dù portA sử dụng cho ngõ vào tƣơng tự. Khi sử
dụng portA là ngõ vào tƣơng tự thì bit tƣơng ứng trong thanh ghi TRISA phải bằng 1.
Các chức năng của PortA.
TÊN BIT# KIỂU ĐỆM CHỨC NĂNG
RA0/AN0 Bit 0 TTL I/O
RA1/AN1 Bit 1 TTL I/O
RA2/AN2/VREF-/CVREF Bit 2 TTL I/O hoặc VREF- hoặc VCREF
RA3/AN3/VREF+ Bit 3 TTL I/O hoặc VREF+
RA4/T0CKI/C1OUT Bit 4 TTL I/O hoặc ngõ vào xung clock cho
Timer0 hoặc ngõ ra bộ so sánh 1
Baøi 4: Caáu hình port vaø leänh C duøng cho caùc port cuûa PIC 29
Ñaïi hoïc sö phaïm kyõ thuaät tp HCM Khoa ñieän – ñieän töû Nguyeãn Ñình Phuù

RA5/AN4/ SS /C2OUT Bit 5 TTL I/O hoặc ngõ vào tƣơng tự

Hình 4-5: Sơ đồ mạch chân RA5.


Tóm tắt các thanh ghi liên kết với PortA.

2. PORTB và thanh ghi TRISB:


PortB là port hai chiều 8 bit. Thanh ghi định hƣớng là TRISB.

Ba chân của PortB là RB3/PGM, RB6/PGC và RB7/PGD đƣợc đa hợp với mạch điện gỡ rối bên trong
và mạnh lập trình điện áp thấp để nạp chƣơng trình vào bộ nhớ nội. Sơ đồ kết nối mạch nạp và mạch gỡ rối:

30 Baøi 4: Caáu hình port vaø leänh C duøng cho caùc port cuûa PIC
Ñaïi hoïc sö phaïm kyõ thuaät tp HCM Khoa ñieän – ñieän töû Nguyeãn Ñình Phuù

Hình 4-6: Các chân PortB giao tiếp với mạch nạp, gỡ rối.
Mỗi chân của PortB đều có điện trở kéo lên. Bit RBPU (OPTION_REG<7>) nếu bằng 0 thì sẽ treo
tất cả các port qua điện trở lên nguồn. Khi PortB đƣợc thiết lập là các ngõ ra thì sẽ tự động tắt chức năng
điện trở kéo lên, tƣơng tự khi CPU bị reset.

Hình 4-6: Sơ đồ kết nối port với đối tượng điều khiển.
Khi port dùng để kết nối với nút nhấn thì cần phải dùng điện trở kéo lên nguồn để tạo mức logic 1, khi
nhấn nút thì ngắn mạch ngõ vào xuống mức 0, xem hình 4-6. Trong ứng dụng này phải cần điện trở kéo lên.
Với ứng dụng port điều khiển đối tƣợng là led thì không cần dùng điện trở kéo lên.
Bốn chân từ RB4 đến RB7 phát sinh ngắt khi có sự thay đổi mức logic. Chỉ có những chân đƣợc thiết
lập ở cấu hình là ngõ vào thì mới có chức năng ngắt. Các chân ngõ vào (RB7:RB4) đƣợc so sánh với giá trị
cũ đã đƣợc chốt trong lần đọc trƣớc của PortB. Các ngõ ra không trùng nhau của các chân RB4:RB7 đƣợc
OR lại với nhau để tạo ngắt ở PortB với bit cờ báo ngắt RBIF (INTCON<0>).
Ngắt portB có thể kích hoạt vi điều khiển trở lại trạng thái hoạt động nếu đang ở chế độ ngủ (SLEEP).
Trong chƣơng trình phục vụ ngắt thì ngắt có thể xóa bằng các cách sau:
o Bất kỳ lệnh đọc hay ghi PortB. Điều này sẽ kết thúc điều kiện không tƣơng thích.
o Xóa bit cờ RBIF.
Điều kiện không tƣơng thích sẽ tiếp tục làm cờ báo ngắt RBIF bằng 1. Khi đọc PortB sẽ chấm dứt
điều kiện không tƣơng thích và cho phép xóa bit cờ báo ngắt RBIF.

Baøi 4: Caáu hình port vaø leänh C duøng cho caùc port cuûa PIC 31
Ñaïi hoïc sö phaïm kyõ thuaät tp HCM Khoa ñieän – ñieän töû Nguyeãn Ñình Phuù

Hình 4-12: Sơ đồ mạch các chân RB3:RB0. Hình 4-13: Sơ đồ mạch các chân RB7:RB4.
Ngắt không tƣơng thích của PortB có điện trở kéo lên dễ dàng cho phép giao tiếp với phím hoặc bàn
phím ma trận.

Hình 4-14: Sơ đồ kết nối port với đối tượng điều khiển.

Tên Bit# Kiểu đệm Chức năng


RB0/INT Bit 0 TTL/ST I/O hoặc ngõ vào ngắt. Có lập trình điện trở kéo lên.
RB1 Bit 1 TTL I/O Có lập trình điện trở kéo lên.
RB2 Bit 2 TTL I/O Có lập trình điện trở kéo lên.
RB3/PGM Bit 3 TTL I/O hoặc lập trình ở chế độ LVP.
Có lập trình điện trở kéo lên.
RB4 Bit 4 TTL I/O (ngắt khi có thay đổi). Có lập trình điện trở kéo lên.
RB5 Bit 5 TTL I/O (ngắt khi có thay đổi). Có lập trình điện trở kéo lên.
RB6/PGC Bit 5 TTL/ST I/O (ngắt khi có thay đổi) hoặc chân mạch gỡ rối.
Có lập trình điện trở kéo lên. Xung lập trình nối tiếp.
RB7/PGD Bit 5 TTL/ST I/O (ngắt khi có thay đổi) hoặc chân mạch gỡ rối.
32 Baøi 4: Caáu hình port vaø leänh C duøng cho caùc port cuûa PIC
Ñaïi hoïc sö phaïm kyõ thuaät tp HCM Khoa ñieän – ñieän töû Nguyeãn Ñình Phuù
Có lập trình điện trở kéo lên. Dữ liệu lập trình nối tiếp.
Các thanh ghi liên quan đến portB:

3. PORTC và thanh ghi TRISC:


PortC là port hai chiều 8 bit. Thanh ghi định hƣớng là TRISC. Khi bit TRISC =1 thì PORTC là port
nhập, khi bit TRISC= 0 thì PORTC là port xuất.
PortC đa hợp với các chức năng ngoại vi, các chân PortC có mạch đệm Schmitt Trigger ở ngõ vào.
Khi khối I2C đƣợc cho phép thì các chân PORTC<4:3> có thể đƣợc định cấu hình ở các mức I2C hoặc
mức SMBUS bằng cách sử dụng bit CKE (SSPSTAT<6>).
Khi cho phép các chức năng ngoại vi nên chú ý đến các bit TRISC cho mỗi chân của PORTC. Ngƣời
sử dụng tham chiếu tới phần thiết bị ngoại vi tƣơng ứng để thiết lập cho đúng bit TRISC.

Hình 4-15: Sơ đồ các chân RC7:RC5 và RC2:RC0. Hình 4-16: Sơ đồ mạch các chân RC4:RC3.

TÊN BIT# KIỂU CHỨC NĂNG


ĐỆM
RC0/T1OSO/T1CKI Bit 0 ST I/O hoặc ngõ ra bộ dao động

Baøi 4: Caáu hình port vaø leänh C duøng cho caùc port cuûa PIC 33
Ñaïi hoïc sö phaïm kyõ thuaät tp HCM Khoa ñieän – ñieän töû Nguyeãn Ñình Phuù
Timer1/ngõ vào xung của Timer1.
RC1/T1OSI/CCP2 Bit 1 ST I/O hoặc ngõ vào bộ dao động
Timer1/ngõ vào Capture, ngõ ra
compare2/ngõ ra PWM.
RC2/CCP1 Bit 2 ST I/O hoặc ngõ vào Capture1/ngõ ra
Compare1/ngõ ra PWM.
RC3/SCK/SCL Bit 3 ST RC3 cũng có thể là xung clock nối tiếp
đồng bộ cho chế độ SPI và I2C.
RC4/SDI/SDA Bit 4 ST RC4 cũng có thể là dữ liệu SPI hoặc dữ
liệu xuất/nhập (chế độ I2C).
RC5/SDO Bit 5 ST I/O hoặc ngõ ra dữ liệu port nối tiếp
đồng bộ.
RC6/TX/CK Bit 6 ST I/O hoặc truyền bất đồng bộ USART
hoặc xung đồng bộ.
RC7/RX/DT Bit 7 ST I/O hoặc nhận bất đồng bộ USART
hoặc dữ liệu đồng bộ.

4. PORTD và thanh ghi TRISD:


PortD là port 8 bit với ngõ vào có mạch Schmitt Trigger. Thanh ghi TRISD sẽ cấu hình là ngõ vào
hoặc ngõ ra.
PortD có thể định cấu hình nhƣ port của vi xử lý 8 bit bằng cách thiết lập bit điều khiển PSPMODE
(TRISE<4>). Trong cấu hình này thì các bộ đệm ngõ vào dạng TTL.
Chú ý: PortD và TRISD không đƣợc xây dựng cho chip PIC 28 chân.

Hình 4-17: Sơ đồ mạch các chân PORTD.


Các thanh ghi kết nối với PortD.

34 Baøi 4: Caáu hình port vaø leänh C duøng cho caùc port cuûa PIC
Ñaïi hoïc sö phaïm kyõ thuaät tp HCM Khoa ñieän – ñieän töû Nguyeãn Ñình Phuù
Các chức năng của PortD.
BIT# KIỂU ĐỆM CHỨC NĂNG
TÊN
RD0/PSP0 Bit 0 ST/TTL Port I/O hoặc bit 0 của port song song
RD1/PSP1 Bit 1 ST/TTL Port I/O hoặc bit 1 của port song song
RD2/PSP2 Bit 2 ST/TTL Port I/O hoặc bit 2 của port song song
RD3/PSP3 Bit 3 ST/TTL Port I/O hoặc bit 3 của port song song
RD4/PSP4 Bit 4 ST/TTL Port I/O hoặc bit 4 của port song song
RD5/PSP5 Bit 5 ST/TTL Port I/O hoặc bit 5 của port song song
RD6/PSP6 Bit 6 ST/TTL Port I/O hoặc bit 6 của port song song
RD7/PSP7 Bit 7 ST/TTL Port I/O hoặc bit 7 của port song song

5. PORTE và thanh ghi TRISE:

PORTE có 3 chân: RE0/ RD /AN5, RE1/ WR /AN6 và RE2/ CS /AN7 có cấu hình độc lập để thiết lập
ngõ vào hoặc ngõ ra. Những chân này có mạch điện Schmitt Trigger ở ngõ vào.
PORTE là port nhập khi bit PSPMODE (TRISE<4>) bằng 1, các bit TRISE<0:2> phải bằng 1 và cấu
hình các bit trong thanh ghi ADCON1 để portE là xuất/nhập số. Trong chế độ này, bộ đệm ngõ vào dạng
TTL.
PORTE cũng đa hợp với các ngõ vào tƣơng tự. Khi định cấu hình là ngõ vào tƣơng tự thì khi đọc các
chân này sẽ có giá trị là „0‟.
Các thanh ghi kết nối với PORTE.

Hình 4-18: Sơ đồ mạch các chân PORTE.


Các chức năng của PORTE.

Baøi 4: Caáu hình port vaø leänh C duøng cho caùc port cuûa PIC 35
Ñaïi hoïc sö phaïm kyõ thuaät tp HCM Khoa ñieän – ñieän töû Nguyeãn Ñình Phuù
TÊN BIT# KIỂU ĐỆM CHỨC NĂNG
RE0/ RD /AN5 Bit 0 ST/TTL I/O hoặc ngõ ra điều khiển đọc port song
song hoặc ngõ vào tƣơng tự.
RE1/ WR /AN6 Bit 1 ST/TTL I/O hoặc ngõ ra điều khiển ghi port song
song hoặc ngõ vào tƣơng tự.
RE2/ CS /AN7 Bit 2 ST/TTL I/O hoặc ngõ ra chọn lựa port song song
hoặc ngõ tƣơng tự.
CS  1 : VĐK tớ không đƣợc chọn.
CS  0 : VĐK tớ đƣợc chọn.

Trạng thái port song song/các bit điều khiển:


Bit 7 IBF: bit báo trạng thái bộ đệm ngõ vào đầy (Input Buffer Full Status bit):
1= một word đã nhận và đang chờ CPU đọc.
0= không có word nào đƣợc nhận.
Bit 6 OBF: bit báo trạng thái bộ đệm ngõ ra đầy (Output Buffer Full Status bit):
1= bộ đệm ngõ ra vẫn còn giữ word đã ghi trƣớc đó.
0= bộ đệm ngõ ra đã đƣợc đọc.
Bit 5 IBOV: bit phát hiện tràn bộ đệm ngõ vào (Input Buffer Overflow Detect bit):
1= quá trình ghi xảy khi word ngõ vào trƣớc đó chƣa đƣợc đọc.
0= không xảy ra tràn.
Bit 4 PSPMODE: Bit chọn lựa chế độ port song song
1= PORTD đƣợc định ở chế độ là port song song.
0= PORTD đƣợc định ở chế độ là port xuất nhập.
Bit 3 Chƣa dùng: đọc là „0‟
Các bit ở PORTE là các bit dữ liệu trực tiếp:
Bit 2 Bit 2: bit điều khiển hƣớng cho chân RE2/ CS /AN7
1= ngõ vào.
0= ngõ ra.
Bit 1 Bit 1: bit điều khiển hƣớng cho chân RE1/ WR /AN6
1= ngõ vào.
0= ngõ ra.
Bit 0 Bit 0: bit điều khiển hƣớng cho chân RE0/ RD /AN5
1= ngõ vào.
0= ngõ ra.
III. TẬP LỆNH C CHO CÁC PORT
Các lệnh của ngôn ngữ lập trình C liên quan đến các port bao gồm:
Lệnh OUTPUT_FLOAT()
Lệnh OUTPUT_LOW()
Lệnh OUTPUT_HIGH()
Lệnh OUTPUT_TOGGLE()
Lệnh OUTPUT_BIT()
Lệnh OUTPUT_X()
36 Baøi 4: Caáu hình port vaø leänh C duøng cho caùc port cuûa PIC
Ñaïi hoïc sö phaïm kyõ thuaät tp HCM Khoa ñieän – ñieän töû Nguyeãn Ñình Phuù

Lệnh SET_TRIS_X()
Lệnh GET_TRIS_X()
Lệnh INPUT_X()
Lệnh INPUT()

Lệnh PORT_A_PULLUPS()
Lệnh PORT_B_PULLUPS()
Lệnh INPUT_STATE()
Lệnh OUTPUT_DRIVE()
1. LỆNH SET_TRIS_X() - LỆNH ĐỊNH CẤU HÌNH VÀO/RA CHO PORT

Cú pháp: set_tris_x(value); thiết lập cấu hình INPUT/OUTPUT cho portx


Thông số: value là 1 số nguyên 8 bit tƣơng ứng với các bit của port I/O.
Chức năng: các lệnh có chức năng định hƣớng cho các port I/O (TRI-State). Mỗi bit tƣơng ứng 1 chân.
Mức 1 thì chân tƣơng ứng là ngõ vào, mức 0 thì chân là ngõ ra
Có hiệu lực: cho tất cả các vi điều khiển PIC.
Ví dụ: SET_TRIS_B (0x0F); // 0F=00001111: B7- B4 là ngõ ra, B3-B0 là ngõ vào.

2. LỆNH OUTPUT_X(VALUE) - XUẤT DỮ LIIỆU 8 BIT RA PORTX

Cú pháp: output_x (value)


Thông số: value là hằng số 8 bit kiểu int
Chức năng: Xuất dữ liệu 1 byte ra 1 port.
Có hiệu lực: Lệnh này áp dụng cho tất cả các port.
Ví dụ: OUTPUT_B(0xF0); xuất dữ liệu F0 ra portB

3. LỆNH OUTPUT_HIGH(PIN) - LỆNH LÀM 1 CHÂN CỦA PORT LÊN MỨC CAO

Cú pháp: output_high(pin); tƣơng đƣơng lệnh BSF PORTX,B


Thông số: pin là chân xuất dữ liệu - hãy xem file định nghĩa của thiết bị "device.h" để biết tên chính xác.
Chức năng: làm 1 chân của port lên mức cao.
Có hiệu lực: lệnh này áp dụng cho tất cả các thiết bị.
Ví dụ OUTPUT_HIGH(PIN_A0); // làm cho chân RA0 của port A lên 1

4. LỆNH OUTPUT_LOW(PIN) - LỆNH LÀM 1 CHÂN CỦA PORT XUỐNG MỨC 0

Cú pháp: output_low(pin); tƣơng đƣơng lệnh BCF PORTX,B


Thông số: pin là chân xuất dữ liệu - hãy xem file định nghĩa của thiết bị "device.h" để biết tên chính xác.
Chức năng: làm 1 chân của port xuống mức thấp.
Có hiệu lực: lệnh này áp dụng cho tất cả các thiết bị.
Ví dụ output_low(pin_a0); // làm cho chân RA0 của PortA xuống mức 0

5. LỆNH OUTPUT_TOGGLE(PIN) - LỆNH ĐẢO TRẠNG THÁI CỦA 1 CHÂN

Cú pháp: output_toggle(pin);
Thông số: pin là chân xuất dữ liệu - hãy xem file định nghĩa của thiết bị "device.h" để biết tên chính xác.

Baøi 4: Caáu hình port vaø leänh C duøng cho caùc port cuûa PIC 37
Ñaïi hoïc sö phaïm kyõ thuaät tp HCM Khoa ñieän – ñieän töû Nguyeãn Ñình Phuù
Chức năng: làm đảo trạng thái 1 chân của port.
Có hiệu lực: lệnh này áp dụng cho tất cả các thiết bị.
Ví dụ OUTPUT_TOGGLE(PIN_B0); // đảo trạng thái chân RB0 của port B

6. LỆNH OUTPUT_BIT(PIN,VALUE) - LỆNH XUẤT DỮ LIỆU RA 1 CHÂN

Cú pháp: output_bit(pin,value);
Thông số: pin là chân xuất dữ liệu - hãy xem file định nghĩa của thiết bị "device.h" để biết tên chính xác.
Chức năng: xuất dữ liệu 0 hoặc 1 ra 1 chân của port.
Có hiệu lực: lệnh này áp dụng cho tất cả các thiết bị.
Ví dụ: output_bit(pin_b0,0); // xuất dữ liệu 0 ra RB0

7. LỆNH value = GET_TRIS_X() - LỆNH ĐỌC THANH GHI ĐỊNH CẤU HÌNH

Cú pháp: value = get_tris_x();


Thông số: không có thông số
Kết quả trả về: là byte dữ liệu đã định cấu hình từ thanh ghi TRIS
Chức năng: kết quả trả về là giá trị của thanh ghi TRIS của các port A, B, C or D.
Có hiệu lực: lệnh này áp dụng cho tất cả các thiết bị.

8. LỆNH value = INPUT(pin) - LỆNH ĐỌC DỮ LIỆU TỪ 1 CHÂN CỦA PORT

Cú pháp: value = input(pin);


Thông số: pin là chân để đọc - hãy xem file định nghĩa của thiết bị "device.h" để biết tên chính xác
Kết quả trả về: 0 (or FALSE) nếu chân ở mức thấp, 1 (or TRUE) nếu chân ở mức cao.
Chức năng: đọc dữ liệu 1 bit từ 1 chân của port, chân này phải ở cấu hình là chân vào.
Có hiệu lực: lệnh này áp dụng cho tất cả các thiết bị.
Ví dụ while (! Input (PIN_B1)); //đợi cho đến khi chân Rb1 lên mức cao
If (input(PIN_A0))
Printf(“A0 is now high \r\n”);
Int16 i = PIN_B1
Whiel (!i); //đợi chân RB1 lên mức cao

9. LỆNH INPUT_STATE() - LỆNH ĐỌC TRẠNG THÁI NGÕ VÀO

Cú pháp: value = input_state(pin);


Thông số: pin là chân để đọc - hãy xem file định nghĩa của thiết bị "device.h" để biết tên chính xác
Trả về: kết quả đọc bằng 1 nếu chân đọc ở mức cao, kết quả đọc bằng 0 nếu chân đọc ở mức thấp.
Chức năng: lệnh đọc mức logic của 1 chân nhƣng không làm thay đổi hƣớng của chân.
Có hiệu lực: lệnh này áp dụng cho tất cả các thiết bị.
Ví dụ level = input_state(pin_A3);

10. Value = INPUT_X() - LỆNH ĐỌC DỮ LIỆU TỪ PORTX


38 Baøi 4: Caáu hình port vaø leänh C duøng cho caùc port cuûa PIC
Ñaïi hoïc sö phaïm kyõ thuaät tp HCM Khoa ñieän – ñieän töû Nguyeãn Ñình Phuù
Cú pháp: value = input_x();
Thông số: không có.
Kết quả trả về: là dữ liệu 8 bit của portx.
Chức năng: lệnh đọc mức logic của 1 chân nhƣng không làm thay đổi hƣớng của chân.
Có hiệu lực: lệnh này áp dụng cho tất cả các thiết bị.

11. LỆNH INPUT_STATE() - LỆNH ĐỌC TRẠNG THÁI NGÕ VÀO

Cú pháp: value = input_state(pin);


Thông số: pin là chân để đọc - hãy xem file định nghĩa của thiết bị "device.h" để biết tên chính xác
Trả về: kết quả đọc bằng 1 nếu chân đọc ở mức cao, kết quả đọc bằng 0 nếu chân đọc ở mức thấp.
Chức năng: lệnh đọc mức logic của 1 chân nhƣng không làm thay đổi hƣớng của chân.
Có hiệu lực: lệnh này áp dụng cho tất cả các thiết bị.
Ví dụ level = input_state(pin_A3);
12. LỆNH OUTPUT_DRIVE(PIN) - LỆNH ĐỌC TRẠNG THÁI NGÕ VÀO

Cú pháp: output_drive(pin);
Thông số: pin là chân đƣợc định nghĩa trong file "device.h".
Trả về: không có.
Chức năng: thiết lập chân (pin) là chế độ xuất.
Có hiệu lực: lệnh này áp dụng cho tất cả các thiết bị.
Ví dụ output (pin_A0);

13. LỆNH OUTPUT_FLOAT(PIN) - LỆNH THÃ NỖI CHÂN TÍN HIỆU

Cú pháp: output_float(pin);
Thông số: pin là chân đƣợc định nghĩa trong file "device.h".
Trả về: không có.
Chức năng: thiết lập chân (pin) là chế độ nhập và thả nỗi chân tín hiệu này để thiết bị khác ở bên ngoài
toàn quyền điều khiển chân này để đƣa dữ liệu vào vi điều khiển.
Có hiệu lực: lệnh này áp dụng cho tất cả các thiết bị.
Ví dụ if ((data & 0x80) == 0)
Output_low (pin_A0);
else output_float (pin_A0);

14. LỆNH PORT_B_PULLUP( ) - LỆNH TREO PORT B QUA ĐIỆN TRỞ LÊN NGUỒN

Cú pháp: port_b_pullup(value);
Thông số: value có 2 giá trị là true và false.
Trả về: không có.
Chức năng: thiết lập port B treo lên nguồn qua điện trở kéo lên bên trong. Nếu value là true thì treo lên
nguồn, nếu là false thì không treo.
Có hiệu lực: lệnh này áp dụng cho tất cả các thiết bị.

Baøi 4: Caáu hình port vaø leänh C duøng cho caùc port cuûa PIC 39
Ñaïi hoïc sö phaïm kyõ thuaät tp HCM Khoa ñieän – ñieän töû Nguyeãn Ñình Phuù
Ví dụ port_b_pullup(false);

IV. CÁC CHƯƠNG TRÌNH VÍ DỤ CHO CÁC PORT

BÀI 4-1 –ĐIỀU KHIỂN: 4 LED SÁNG VÀ 4 LED TẮT SỬ DỤNG PORTB

#INCLUDE <16F877A.H>
#FUSES NOWDT,PUT,HS,NOPROTECT,NOLVP

VOID MAIN()
{ SET_TRIS_B(0x00); //PORTB LA OUTPUT
WHILE(1)
{
OUTPUT_B(0x0F); //4 LED TAT 4 LED SANG
}
}

BÀI 4-2 – ĐIỀU KHIỂN 8 LED CỦA PORTB CHÓP TẮT 8 LED

LỆNH: DELAY_MS(VALUE) - DELAY MS


LỆNH: DELAY_US(VALUE) - DELAY µS

#INCLUDE <16F877A.H>
#FUSES NOWDT,PUT,HS,NOPROTECT,NOLVP
#USE DELAY(CLOCK=20000000) //CRYSTAL = 20MHZ
VOID MAIN()
{ SET_TRIS_B(0x00); //PORTB LA OUTPUT
WHILE(1)
{ OUTPUT_B(0xFF); //8 LED SANG
DELAY_MS(1000); // GOI HAM DELAY

OUTPUT_B(0x00); // 8 LED TAT


DELAY_MS(1000);
}
}

BÀI 4-3 – PORTB CHÓP TẮT 8 LED 5 LẦN

#INCLUDE <16F877A.H>
#FUSES NOWDT,PUT,HS,NOPROTECT,NOLVP
#USE DELAY(CLOCK=20000000)
INT I;
VOID MAIN()
{ SET_TRIS_B(0x00); //PORTB LA OUTPUT
I=0;
WHILE(I<5)
{ OUTPUT_B(0xFF); //8 LED SANG
DELAY_MS(500); // GOI HAM DELAY

OUTPUT_B(0x00); // 8 LED TAT

40 Baøi 4: Caáu hình port vaø leänh C duøng cho caùc port cuûa PIC
Ñaïi hoïc sö phaïm kyõ thuaät tp HCM Khoa ñieän – ñieän töû Nguyeãn Ñình Phuù
DELAY_MS(500);
I++; //TANG I LEN 1
}
}

BÀI 4-4 – PORTB CÓ 1 LED CHÓP TẮT NỐI VỚI RB0 – CÁC BIT CÕN LẠI KHÔNG ẢNH HƯỞNG
#INCLUDE <16F877A.H>
#FUSES NOWDT,PUT,HS,NOPROTECT,NOLVP
#USE DELAY(CLOCK=20000000)

VOID MAIN()
{ SET_TRIS_B(0x00); //PORTB LA OUTPUT
WHILE(1)
{ OUTPUT_HIGH(PIN_B0); // LED SANG
DELAY_MS(100); // GOI HAM DELAY

OUTPUT_LOW(PIN_B0); // LED TAT


DELAY_MS(100);
}
}

BÀI 4-5 – ĐÈN GIAO THÔNG XANH SÁNG 15S, VÀNG 5 GIÂY, ĐỎ 21GIÂY,
CHƯA HIỂN THỊ THỜI GIAN

#INCLUDE <16F877A.H>
#FUSES NOWDT,PUT,HS,NOPROTECT,NOLVP
#USE DELAY(CLOCK=20000000)
#DIFINE X1D2 0X84 ; //1000 0100
#DIFINE V1D2 0X44 ; //0100 0100
#DIFINE D1X2 0X21 ; //0010 0001
#DIFINE D1V2 0X22 ; //0010 0010

VOID MAIN()
{ SET_TRIS_B(0x00); //PORTB LA OUTPUT
WHILE(1)
{ OUTPUT_B(X1D2); //10000100
DELAY_MS(15000); // GOI HAM DELAY

OUTPUT_B(V1D2);
DELAY_MS(5000);

OUTPUT_B(D1X2);
DELAY_MS(15000);

OUTPUT_B(D1V2);
DELAY_MS(5000);
}
}

BÀI 4-6 – PORTB 1 LED CHÓP TẮT NỐI VỚI RB0 DÙNG LỆNH OUTPUT_TOGGLE()
#INCLUDE <16F877A.H>
#FUSES NOWDT,PUT,HS,NOPROTECT,NOLVP
#USE DELAY(CLOCK=20000000)
Baøi 4: Caáu hình port vaø leänh C duøng cho caùc port cuûa PIC 41
Ñaïi hoïc sö phaïm kyõ thuaät tp HCM Khoa ñieän – ñieän töû Nguyeãn Ñình Phuù

VOID MAIN()
{ SET_TRIS_B(0x00);
WHILE(1)
{ OUTPUT_TOGGLE(PIN_B0); // ÑAÛO TT CUÛA LED
DELAY_MS(100); // GOI HAM DELAY
}
}

BÀI 4-7 – PORTB 1 LED CHÓP TẮT NỐI VỚI RB0 DÙNG LỆNH OUTPUT_BIT(PIN,VALUE)
#INCLUDE <16F877A.H>
#FUSES NOWDT,PUT,HS,NOPROTECT,NOLVP
#USE DELAY(CLOCK=20000000)

VOID MAIN()
{ SET_TRIS_B(0x00); //PORTB LA OUTPUT
WHILE(1)
{ OUTPUT_BIT(PIN_B4,0); // LED TAT
DELAY_MS(100); // GOI HAM DELAY

OUTPUT_BIT(PIN_B4,1); // LED SANG


DELAY_MS(100);
}

V. CÁC CHƯƠNG TRÌNH VÍ DỤ ĐIỀU KHIỂN LED 7 ĐOẠN

CAÙCH KHAI BAÙO KIEÅU HAÈNG SOÁ MAÛNG KÍ TÖÏ


CONST UNSIGNED CHAR
MA7DOAN[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80, 0x90};

CAÙCH KHAI BAÙO BIEÁN KIEÅU SOÁ NGUYEÂN – KIEÅU INTEGER:


INT DONVI; - KHAI BAÙO BIEÁN DONVI 8 BIT;
INT16 DONVI; - KHAI BAÙO BIEÁN DONVI 16 BIT;
XEM TRONG PHAÀN TRÔÏ GIUÙP CUÛA CHÖÔNG TRÌNH
Type-Specifier
int1 Defines a 1 bit number
int8 Defines an 8 bit number
int16 Defines a 16 bit number
int32 Defines a 32 bit number
char Defines a 8 bit character
float Defines a 32 bit floating point number
short By default the same as int1
Int By default the same as int8
long By default the same as int16
void Indicates no specific type

BÀI 4-8 : ĐIỂU KHIỂN LED 7 ĐOẠN ĐẾM THỜI GIAN TỪ 0 ĐẾN 9 DÙNG PORTB

42 Baøi 4: Caáu hình port vaø leänh C duøng cho caùc port cuûa PIC
Ñaïi hoïc sö phaïm kyõ thuaät tp HCM Khoa ñieän – ñieän töû Nguyeãn Ñình Phuù
SƠ ĐỒ MẠCH ĐIỆN GIAO TIẾP PIC VỚI 1 LED 7 ĐOẠN

Hình 4-19: Sơ đồ mạch điều khiển led 7 đoạn.

#INCLUDE <16F877A.H>
#FUSES NOWDT,PUT,HS,NOPROTECT,NOLVP
#USE DELAY(CLOCK=20000000)

CONST UNSIGNED CHAR


MA7DOAN[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

INT I; // BIEN DEM


UNSIGNED CHAR MI; // BIEN CHUA MA 7 DOAN

VOID MAIN()
{ SET_TRIS_B(0x00); //PORTB OUT
WHILE(1)
{
FOR (I=0; I<10; I++)
{ MI= MA7DOAN [I]; //LAY MA 7 D
OUTPUT_B(MI);
DELAY_MS(500);
}
}
}

BÀI 4-10 : ĐIỂU KHIỂN LED 7 ĐOẠN ĐẾM THỜI GIAN TỪ 9 XUỐNG 0 DÙNG PORTB

#INCLUDE <16F877A.H>
#FUSES NOWDT,PUT,HS,NOPROTECT,NOLVP
#USE DELAY(CLOCK=20000000)
CONST UNSIGNED CHAR
Baøi 4: Caáu hình port vaø leänh C duøng cho caùc port cuûa PIC 43
Ñaïi hoïc sö phaïm kyõ thuaät tp HCM Khoa ñieän – ñieän töû Nguyeãn Ñình Phuù
MA7DOAN[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80, 0x90};
SIGNED INT I; // BIEN DEM KIEU CO DAU
UNSIGNED CHAR MI; // BIEN CHUA MA 7 DOAN
VOID MAIN()
{ SET_TRIS_B(0x00); //PORTC OUT
WHILE(1)
{
FOR (I=9; I>-1; I--)
{ MI= MA7DOAN [I]; //LAY MA 7 D
OUTPUT_B(MI);
DELAY_MS(500);
}
}
}

LEÄNH WHILE(CONDITION)
{
STATEMENTS;

}
LEÄNH FOR(I=MIN-VALUE;I<MAX-VALUE;I++)
{
STATEMENTS;

}

BÀI 4-11 : ĐIỂU KHIỂN LED 7 ĐOẠN ĐẾM THỜI GIAN TỪ 00 ĐẾN 99 HIỂN THỊ TRÊN 2 LED
DÙNG PORTB VÀ PORTD.

LỆNH CHIA NGUYÊN LẤY KẾT QUẢ “/”


X = Y /10; (VÍ DỤ Y = 95 THÌ KẾT QUẢ X = 9)
LỆNH CHIA NGUYÊN LẤY SỐ DƢ “%”
Z = Y % 10; (VÍ DỤ Y = 95 THÌ KẾT QUẢ Z = 5)
SƠ ĐỒ MẠCH ĐIỆN GIAO TIẾP PIC VỚI 2 LED 7 ĐOẠN

44 Baøi 4: Caáu hình port vaø leänh C duøng cho caùc port cuûa PIC
Ñaïi hoïc sö phaïm kyõ thuaät tp HCM Khoa ñieän – ñieän töû Nguyeãn Ñình Phuù

Hình 4-20: Sơ đồ mạch điều khiển led 7 đoạn.


CHƢƠNG TRÌNH
#INCLUDE <16F877A.H>
#FUSES NOWDT,PUT,HS,NOPROTECT,NOLVP
#USE DELAY(CLOCK=20000000)
CONST UNSIGNED CHAR
MA7DOAN[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80, 0x90};

INT DEM, DONVI, CHUC; // BIEN DEM


UNSIGNED CHAR MDONVI, MCHUC; // BIEN CHUA MA 7 DOAN

VOID MAIN()
{ SET_TRIS_B(0x00); //PORTB OUT
SET_TRIS_C(0x00); // PORTC OUT

WHILE(1)
{
FOR (DEM=0;DEM<100;DEM++)
{ CHUC =DEM /10; //LAY HANG CHUC
DONVI= DEM %10; //LAY DONVI

MDONVI= MA7DOAN[DONVI]; //LAY MA 7 D


MCHUC = MA7DOAN[CHUC]; //LAY MA 7 D

OUTPUT_B(MDONVI);
OUTPUT_C(MCHUC);
DELAY_MS(300);
}
}
}

BÀI 4-12 : ĐIỂU KHIỂN LED 7 ĐOẠN ĐẾM THỜI GIAN TỪ 00 ĐẾN 99 HIỂN THỊ TRÊN 2 LED
DÙNG PORTB VÀ PORTD - DÙNG 2 VÕNG LẶP FOR.
Baøi 4: Caáu hình port vaø leänh C duøng cho caùc port cuûa PIC 45
Ñaïi hoïc sö phaïm kyõ thuaät tp HCM Khoa ñieän – ñieän töû Nguyeãn Ñình Phuù

#INCLUDE <16F877A.H>
#FUSES NOWDT,PUT,HS,NOPROTECT,NOLVP
#USE DELAY(CLOCK=20000000)
CONST UNSIGNED CHAR
MA7DOAN[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80, 0x90};

INT DONVI, CHUC;


VOID MAIN()
{ SET_TRIS_B(0x00); //PORTB OUT
SET_TRIS_C(0x00); // PORTC OUT
WHILE(1)
{
FOR (CHUC=0; CHUC<10; CHUC++)
{
FOR (DONVI=0; DONVI<10; ++DONVI)
{
OUTPUT_B(MA7DOAN[DONVI]);
OUTPUT_C(MA7DOAN[CHUC]);
DELAY_MS(300);
}
}
}
}
CÁCH NÀY CÓ HẠN CHẾ LÀ KHÔNG THỂ ĐẾM SỐ BẤT KỲ VÍ DỤ ĐẾM TỪ 00 ĐẾN 15.
http://www.mikroe.com/eng/chapters/view/2/chapter-1-pic16f887-microcontroller-device-overview/

46 Baøi 4: Caáu hình port vaø leänh C duøng cho caùc port cuûa PIC

You might also like