BC7281应用文章——TMS320F2812开发板键盘程序


作者: 上海胜诺通信技术有限公司

//---------------------------------------------------------------------------------------
//-------------------------设置BC7281端口程序 ----------------------------------------------

// BC_DAT = P26 = GPIOF10
void set_BC_DAT(int state)
{

EALLOW;
GpioMuxRegs.GPFDIR.bit.GPIOF10 = 1; //dat 口设置成输出
EDIS;

switch(state)
{
case 0:
GpioDataRegs.GPFDAT.bit.GPIOF10 = 0; // clear BC_DAT.
break;
case 1:
GpioDataRegs.GPFDAT.bit.GPIOF10 = 1; // setb BC_DAT.
break;
}
}

// BC_DAT = P26 = GPIOF10
unsigned char read_BC_DAT(void)
{
EALLOW;
GpioMuxRegs.GPFDIR.bit.GPIOF10 = 0; //dat 口设置成输入
EDIS;

switch(GpioDataRegs.GPFDAT.bit.GPIOF10)
{
case 0:
return 0x00; // read, BC_DAT=0.
case 1:
return 0x01; // read, BC_DAT=1.
}
return 0xff;
}
// BC_KEY = P28 = GPIOF8
void set_BC_KEY(int state)
{
EALLOW;
GpioMuxRegs.GPFDIR.bit.GPIOF8 = 1; //dat 口设置成输出
EDIS;

switch(state)
{
case 0:
GpioDataRegs.GPFDAT.bit.GPIOF8 = 0; // clear BC_KEY.
break;
case 1:
GpioDataRegs.GPFDAT.bit.GPIOF8 = 1; // setb BC_KEY.
break;
}
}
// BC_KEY = P28 = GPIOF8
unsigned char read_BC_KEY(void)
{
EALLOW;
GpioMuxRegs.GPFDIR.bit.GPIOF8 = 0; //dat 口设置成输入
EDIS;

switch(GpioDataRegs.GPFDAT.bit.GPIOF8)
{
case 0:
return 0x00; // read, BC_KEY=0.
case 1:
return 0x01; // read, BC_KEY=1.
}
return 0xff;
}

 

// BC_CLK = P25 = GPIOF9
void set_BC_CLK(int state)
{
EALLOW;
GpioMuxRegs.GPFDIR.bit.GPIOF9 = 1; //dat 口设置成输出
EDIS;

switch(state)
{
case 0:
GpioDataRegs.GPFDAT.bit.GPIOF9 = 0; // clear BC_CLK.
break;
case 1:
GpioDataRegs.GPFDAT.bit.GPIOF9 = 1; // setb BC_CLK.
break;
}
}
//-----------------------------------------------------下面是 BC7281子程序
//---------------------------- 向 BC728X 发送一个字节-------------------------
// output parameters: bc7281_send_1_byte() // =0x00, 超时出错。0x01, 成功。
unsigned char bc7281_send_1_byte(unsigned char send_byte,unsigned int overtime_in_us)
{
unsigned char bit_counter;

gen_timer1_counter_in_us=overtime_in_us;
if(gen_timer1_counter_in_us==0)return 0x00; // 超时出错, 直接返回。

// 直接发一个时钟脉冲。
set_BC_CLK(0);
delay_gen_timer2_in_us(200); // BC7281要求这个时钟脉冲宽度不小于1us. 这里是200us.
set_BC_CLK(1);

// 然后等待BC_DAT变低。
gen_timer2_counter_in_us=5000; // 在F2812向BC7281发出一个时钟脉冲后,用5ms时间来等待BC_DAT变低。如果在5ms内没有变低,则重发一个 时钟脉冲。
while(read_BC_DAT()==1) //读取DAT的状态线,当DAT为高时,继续读取状态。
{
if(gen_timer1_counter_in_us==0)return 0x00; // 超时出错, 直接返回。
if(gen_timer2_counter_in_us==0)return 0x00; // 超时出错, 直接返回。
}

// 至此, BC7281已响应. DAT变低, 要再发一个CLK, 等待DAT变高.
set_BC_CLK(0);
delay_gen_timer2_in_us(200); // BC7281要求这个时钟脉冲宽度不小于1us. 这里是200us.
set_BC_CLK(1);

gen_timer2_counter_in_us=5000;
while(read_BC_DAT()==0)
{
if(gen_timer1_counter_in_us==0)return 0x00; // 超时出错, 直接返回。
if(gen_timer2_counter_in_us==0)return 0x00; // 超时出错, 直接返回。
}

// BC_DAT已变高
delay_gen_timer2_in_us(200); // BC7281要求这个时钟脉冲宽度不小于1us. 这里是200us.

// 下面开始发送8个bits.
// 至此, DAT又变高. 可以开始发送8bits.

for (bit_counter = 0; bit_counter < 8; bit_counter++)
{ // 发送 8 个比特
if ((send_byte & 0x80) == 0)
{
set_BC_DAT(0); // 如果待发bit为0, 置 dat 为 0
}
else
{
set_BC_DAT(1); // 反之置为 1
}
send_byte = send_byte << 1; // send_byte 左移一位
set_BC_CLK(0); // 输出一 clk 脉冲
// set_LED0(0);
delay_gen_timer2_in_us(200); // BC7281要求这个时钟脉冲宽度不小于1us. 这里是200us.

set_BC_CLK(1);
// set_LED0(1);
delay_gen_timer2_in_us(200); // BC7281要求这个时钟周期,即0+1的总时长,不小于8us. 这里是共400us.

}
return 0x00; // 已成功发送一个字节。
}

