TẬP LẬP TRÌNH
3.4.2.2 Cách mở rộng Port:
Ví dụ: Đưa dữ liệu 0xA4BC ra tầng thứ hai của thanh ghi dịch: Lưu đồ:
Kết nối phần cứng:
+ Nối chân 7 của eZ430-RF2500T làm chân xung clock tầng ghi dịch.
+ Nối chân 15 của eZ430-RF2500T làm chân dữ liệu vào của tầng thứ hai thanh ghi dịch.
+ Nối chân 17 của eZ430-RF2500T làm chân điều khiển xung chốt của tầng thứ hai thanh ghi dịch.
Chương trình:
void MoRongP2(unsigned int q); // Khai báo hàm mở rộng tầng thứ hai union reg { // Khai báo 1 byte 8 bit
struct bit { unsigned char b0:1; unsigned char b1:1; unsigned char b2:1; unsigned char b3:1; unsigned char b4:1; unsigned char b5:1; unsigned char b6:1; unsigned char b7:1; }_BIT;
unsigned char _BYTE;
};
union reg* _P3_DIRECT = (union reg*)0x1A ; // Định nghĩa vùng nhớ 0x1A union reg* _P3_OUT = (union reg*)0x19 ; // Định nghĩa vùng nhớ 0x19 union reg* _P2_DIRECT = (union reg*)0x2A ; // Định nghĩa vùng nhớ 0x2A union reg* _P2_OUT = (union reg*)0x29 ; // Định nghĩa vùng nhớ 0x29
int main(void) // Chương trình chính
{
WDTCTL = WDTPW + WDTHOLD; // Dừng ngắt
_P3_DIRECT->_BYTE = 0xff; // Định nghĩa Port 3 là xuất _P2_DIRECT->_BYTE = 0xff; // Định nghĩa Port 2 là xuất volatile unsigned int a; // Biến khai báo trong RAM
{
a=0xA4BC; // Gán a = A4BC
MoRongP2(a); // Mở rộng tầng 2 với 16 bit của a
} } }
void MoRongP2(unsigned int e) // Hàm mở rộng tầng thứ 2 {
volatile unsigned int f,g,h; // Biến khai báo trong RAM f=0x8000; // Gán f=8000
g=16; // Cho g=16
while(g>0) // Trong khi g>0 thì thực hiện {
h = e&f; // h = e and f if ( h == f) // Nếu h=f {
_P3_OUT->_BIT.b2=1; // bit 2 port 3 là mức 1 }
Else // ngược lại h không =f {
_P3_OUT->_BIT.b2=0; // bit 2 port 3 mức 0 }
_P2_OUT->_BIT.b4=0; // bit 4 port 2 mức 1(xung clock) _P2_OUT->_BIT.b4=1; // bit 4 port 2 mức 0
f=f>>1; // Xoay phải f g--; // Giảm g đi 1 }
_P3_OUT->_BIT.b0=0; // bit 04 port 3 mức 1(xung chốt) _P3_OUT->_BIT.b0=1; // bit 04 port 3 mức 1
}