Cổng xuất nhập (I/O port) chính là phương tiện mà vi điều khiển dùng để tương tác với thế giới bên ngoài. Sự tương tác này rất đa dạng và thơng qua q trình tương tác đó, chức năng của vi điều khiển được thể hiện một cách rõ ràng.
Một cổng xuất nhập của vi điều khiển bao gồm nhiều chân (I/O pin), tùy theo cách bố trí và chức năng của vi điều khiển mà số lượng cổng xuất nhập và số lượng chân trong mỗi cổng có thể khác nhau. Bên cạnh đó, do vi điều khiển được tích hợp sẵn bên trong các đặc tính giao tiếp ngoại vi nên bên cạnh chức năng là cổng xuất nhập thông thường, một số chân xuất nhập cịn có thêm các chức năng khác để thể hiện sự tác động của đặc tính ngoại vi nêu trên với thế giới bên ngoài. Chức năng của từng chân xuất nhập trong mỗi cổng hồn tồn có thể được xác lập và điều khiển được thông qua thanh ghi SFR liên quan đến chân xuất nhập đó.
Vi điều khiển PIC16F877A có 5 cổng xuất nhập, bao gồm PORTA, PORTB, PORTC, PORTD, PORTE. Cấu trúc và chức năng của từng cổng xuất nhập sẽ được đề cập cụ thể ở phần sau.
• PORT A
Cổng hai chiều với độ rộng đường truyền là 6 bit. Để điều khiển việc truy xuất dữ liệu người ta dùng thanh ghi TRISA. Nếu TRISA = 1 thì lúc này cổng A sẽ tương ứng có các chân là chân vào. Nếu TRISA = 0 thì lúc này cổng A sẽ tương ứng có các chân là chân ra. Việc đọc cổng A chính là đọc trạng thái của các chân, trong khi đó việc viết phải qua việc viết các chốt của cổng. Các chân của cổng A chủ yếu được sử dụng với mục đích chính là nhận tín hiệu tương tự hoặc làm các chân vào ra. Riêng chân RA4 có thể đa hợp với chân vào bộ Timer 0 và khi đó nó trở thành chân RA4/T0CKI. Chân này như một đầu vào của Schmitt Trigger và nó mở đầu ra. Các chân khác của cổng A là chân vào với bộ TTL. Việc điều khiển các chân này thơng qua việc đặt hay xố các bít của thanh ghi ADCON1. Thanh ghi TRISA điều khiển trực tiếp các chân của cổng A, khi sử dụng các chân này để nhận tín hiệu tương tự vào ta phải chắc chắn rằng các bit của thanh ghi TRISA đã được đặt rồi.
• PORT B
Cổng B là cổng hai chiều với độ rộng đường truyền là 8 bit.Tương ứng với nó để điều khiển trực tiếp dữ liệu ta sử dụng thanh ghi TRISB. Nếu TRISB = 1 thì lúc này các chân của cổng B được định nghĩa là chân vào. Nếu TRISB = 0 thì lúc này các chân
của cổng B được định nghĩa là chân ra. Nội dung của chốt ra có thể chọn trên mỗi chân.
Có 3 chân của cổng B có thể đa hợp với các chương trình vận hành bằng điện áp thấp. Đó là các chân sau: RB3/PGM, RB6/PGC, RB7/PGD. Sự thay đổi hoạt động của những chân này được miêu tả ở trong phần đặc tính nổi bật. Mỗi chân của cổng B có một khả năng dừng bên trong nhưng yếu. Điều này được trình bày bởi việc xố bít RBPU (bit 7 của thanh ghi OPTION_REG). Khả năng dừng này sẽ tự động tắt đi khi các chân của cổng được định nghĩa là chân ra và sẽ tự động mất đi khi ta RESET. Bốn chân của cổng B, từ RB7 đến RB4 có đặc tính là ngắt khi thay đổi trạng thái. Chỉ những chân được định dạng là những chân vào thì ngắt này mới tồn tại.
• PORT C
PORT C có độ rộng là 8 bit, là port hai chiều. Thanh ghi dữ liệu trực tiếp tương ứng là TRISC. Cho tất cả các bit của TRISC là 1 thì các chân tương ứng ở PORTC là ngõ vào. Cho tất cả các bit của TRISC là 0 thì các chân tương ứng ở PORTC là ngõ ra. PORTC được đa hợp với vài chức năng ngoại vi, những chân của PORTC có đệm Trigger Schmitt ở ngõ vào.
Bên cạnh đó PORTC cịn chứa các chân chức năng của bộ so sánh, bộ Timer1, bộ PMW và các chuẩn giao tiếp nối tiếp I2C, SPI, USART.
• PORT D
PORTD là port 8 bit với đệm Trigger Schmitt ở ngõ vào. Mỗi chân có thể được cấu hình riêng lẻ như một ngõ vào hoặc ngõ ra. PORTD có thể được cấu hình như port của bộ vi xử lý rộng 8 bit (parallel slave port) bằng cách đặt bit điều khiển PSPMIDE (TRISE <4>). Trong chế độ này, đệm ở ngõ vào là TTL.
• PORT E
Cổng E có 3 chân là RE0/RD/AN5, RE1/WR/AN6, RE2/CS/AN7. Các chân này có thể sắp xếp riêng lẻ là các đầu vào hoặc các đầu ra, và các chân có vùng đệm đầu vào là các mạch Schmitt Trigger.
Cổng vào/ra E trở thành đầu vào điều khiển cho cổng vi xử lý khi bit
3.1.2.3. Các Bộ Timer của chip
Bộ vi điều khiển PIC16F87X có 3 bộ Timer đó là:Timer0, Timer1, Timer2