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

📄 7281.c

📁 基于ATmega16的BC7281键盘显示源码,拿过来就 可以用
💻 C
字号:
#include <iom16v.h>
#include <macros.h>

#define MHZ 8
#define US MHZ/4    //以4MHZ为基本单位,典型延时时间为(dt+2)us(晶振为1MHZ)P195P195]。
#define SET(a,b) a|=(1<<b) 
#define CLR(a,b) a&=~(1<<b)
#define CPL(a,b) a^=(1<<b)
#define CHK(a,b) (a&(1<<b)==(1<<b))
#define BC7281_PORT 	   PORTA
#define BC7281_DDR 		   DDRA
#define BC7281_PIN 		   PINA
#define INT_7281  2
#define DAT_7281  		   6
#define CLK_7281  		   7
#define RDAT_7281 (CLR(BC7281_DDR,DAT_7281),(BC7281_PIN&(1<<DAT_7281))==(1<<DAT_7281))//定义PC0口为数据口



void main()
{

     unsigned char key_number;
     BC7281_init();
     while(1)
{ 


   if(!((PIND&0x04)==0x04))
    {
    key_number=read728x(0x13);	 /////读键值    
     if(key_number<0x0A)
   {  write728x(0x15,0x00+(key_number&0x0f));  //在第0位以HEX方式显示键码的低四位
   write728x(0x15,0x10+(key_number&0xf0));//在第1位以HEX方式显示键码的高四位   
 
 
  
  } 
  

 if(key_number==0x0f)
   {
write728x(0x15,0x00+(key_number&0x0f));   //在第0位以HEX方式显示键码的低四位
write728x(0x15,0x10+(key_number&0xf0)); //在第1位以HEX方式显示键码的高四位    
 } 
 
   }
write728x(0x15,(0x60+(0x01))); 
write728x(0x15,(0x70+(0x00)));                         
       }
}

void send_byte(unsigned char send_byte)
{
	unsigned char bit_counter;
    SET(BC7281_PORT,DAT_7281);  //为低电平
	SET(BC7281_DDR,CLK_7281);   //CLK为输出,PB1内部上拉有效	
	CLR(BC7281_DDR,DAT_7281);   //DAT为输入
	
		   
	SET(PORTA,CLK_7281);  //为高电平
	
	CLR(BC7281_PORT,CLK_7281);		   
			
	delay_7281(US);
	
	SET(BC7281_PORT,CLK_7281);
	
	delay_7281(US);
	do {
	
	CLR(BC7281_PORT,CLK_7281); 
	//delay_7281(US);
	SET(BC7281_PORT,CLK_7281);
	
	delay_7281(2*US);
	
	} while (RDAT_7281);	//CPU向BC7281发一系列的脉冲信号,直到DAT为低电平
	CLR(BC7281_PORT,CLK_7281);//delay_7281(US);  	 // 要在15us内发一脉冲信号
	SET(BC7281_PORT,CLK_7281);
	
	delay_7281(US);
	
	
	while (!RDAT_7281); 				  //等待数据线变为高电平
		
	SET(BC7281_DDR,DAT_7281);   //pa6  DAT为输出并延时
	
	delay_7281(US);
	
	for (bit_counter=0;bit_counter<8;bit_counter++)			   //写八位
	{ 
	   
	    delay_7281(3*US);	
		
		if ((send_byte&0x80)==0)
		{CLR(BC7281_PORT,DAT_7281);//从高位写起
		
		}   
		else
		{
		SET(BC7281_PORT,DAT_7281);
				          }
		send_byte=send_byte*2;	  ///左移
		
				 					  
		CLR(BC7281_PORT,CLK_7281);//delay_7281(US);	//产生一个周期为20US的脉冲
		SET(BC7281_PORT,CLK_7281);
		
		delay_7281(2*US);
	 }
	 
       //CLR(BC7281_PORT,CLK_7281);
	 //  SET(BC7281_PORT,CLK_7281);
	 
	SET(BC7281_PORT,DAT_7281); 
	
	delay_7281(6*US); 
}






unsigned char receive_byte(void)
{
	unsigned char bit_counter, in_byte;							//产生一个脉冲
	SET(BC7281_PORT,DAT_7281);delay_7281(US);					//为高电平
	SET(BC7281_PORT,CLK_7281);delay_7281(US);					//为高电平
	SET(BC7281_DDR,CLK_7281);					//CLK为输出,PB1内部上拉有效
	CLR(BC7281_DDR,DAT_7281);									//DAT为输入
	CLR(BC7281_PORT,CLK_7281); delay_7281(US);
	SET(BC7281_PORT,CLK_7281);delay_7281(US);
	while (RDAT_7281){}; 				 					//等待数据线变为低电平
	CLR(BC7281_PORT,CLK_7281); delay_7281(US);
	SET(BC7281_PORT,CLK_7281);delay_7281(US);
	for (bit_counter=0;bit_counter<8;bit_counter++)				//接收八位数据
	{ 
		delay_7281(2*US); 
		in_byte=in_byte*2; 
		if (RDAT_7281) {in_byte=in_byte|0x01; }
		CLR(BC7281_PORT,CLK_7281); delay_7281(US);
		SET(BC7281_PORT,CLK_7281);delay_7281(US);
	 }
	delay_7281(2*US); 
	return(in_byte);	/////////键盘返回值
}    
void write728x(unsigned char reg_add, unsigned char write_data)
{
	send_byte(reg_add); 
	send_byte(write_data); 
}
unsigned char read728x(unsigned char reg_add)
{
	send_byte(reg_add|0x80); 
	return(receive_byte()); 
}






/*#pragma interrupt_handler int1:3     //声明_int0( )为中断处理 
	while(RDAT_7281==0){};     //如果数据线为高电平则BC7281空闲
	key_number=read728x(0x13);
	write728x(0x15,(key_number&0xf0)/16);   //在第0位以HEX方式显示键码的低四位
	write728x(0x15,0x10+(key_number&0x0f));   //在第1位以HEX方式显示键码的高四位
}
*/



	void BC7281_init(void)
{	 

     delay_7281(2*US); 
     write728x(0x12,0x80);	//写控制寄存器。开扫描,CPU未读数据时只有第一个按键有效
	// CLR(DDRD,3);										//PD2口输出无效
	// SET(PORTD,3);
	 //SET(BC7281_PORT,CLK_7281);							//IO上拉有效
	 //SET(BC7281_PORT,DAT_7281);
	// CLR(BC7281_DDR,CLK_7281);
	 //CLR(BC7281_DDR,DAT_7281);
	// SET(MCUCR,ISC11);								//INT1 的产生异步中断请求
	 //CLR(MCUCR,ISC10);
	// SET(GICR,INT1);  									//开INT1中断
	// SREG=SREG|0x80;									//开全
	 // while(1){}
}






void delay_7281(unsigned int dt)//延时(dt+2)us    (晶振为4MHZ)P195
{
for(;dt>0;--dt){};
}

⌨️ 快捷键说明

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