//------------------------------从 BC728X 接收一个字节----------------------------
unsigned char bc7281_receive_1_byte(unsigned int overtime_in_us)
{
unsigned char bit_counter, in_byte;
gen_timer1_counter_in_us=overtime_in_us;
if(gen_timer1_counter_in_us==0)return 0x00; // 超时出错, 直接返回。

// 直接发一个时钟脉冲,请求握手信号。
set_BC_CLK(0);
delay_gen_timer2_in_us(200); // BC7281要求这个时钟脉冲宽度不小于1us. 这里是200us.
set_BC_CLK(1);

while(read_BC_DAT()==1) // 等待DAT响应
{
if(gen_timer1_counter_in_us==0)return 0x00; // 超时出错, 直接返回。
if(gen_timer2_counter_in_us==0)return 0x00; // 超时出错, 直接返回。
}
set_BC_CLK(0);
delay_gen_timer2_in_us(200); // BC7281要求这个时钟脉冲宽度不小于1us. 这里是200us.
set_BC_CLK(1);

for (bit_counter=0;bit_counter<8;bit_counter++)
{ // 接收8个bit

in_byte=in_byte*2; // in_byte 左移一位
if (read_BC_DAT()==1) // 如果 dat 为'1'
{
in_byte=in_byte|0x01; // bit0=1
}
set_BC_CLK(0);
// set_LED1(0);
delay_gen_timer2_in_us(200); // BC7281要求这个时钟脉冲宽度不小于1us. 这里是200us.
set_BC_CLK(1);
// set_LED1(1);
delay_gen_timer2_in_us(200); // 短暂延时
}

return(in_byte);
}
//-----------写入BC728X, 第一个参数为目标寄存器地址, 第二个参数为要写入的数据 ---------------

void write7281(unsigned char reg_add, unsigned char write_data)
{
bc7281_send_1_byte(reg_add,3000); // 发送寄存器地址
delay_gen_timer2_in_us(100);
bc7281_send_1_byte(write_data,3000); // 发送数据字节
}

//------------读出 BC728X 内部寄存器的值, 调用参数为寄存器地址--------------------
unsigned char read7281(unsigned char reg_add)
{
bc7281_send_1_byte(reg_add|0x80,3000); // 发送读指令(bit7=1)
return(bc7281_receive_1_byte(3000)); // 接收数据字节并返回
}
//------------------------------------------------------------------
//-----------------------------调试BC7281程 序--------------------------------
void debug_bc7281()
{
unsigned char key_number;

write7281(0x12,0x81); // initialize BC7281. 采用74HC595.

write7281(0x15,0x00); // display '0' at postion 0.
write7281(0x15,0x10); // display '0' at postion 0.
write7281(0x15,0x26); // display '0' at postion 0.
write7281(0x15,0x35); // display '0' at postion 0.
write7281(0x15,0x44); // display '0' at postion 0.
write7281(0x15,0x53); // display '0' at postion 0.
write7281(0x15,0x62); // display '0' at postion 0.
write7281(0x15,0x71); // display '0' at postion 0.


while(1)
{


delay_gen_timer4_in_ms(50);

if(read_BC_KEY()==0) // 等待按键
{

key_number=read7281(0x13);

key_number = key_number & 0x00ff;

switch(key_number)
{
case 0x00:
key_number=0x01;
break;
case 0x01:
key_number=0x04;
break;
case 0x02:
key_number=0x07;
break;
case 0x03:
key_number=0x0a;
break;
case 0x08:
key_number=0x02;
break;
case 0x09:
key_number=0x05;
break;
case 0x0a:
key_number=0x08;
break;
case 0x0b:
key_number=0x00;
break;
case 0x10:
key_number=0x03;
break;
case 0x11:
key_number=0x06;
break;
case 0x12:
key_number=0x09;
break;
case 0x13:
key_number=0x0b;
break;
case 0x18:
key_number=0x0c;
break;
case 0x19:
key_number=0x0d;
break;
case 0x1a:
key_number=0x0e;
break;
case 0x1b:
key_number=0x0f;
break;
case 0x20:
key_number=0x1a;
break;
case 0x21:
key_number=0x1b;
break;
case 0x22:
key_number=0x1c;
break;
case 0x23:
key_number=0x1d;
break;
case 0x28:
key_number=0x1e;
break;
case 0x29:
key_number=0x1f;
break;
case 0x2a:
key_number=0x2a;
break;
case 0x2b:
key_number=0x2b;
break;
}

write7281(0x15,0x10+(key_number&0xf0)/16); // 在第1位上以HEX译码方式显示键码的高4位
write7281(0x15,key_number&0x0f); // 在第0位上以HEX译码方式显示键码的低4位
}
}
}


***敬请使用firefox或chrome浏览器以取得最佳效果***
Copyrigh1999-2011 北京凌志比高科技有限公司 版权所有
电话:(010) 62981567,82895285,82895286,13391571388 传真:82895286
地址:北京市海淀区上地信息路一号国际创业园 1号楼402室(100085)