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

📄 7281.h

📁 7281头文件,配合LED进行显示操作!努力创新!
💻 H
字号:
//  *********************************//
  /*  文件:7281头文件
      时间:2008.8.6
      备注:PA6、PA7为数据和脉冲端
	        使用时须加上延时头文件
  *************************************/
unsigned char p,q;
// ***********************************************************
// *短暂延时程序,延时时间与time成正比,范围是几个uS到几百个uS *
// ***********************************************************
void delay(unsigned char time)
{
while (time!=0)
	
	{time--;
	asm("nop");
	asm("nop");
	asm("nop");
	}
}




// ***********************************************************
// *                  向BC728X发送一个字节                   *
// ***********************************************************
void send_byte(unsigned char send_byte)
{
	unsigned char bit_counter;
                  DDRA&=~(1<<6);
	DDRA|=1<<7;
	do 
	{
	PORTA&=~(1<<7);    //clk置0
	delay(2); 									
	PORTA|=(1<<7);     //clk置1
	} 
	while (PINA&0X40);  //当DAT=1
	PORTA&=~(1<<7);  //clk置0
	delay(2); 									
	PORTA|=(1<<7);   //clk置1
	while (!(PINA&0X40));   //当DAT=1
	DDRA|=(1<<6); 			//DAT=1	等待BC728X进入接收状态
	for (bit_counter=0;bit_counter<8;bit_counter++)
	{ 										// 发送8个比特
		if ((send_byte&0x80)==0)              //发送数据时高位在前
		{
			PORTA&=~(1<<6);	 // 如果待发bit为0, 置dat为0
		}
		else
		{ 
			PORTA|=(1<<6); 	// 反之为DAT 1
		}
		send_byte=send_byte*2; 		// send_byte左移一位
	    PORTA&=~(1<<7);    //CLK置0
		delay(2); 		
	    PORTA|=(1<<7);     // CLK回1
		delay(2); 					//短暂延时
	}
	DDRA&=~(1<<6);                  //DAT口设置为输出   ;为下一次数据传送做准备
	PORTA|=(1<<6); 					// 恢复dat为高电平
	delay(5); 				//指令间设置一个微小延时
}
// ************************************************************
// *                   从BC728X接受一个字节                   *
// ************************************************************
unsigned char receive_byte(void)
{
	unsigned char bit_counter, in_byte;
                 DDRA&=~(1<<6);
	DDRA|=1<<7;
	PORTA&=~(1<<7);   //CLK=0
	delay(2); 									// 产生一个clk脉冲
	PORTA|=(1<<7);    //CLK=1
	while ((PINA&0X40)==0X40);// 等待BC728X响应dat低电平
	PORTA&=~(1<<7);   //CLK=0
	delay(2); 									// 产生一个clk脉冲
	PORTA|=(1<<7);    //CLK=1
	delay(2);
	DDRA&=~(1<<6);    //DAT=0
	for (bit_counter=0;bit_counter<8;bit_counter++)
	{ 									// 接收8个bit
		delay(2); 					// 短暂延时
		in_byte=in_byte*2; 			// in_byte左移一位
		if ((PINA&0X40)==0X40) 						// 如果dat为'1'
		{
			in_byte=in_byte|0x01; 		// bit0=1
		}
	PORTA&=~(1<<7);    //CLK=0
	delay(2); 									// 产生一个clk脉冲
	PORTA|=(1<<7);     //CLK=1
	}
	delay(5);				 //指令间设置一个微小延时
	return(in_byte);
}

// *写入BC728X,第一个参数为目标寄存器地址,第二个参数为要写入的数据 *
// *****************************************************************
void write7281(unsigned char reg_add, unsigned char write_data)
{
	send_byte(reg_add); 			//发送寄存器地
	send_byte(write_data); 			//发送数据字节
}

// **********************************************************
// *     读出BC728X内部寄存器的值,调用参数为寄存器地址      *
// **********************************************************
unsigned char read7281(unsigned char reg_add)
{
	send_byte(reg_add|0x80);			// 发送读指令(bit7=1)
	return(receive_byte()); 			//接收数据并返回
}

//******************************************************************
//*                    初始化  BC7281  (数码管)                           //
//******************************************************************
void chushihua_BC7281()
{    unsigned int i;
	for(i=0;i<0xffff;i++); 			// 等待BC728x完成复位
	PORTA|=(1<<7); //CLK=1
	DDRA|=(1<<7);  //CLK设置成输出
	write7281(0x12,0x80); 		// 初始化BC728x 为164模式,不反相
	write7281(0x10,0xfe);                   //10单元中的数为1时正常显示
	write7281(0x11,0x80);                   //闪烁速度设置
}
//******************************************************************
//*                    初始化  BC7281  (LCD)                           //
//******************************************************************
void chushihua_BC7281L()
{   unsigned int tmr;
	for(tmr=0;tmr<0xffff;tmr++); 			// 等待BC728x完成复位
	PORTA|=(1<<7); //CLK=1
	DDRA|=(1<<7);  //CLK设置成输出
	//write7281(0x12,0x80); 		// 初始化BC728x 为164模式,不反相
	//write7281(0x10,0xfe);                   //10单元中的数为1时正常显示
	//write7281(0x11,0x80);                   //闪烁速度设置
}


//******************************************************************
//*                   外部中断0设置                               //
//******************************************************************
void ZHONGDUAN0()
{  DDRD|=~BIT(2);
   PORTD|=0X04;
   MCUCR|=0X02;
   GICR|=0X40;
   SREG=0X80;
}

//*****************************************************//
    //送数字字型码,16*16的长高
void dis_tab(unsigned char data)
{
 switch(data)
 {
   case 0:{p=0xa3;q=0xb0;break;}
   case 1:{p=0xa3;q=0xb1;break;}
   case 2:{p=0xa3;q=0xb2;break;}
   case 3:{p=0xa3;q=0xb3;break;}
   case 4:{p=0xa3;q=0xb4;break;}
   case 5:{p=0xa3;q=0xb5;break;}
   case 6:{p=0xa3;q=0xb6;break;}
   case 7:{p=0xa3;q=0xb7;break;}
   case 8:{p=0xa3;q=0xb8;break;}
   case 9:{p=0xa3;q=0xb9;break;}
 }
 
 }

 //*************************************************//
  /*  功能:可在中断程序中等待按键按下
      时间:2008.8.6
  */
unsigned char get7281()
{  unsigned char key;
  do{;}
  while(PIND&0X04);
  key=read7281(0x13);
  do{;}
  while(!(PIND&0X04));
  write7281(0x15,(0x00+(key&0x0f)));//hex译码0x15  BCD 0x14
  PORTD|=0X04;
  beep1();
  return(key);

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -