// *************************************************** // * BC7281B典型读写示例程序 * // * 应用环境:MCU - AT89C2051 @ 11.0592MHz * // * BC7281B, R=1.5K, C=20P * // * 本程序也可适用于BC7281A,在不同的工作频率情况下 * // * 请注意调整相关延时参数以满足通讯时序要求 * // *************************************************** #include //*** 函数定义 *** void delay(unsigned char); // 短暂延时 void write728x(unsigned char, unsigned char); // 写入到BC728x unsigned char read728x(unsigned char); // 从BC728x读出 void send_byte(unsigned char); // 发送一个字节 unsigned char receive_byte(void); // 接收一个字节 //*** 变量及I/O口定义 *** unsigned char key_number; unsigned int tmr; sbit clk=P3^5; // clk 连接于 P3.5 sbit dat=P3^7; // dat 连接于 P3.7 sbit key=P3^3; // key 连接于 P3.3(INT1) //*** 主程序 *** main() { for (tmr=0;tmr<0xffff;tmr++); // 等待 BC728x 完成复位 write728x(0x12,0xC8); // 初始化BC7281B为SCN=1,RP=1,BMS=1 write728x(0x15,0x00); //在第0位显示‘0’ write728x(0x15,0x10); //在第1位显示‘0’ while (1) { while(key); // 等待按键 key_number=read728x(0x13); // 读键值 write728x(0x15,0x10+(key_number&0xf0)/16); // 在第1位上以HEX译码方式显示键码的高4位 write728x(0x15,key_number&0x0f); // 在第0位上以HEX译码方式显示键码的低4位 } } // ******************************************************************** // * 写入BC728X, 第一个参数为目标寄存器地址, 第二个参数为要写入的数据 * // ******************************************************************** void write728x(unsigned char reg_add, unsigned char write_data) { send_byte(reg_add); // 发送寄存器地址 send_byte(write_data); // 发送数据字节 } // ********************************************************** // * 读出 BC728X 内部寄存器的值, 调用参数为寄存器地址 * // ********************************************************** unsigned char read728x(unsigned char reg_add) { send_byte(reg_add|0x80); // 发送读指令(bit7=1) return(receive_byte()); // 接收数据字节并返回 } // ******************************************************** // * 向 BC728X 发送一个字节 * // ******************************************************** void send_byte(unsigned char send_byte) { unsigned char bit_counter; clk=0; // 产生一 clk 脉冲 clk=1; // 使用指令周期小于1uS的高速单片机的用户 // 请注意在这两条语句间加入延时,以使脉冲 // 宽度不小于Tw5 do { clk=0; // 发送 clk 脉冲直至dat为低电平 clk=1; // 使用指令周期小于1uS的高速单片机的用户 // 请注意在这两条语句间加入延时,以使脉冲 // 宽度不小于Tw5 } while (dat); clk=0; // Ta时间之内再次输出一 clk 脉冲 clk=1; // 使用指令周期小于1uS的高速单片机的用户 // 请注意在这两条语句间加入延时,以使脉冲 // 宽度不小于Tw5 while (!dat); // 等待 BC728X 进入接收状态 for (bit_counter=0;bit_counter<8;bit_counter++) { // 发送 8 个比特 if ((send_byte&0x80)==0) { dat=0; // 如果待发bit为0, 置 dat 为 0 } else { dat=1; // 反之置为 1 } send_byte=send_byte*2; // send_byte 左移一位 clk=0; // 输出一 clk 脉冲 clk=1; // 使用指令周期小于1uS的高速单片机的用户 // 请注意在这两条语句间加入延时,以使脉冲 // 宽度不小于Tw5 // delay(1); // 请根据单片机的速度和BC7281的RC值决定 // 是否加入延时,以使得送入每一位的总时间不 // 小于 Tw3且数据保持时间不小于Tw4, // 本例中不需要 } // delay(1); // 请根据单片机的速度和BC7281的RC值决定 // 是否加入延时,以使得最后一位的数据保持时间不 // 小于 Tw4,本例中不需要 dat=1; // 恢复 dat 为高电平 } // ********************************************************* // * 从 BC728X 接收一个字节 * // ********************************************************* unsigned char receive_byte(void) { unsigned char bit_counter, in_byte; clk=0; // 只发送一个单一的 clk 脉冲 clk=1; // 使用指令周期小于1uS的高速单片机的用户 // 请注意在这两条语句间加入延时,以使脉冲 // 宽度不小于Tr6 while (dat); // 等待 BC728X 响应dat低电平 clk=0; // 收到响应, 再发一脉冲等待接收数据 clk=1; // 使用指令周期小于1uS的高速单片机的用户 // 请注意在这两条语句间加入延时,以使脉冲 // 宽度不小于Tr6 for (bit_counter=0;bit_counter<8;bit_counter++) { // 接收8个bit // delay(1); // 请根据单片机的速度和BC7281的RC值决定 // 是否加入延时,以满足数据建立时间Tr2、Tr3 // 本例中不需要 in_byte=in_byte*2; // in_byte 左移一位 if (dat) // 如果 dat 为'1' { in_byte=in_byte|0x01; // bit0=1 } clk=0; // 输出一 clk 脉冲 clk=1; // 使用指令周期小于1uS的高速单片机的用户 // 请注意在这两条语句间加入延时,以使脉冲 // 宽度不小于Tr6 } // delay(2); // 请根据单片机的速度和BC7281的RC值决定 // 是否加入延时,以满足DAT恢复时间Tr5 // 本例中不需要 return(in_byte); } // ****************************************************************** // * 短暂延时程序, 延时时间与参数time成正比, 范围是几个uS到几百个uS * // ****************************************************************** void delay(unsigned char time) { while (time!=0) { time--; } }