1. GPIO là gì?
- GPIO (General Purpose Input Output) chính là cửa ngõ giao tiếp vào/ra của vi điều khiển.
- MSP430G2553 có 2 Port P1 và P2, mỗi Port có 8 chân I/O.
- Các Port đều có các thanh ghi của riêng mình.Vd: P1IN, P2IN…
- Mỗi chân I/O được thiết lập các chức năng vào/ra một cách riêng rẽ.
1.1 Các thanh ghi liên quan đến GPIO
1.1.1. Thanh ghi định hướng PxDIR:
• Đây là các thanh ghi 8 bit điều khiển chiều của 8 chân port. P1DIR điều khiển PORT1, P2DIR điều khiển PORT2.
• Bit = 1: Chân PORT tương ứng được cấu hình thành Output .
• Bit = 0: Chân PORT tương ứng được cấu hình thành Input.
1.1.2. Thanh ghi dữ liệu vào PxIN:
• Đây là thanh ghi chỉ đọc được dữ liệu (read only), thanh ghi này có 8 bit,từ Bit 0 đến Bit 7.
• Giá trị mỗi bit tương ứng với giá trị điện áp cấp tới chân I/O của Port.
• Bit = 0 ~ chân Input ở mức thấp (khoảng 0Vdc).
• Bit = 1 ~ chân input ở mức cao (khoảng 3.3VDC).
1.1.3. Thanh ghi dữ liệu ra PxOUT:
• Đây là thanh ghi điều khiển ngõ ra của các PORT.
• Bit = 0 ~ Điện áp ở chân ouput ở mức thấp
• Bit = 1 ~ Điện áp ở chân ouput ở mức cao
• Khi sử dụng điện trở kéo trong, các bit của PxOUT sẽ qui định điện trở đó sẽ được kéo xuống đất (0VDC) hay được kéo lên nguồn
• Bit = 0 ~ điện trở được kéo xuống 0VDC
• Bit = 1 ~ điện trở được kéo lên nguồn
1.1.4. Thanh ghi cho phép tăng/giảm điện trở PxREN:
• Mỗi Bit của mỗi thanh ghi PxREN dùng để cho phép hoặc không cho phép sự tăng/giảm điện trở của các chân I/O tương ứng. Những Bit tương ứng của thanh ghi PxOUT được chọn nếu chân được tăng lên hoặc giảm xuống.
• Bit = 0: Tăng/giảm điện trở không được cho phép.
• Bit = 1: Tăng/giảm điện trở được cho phép.
1.1.5. Thanh ghi chức năng lựa chọn PxSEL và PxSEL2:
• Mỗi Bit PxSEL và PxSEL2 được sử dụng cho việc lựa chọn chức năng của các chân: Chức năng I/O xuất nhập dữ liệu hoặc chức năng mô đun giao tiếp ngoai vi.
1.1.6. Một số thanh ghi khác:
• Thanh ghi cho phép ngắt PxIE: Cho phép ngắt trên chân tương ứng nếu bật lên là 1, cấm ngắt nếu bít tương ứng là 0.
• Thanh ghi chọn cạnh ngắt PxIES: chọn cạnh lên để tạo ngắt nếu bít tương ứng là 0, hoặc cạnh xuống nếu là 1. Thanh ghi này chỉ có hiệu lực nếu thanh ghi P1IE đã bật.
• Thanh ghi cờ ngắt PxIFG: Khi một chân được bật cho phép ngắt và có sự thay đổi tín hiệu đúng như thanh ghi P1IES đặt thì cò ngắt tương ứng chân này bật lên. Nếu GIE đã bật thì ngắt sẽ được thực thi.
1.2. Ví dụ:
VD1: Nháy LED1 chân P1.0:
#include <msp430g2553.h> // Khai báo thư viện
void main()
{
WDTCTL = WDTPW + WDTHOLD; //dừng WDT
P1DIR|=0x01; //Định chân P1.0 là OUTPUT
//Hoac P1DIR|=BIT0;
while(1)
{
P1OUT^=0x01;//Phép xor bit hay đảo bit chân P1.0
__delay_cycles(500000);//tạo trễ 0.5s
}
}
1.3. Bài tập
BT1: Lập trình nháy led luân phiên nhau(LED1 sáng thì LED2 tắt và ngược lại).
• Gợi ý:
- Set 2 chân P1.0 và P1.6 là output
P1DIR |=0X41; hoặc P1DIR |= BIT6 + BIT0;
- Không sử dụng phép ^= mà sử dụng phép |= và &=~ để set và clear bit cho từng bit tương ứng.
VD: LED 1 sáng LED 2 tắt:
P1OUT |=BIT0; //bật LED
P1OUT &=~BIT6; //Tắt LED2
2. NÚT NHẤN
- Khi chưa nhấn nút, điện áp tại chân P1.3 là ~3.3VDC (mức “1”). Khi nhấn nút điện áp này là 0V (mức “0”).
- Để kiểm tra nút nhấn ở chân P1.3 ta dùng lệnh:
if((P1IN&BIT3)==0)//nếu SW được nhấn
{………}
Hoặc
if((P1IN&0x08)==0){……}
2.1. Ví dụ
VD2: Chương trình cho phép/không cho phép LED1 nhấp nháy khi Switch được nhấn.
#include <msp430g2553.h> //khai bao thu vien
unsigned char kiemtra = 0;//bien kiem tra cho phep nhay LED1
void main()
{
WDTCTL = WDTPW + WDTHOLD;//stop WDT
P1DIR |= 0X01; //khai bao chan P1.0 la output
P1DIR &=~ 0X08;//khai bao chan P1.3 la input
while(1)
{
if(kiemtra==1) //cho phep nhay LED1
{
P1OUT^= 0X01; //dao bit P1.0
__delay_cycles(500000);//tre 0.5s
}
if(!(P1IN&0X08)) //Neu SW duoc nhan
{
while(!(P1IN&0x08)){} //cho cho den khi da nhan nut xong
if( kiemtra == 1) //neu lan nhan truoc cho phep LED1 nhay
{
P1OUT &= ~0x01; //tat LED1
kiemtra= 0;
}
else
{
kiemtra = 1;
}
}
}
}
Nguồn: PIONEER CLUB
Mong Muốn Có Thêm Cơ Hội Trong Công Việc
Và Trở Thành Một Người Có Giá Trị Hơn
Bạn Chưa Biết Phương Thức Nào Nhanh Chóng Để Đạt Được Chúng
Hãy Để Chúng Tôi Hỗ Trợ Cho Bạn. SEMICON
Hotline: 0972.800.931 - 0938.838.404 (Mr Long)