📄 bc7281.c
字号:
// (时钟输出)
Dat_In; // 设定连接DATT(7281.1)的
// T4CTRIP"CPU.83"为输入
// (回馈接收)
EDIS; // 禁止访问受保护的空间
Setb_Clk;
Write_7281(0x12,0x80); // 初始化BC728x为164模式不反相
Write_7281(0x10,0xFF);
//Write_7281(0,Disp_Tab[g]); // 向LED个位(0位)写"g"数据
//Write_7281(1,Disp_Tab[s]); // 向LED十位(1位)写"s"数据
//Write_7281(2,Disp_Tab[b]); // 向LED百位(2位)写"b"数据
//Write_7281(3,Disp_Tab[q]); // Write_7281(3,Disp_Tab[d]&0x7f)
// 加小数点;
// 向LED千位(3位)写"q"数据,
// 以下4行通过译码表由程序译码
Write_7281(0x15,g); // 向LED个位(0位)写"s"数据,
// 以下4行为通过片内译码器0x15
// 由硬件进行Hex译码。
// 显然硬件译码比程序译码速度快
Write_7281(0x15,(0x10+s)); // 向LED十位(1位)写"b"数据
Write_7281(0x15,(0x20+b)); // 向LED百位(2位)写"q"数据
Write_7281(0x15,(0x30+q)); // 向LED千位(3位)写"w"数据
}
/******************************************************************************
函数: Write_7281()
输入参数: 第一个形参(unsigned char reg_add)为目标寄存器地址
第二个形参(unsigned char write_data)为要写入的数据
输出参数: 无
功能: 向BC7281写入一个字节.
******************************************************************************/
void Write_7281(unsigned char reg_add, unsigned char write_data)
{
SendByte_7281(reg_add); // 发送寄存器地址
SendByte_7281(write_data); // 发送数据字节
}
/******************************************************************************
函数: SendByte_7281()
输入参数: 形参(unsigned char send_byte)为需发送的一个字节
输出参数: 无
功能: 向BC7281发送一个字节
******************************************************************************/
void SendByte_7281(unsigned char send_byte)
{
Uint16 bit_counter;
EALLOW; // 允许访问受保护的空间
Dat_In; // 设定连接DATT(7281.1)的SDA(T4CTRIP"CPU.83")
// 为输入(接收7281反馈信号)
EDIS; // 禁止访问受保护的空间
do // do...while,向7281发出一系列脉冲信号,
// 直到7281响应将SDA(DATT)拉成低电平
{
Clr_Clk; // 置CLKK(7281.3)为低电平
Delay(100);
Setb_Clk; // 置CLKK(7281.3)为高电平,
// 即向7281发一个时钟脉冲信号
Delay(100);
}
while(Dat);
Clr_Clk; // 以下4行再发一个脉冲信号,等待DATT重新被拉高
Delay(5);
Setb_Clk;
Delay(5);
while(!Dat);
EALLOW;
Dat_Out; // 设定连接DATT(7281.1)
// 的Dat(T4CTRIP"CPU.83")为输出
EDIS;
for(bit_counter = 0; bit_counter < 8; bit_counter++)
// 发送8位
{
if((send_byte & 0x80) ==0) // 位传送从最高位开始
{
Clr_Dat; // 位为0,向DATT(7281.1)发送低电平
}
else
{
Setb_Dat; // 位为1,向DATT(7281.1)发送高电平
}
// send_byte=send_byte*2; // send_byte 左移一位,整备下一次位发送
send_byte=send_byte<<1; // send_byte 左移一位,整备下一次位发送
Clr_Clk; // MCU每发一个脉冲,即向7281传送一位数据
Delay(5);
Setb_Clk;
Delay(5);
}
Setb_Dat; // 向DATT(7281.1)发送长高电平8位传送结束
Delay(100); // 这里需较长的延时,否则传送错码
}
/******************************************************************************
函数: Read_7281()
输入参数: 形参(unsigned char reg_add)为需发送的指令字节
输出参数: 无
功能: 从BC7281读出一个数据字节,它由指令写入操作和数据读出操作两部分
组成, 字节写入操作写入指令字,数据则由字节读出操作读出
******************************************************************************/
unsigned char Read_7281(unsigned char reg_add)
{
SendByte_7281(reg_add|0x80); // 发送读指令(bit7=1)
return(ReceiveByte_7281()); // 接收数据字节并返回
}
/******************************************************************************
函数:ReceiveByte_7281()
功能:从BC7281接收一个数据字节
******************************************************************************/
unsigned char ReceiveByte_7281(void)
{
Uint16 temp,bit_counter;
unsigned char receive_byte;
EALLOW; // 允许访问受保护的空间
Dat_In; // 设定连接DATT(7281.1)的SDA(T4CTRIP"CPU.83")
// 为输入(接收7281反馈信号)
EDIS; // 禁止访问受保护的空间
Clr_Clk; // 向7281发出一个脉冲信号
Delay(5);
Setb_Clk;
Delay(5);
do // do ... while 为直到型循环语句
{ temp = Dat; } // 读出SDA(DATT 7281.1的反馈信号)
while(temp); // 一直到Dat为低时, 循环结束
Clr_Clk; // MCU再向7281发出一个脉冲信号,7281在接收
Delay(5); // 到这个脉冲信号后,即通过Dat(DATT 7281.1)
Setb_Clk; // 线,发送数据位
Delay(5);
for(bit_counter = 0; bit_counter < 8; bit_counter++)
//接收8位
{
receive_byte=receive_byte*2; // 左移一位
if(Dat)
{
receive_byte=receive_byte|0x01; // 若SDA=1,置最低位为1,否则为0
}
Clr_Clk; // 7281每接收到一个脉冲即发送一个数据位
Delay(5);
Setb_Clk;
Delay(3);
}
Clr_Clk; // 当8个数据位(一个字节)读出以后,MCU
Delay(5); // 还必须再多发出一个脉冲,表示数据接收
Setb_Clk; // 完毕。7281才能从数据输出状态转成数据
Delay(5); // 输入状态,准备接收下一个指令
EALLOW; // 允许访问受保护的空间
Dat_Out; // 设定连接DATT(7281.1)的T4CTRIP
// "CPU.83"为输入(回馈接收)
EDIS; // 禁止访问受保护的空间
Setb_Dat; // 向DATT(7281.1)发送长高电平8位传送结束
Delay(100); // 这里需较长的延时,否则传送错码
return(receive_byte);
}
/******************************************************************************
函数: Delay()
输入参数: 形参(unsigned char delay_time)为延时的长短
输出参数: 无
功能: 写读7281位传送中的延时函数
******************************************************************************/
void Delay(unsigned char delay_time)
{
Uint16 i;
for(i = 0; i < (delay_time*3 ); i++)
{
asm(" nop");
asm(" nop");
asm(" nop");
asm(" nop");
asm(" nop");
}
}
//===========================================================================
// No more.
//===========================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -