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

📄 c7281.c

📁 基于ATmega16的BC7281键盘显示源码,拿过来就 可以用
💻 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); 				//接收一个字节
void chushihua_BC7281();
unsigned char Number(unsigned char);
//*** 变量及I/O定义 ***
unsigned char key_number,key_number1;
unsigned int tmr;
sbit dat=P1^0; 									// dat 连接于 P1.0
sbit key=P1^1; 									// key 连接于 P1.1
sbit clk=P1^2; 									// clk 连接于 P1.2
//*** 主程序 ***
main()
{
	unsigned char a;
	unsigned int i;
	key=1;
	chushihua_BC7281();							//初始化
	for(;;)
	
	{ 
		if(key==0)
		{   
			key_number=read728x(0x13);
			
	    	if (key_number==0x11)
	        {
	        write728x(0x15,(0x00+(key_number&0x0f)));
	        write728x(0x15,(0x10+(key_number&0x0f)));
	        }
		    else 
		  	if (key_number<10)
		    
		     
		{
		  write728x(0x15,(0x00+(key_number&0x0f/16)));
	      write728x(0x15,(0x10+(key_number&0x0f)));
		//	write728x(0x15,(0x20+(key_number&0x0F)));
		 //  write728x(0x15,(0x30+(key_number&0x0f)));
    	// write728x(0x15,(0x40+(key_number&0x0F)));
	  //write728x(0x15,(0x50+(key_number&0x0f)));
		//write728x(0x15,(0x60+(key_number&0x0F)));
	  // write728x(0x15,(0x70+(key_number&0x0f)));
	  }
	}
	      
	    
	  	} 
	
}
//******************************************************************
//*                    初始化  BC7281                              *
//******************************************************************
void chushihua_BC7281()
{
	for (tmr=0;tmr<0xffff;tmr++); 			// 等待BC728x完成复位
	write728x(0x12,0x80); 
	key_number1=0xf9;       //0xa4为2号机
	 key_number=0xc0;
	 write728x(0x07,key_number1);
	write728x(0x06,key_number);	 
		                           	// 初始化BC728x 为164模式,不反相
}
// *****************************************************************
// *写入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;
	do 
	{
		clk=0; 								// 发送clk脉冲,直至dat为低电平
		clk=1;
	} while (dat);
	clk=0; 									// 15us之内再输出一个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为高电平
	delay(2); 							//指令间设置一个微小延时
}
// ************************************************************
// *                   从BC728X接受一个字节                   *
// ************************************************************
unsigned char receive_byte(void)
{
	unsigned char bit_counter, in_byte;
	clk=0; 								// 只发送单一的clk脉冲
	clk=1;
	while (dat); 						// 等待BC728X响应dat低电平
	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;
	}
	delay(2);							 //指令间设置一个微小延时
	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 + -