⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 t7281a.c

📁 HD7279
💻 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 + -