Professional Documents
Culture Documents
Bai 004 VXL Pic Port PDF
Bai 004 VXL Pic Port PDF
Bai 004 VXL Pic Port PDF
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
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ù
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.
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.
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ộ.
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
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.
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.
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
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_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
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: 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);
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);
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
#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
#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
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
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
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
#INCLUDE <16F877A.H>
#FUSES NOWDT,PUT,HS,NOPROTECT,NOLVP
#USE DELAY(CLOCK=20000000)
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.
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ù
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
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};
46 Baøi 4: Caáu hình port vaø leänh C duøng cho caùc port cuûa PIC