View Single Post
Old 01-01-2010, 03:54 PM   #1
minhcuong1122
Đệ tử 1 túi
 
Tham gia ngày: Jan 2009
Bài gửi: 17
:
Smile Khai báo biến 3 byte, giúp e với!

Anh chị ơi, e đang tập viết union và struct.

E khai báo một kiểu union Xreg (2 struct Xtemp và Xbit, cách sắp xếp struct e có vẽ lại trong hình kèm theo).
Rồi, e viết chương trình Shift để dịch trái 1 biến 3 byte (kiểu Xreg).

Trong chương trình chính, e cho xuất giá trị bit MSB của biến 3 byte (Tx_bit) ra pin D.7, xoay biến 3 byte bằng hàm Shift, delay để tạo chớp tắt một vài lần. Nhưng, không thấy động tĩnh gì cả, cả 3 ngày rồi e tìm hoài hok biết lỗi chỗ nào, các anh chị thương tình xem giùm e đoạn code với.

Cảm ơn anh chị lắm lắm.

//PIC16f877A, crystal 8MHz, test kieu union
//MikroC Pro V3.2
union Xreg // Kieu du lieu cua cac thanh ghi X10
{
struct Xbit //TX_BIT + x5x + TEMp + x15x + RX_BIT
{
rx_bit :1;
unsigned char none ; //skip
unsigned:7; //skip
temp :2; //temp dung ket noi temp0 va temp1 khi dich trai
unsigned:5;
tx_bit:1;
}Xbit;
struct Xtemp //TEMP1 + TEMP0 :dung nap du lieu va dich bit
{
unsigned int temp0;
unsigned char temp1;
}Xtemp;
};
union Reg8 //Kieu du lieu reg8 dung truy xuat tung bit thanh ghi 8bit
{
unsigned char _byte;
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;
};
void Shift(union Xreg *reg ) //Dich trai (1 bit) thanh ghi 3 bytes kieu Xreg
{
reg -> Xtemp.temp1 <<= 1;
reg -> Xbit.temp <<= 1;
reg -> Xtemp.temp0 <<= 1;
}

union Xreg *a;
union Reg8 *b;
void main() {
TRISD = 0;
a=0x20;
b=0x08;//port D
a->Xtemp.temp0 = 0xAAAA;
a->Xtemp.temp1 = 0xAA; //*a = 0b 1010 1010 1010 1010 1010 1010
b->_byte = 0x00; //portD = 0b 0000 0001
while (1)
{
b->_bit.b7 = a->Xbit.tx_bit; //D.7 = Tx_bit
Shift(a); //Xoay thanh ghi 3 byte
Delay_ms(500);
}
}

thay đổi nội dung bởi: minhcuong1122, 01-01-2010 lúc 04:10 PM.
minhcuong1122 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn