Trích:
Nguyên văn bởi tmtm
Bạn có thể giải thích rõ hơn về dòng lệnh này dược ko? Nếu ta sử dụng 2 chân RB2 & RB3 để điều khiển 1 IC74HC164 thứ 2 ... RB4 & RB5 điều khiển IC74HC164 thứ 3... thì ta phải xử lý như thế nào?
|
Khi bạn thiết kế với nhiều Port bạn có thể gom chúng lại để việc điều khiển và quản lý code dễ dàng hơn.
Nếu ngoài output bạn muốn sử dụng nhiều nhiều hiệu ứng hơn thì đồng thời với xuất ra led bạn nên dùng 1 buffer đi kèm theo để lưu lại.
Code:
//////////////////////////////////Data - CLK, Data - CLK, ...
#define PORT_NUMBER 4
const unsigned long PORT_TABLE[PORT_NUMBER*2]={PIN_B0,PIN_B1,PIN_B2,PIN_B3,PIN_B4,PIN_B5,PIN_B6,PIN_B7};
unsigned char PortData[PORT_NUMBER];
//prototype
void Write2Led();
void WritePort2Led(int port_num,unsigned char data);
void WriteByte(int port_num,unsigned char data);
void WriteBit(int bit_num,unsigned short data);
void WriteInt32(int32 data);
void WriteArray(unsigned char data[PORT_NUMBER]);
//Update all data to leds
void Write2Led()
{
int i,j;
for(i=0;i<PORT_NUMBER;i++){
WritePort2Led(i,PortData[i]);
}
}
//Update data port to leds
void WritePort2Led(int port_num,unsigned char data)
{
int i;
for(i=0;i<8;i++){
output_bit(PORT_TABLE[port_num],data&0x01);
output_high(PORT_TABLE[port_num+1]);
delay_us(1);
data>>=1;
output_low(PORT_TABLE[port_num+1]);
}
}
//Write 1 byte data to buffer and update to leds
void WriteByte(int byte_num,unsigned char data)
{
PortData[byte_num]=data;
WritePort2Led(byte_num,data);
}
//Write 1 bit data to buffer and update to leds
void WriteBit(int bit_num,unsigned short data)
{
PortData[bit_num/8]=(data == 0x01)?(PortData[bit_num/8]|(data&0x01)<<(bit_num%8)):(PortData[bit_num/8]&(~(data&0x01)<<(bit_num%8)));
WritePort2Led(bit_num/8,PortData[bit_num/8]);
}
//Write 1 integer 32 bits data to buffer and update to leds
void WriteInt32(int32 data)
{
int i;
for(i=0;i<PORT_NUMBER;i++){
PortData[i]=data&0xFF;
data>>=8;
}
Write2Led();
}
//Write 1 array data to buffer and update to leds
void WriteArray(unsigned char data[PORT_NUMBER])
{
int i;
for(i=0;i<PORT_NUMBER;i++){
PortData[i]=data[PortData];
}
Write2Led();
}
Good luck!