📄 t7281a.c
字号:
#include <reg51.h>
//*** 函数定义 ***
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,0x80); // 初始化BC728x为164模式,不反相
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;
while (dat); // 等待 BC728X 输出 dat 低电平响应
clk=0; // 再次输出一 clk 脉冲
clk=1;
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;
delay(1); // 短暂延时
}
dat=1; // 恢复 dat 为高电平
}
// ************************************************************
// * 从 BC728X 接收一个字节 *
// ************************************************************
unsigned char receive_byte(void)
{
unsigned char bit_counter, in_byte;
clk=0; // 发出一 clk 脉冲
clk=1;
while (dat); // 等待 BC728X 响应
clk=0; // 收到响应, 再发一脉冲等待接收数据
clk=1;
for (bit_counter=0;bit_counter<8;bit_counter++)
{ // 接收8个bit
delay(1); // 短暂延时
in_byte=in_byte*2; // in_byte 左移一位
if (dat) // 如果 dat 为'1'
{
in_byte=in_byte|0x01; // bit0=1
}
clk=0; // 输出一 clk 脉冲
clk=1;
}
return(in_byte);
}
// ***********************************************************
// * 短暂延时程序, 延时时间与参数time成正比, 范围是几个uS到几百个uS *
// ***********************************************************
void delay(unsigned char time)
{
while (time!=0)
{
time--;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -