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

📄 00145.c

📁 关于ATMEGA128的EEPROM和键盘识别
💻 C
字号:
//ICC-AVR application builder : 2009-3-21 15:58:12
// Target : M128
// Crystal: 16.000Mhz

#include <iom128v.h>
#include <macros.h>
#include <eeprom.h>

//设置那一块的函数
#define uchar unsigned char	
#define uint unsigned int
#define CLK_CHU DDRD|=BIT(4)

//定义     clk   pd4  
#define CLK_0  PORTD&=~BIT(4)
#define CLK_1  PORTD|= BIT(4) 


//数据方向可以不定义  但是要在总的系统初始化里定义好  
//定义    data   pd5   
#define DATA  PIND&=BIT(5)        //数据输入值

#define DATA_0  PORTD&=~BIT(5)     //数据输出值
#define DATA_1  PORTD|= BIT(5) 

#define DATA_RU  DDRD&=~BIT(5)   
#define DATA_CHU DDRD|=BIT(5) //数据方向

#define  xtal_8     8  
#define xtal_16    16 

uchar shezhi=0,shuzijia=0,shuzijian=0,queren=0,tuichu=0, port_tmp=0;


void delay_1ms(void)   //1ms级延时函数
{
uchar  i;
for(i=0;i<(uchar)(xtal_8*143-2);i++);     //    xtal8待整理
}

void delay_nms(uchar n)	//n*1ms的延时函数
{
uchar i=0;
for(i=0;i<n;i++)        //最大255ms
delay_1ms();
}

/**********************************************/
void delay_1us(void)   //1us级延时函数
{
asm("nop");
}

void delay_nus(uchar n)	//n*1us的延时函数
{
uchar  i=0;
for(i=0;i<n;i++)      //最大255us
delay_1us();
}
/********************************************************/
	

void shezhi0 ()
{
port_tmp = PINB;

    while ((port_tmp&0x01)==0)  	 //设置键的按下
    {   
    delay_nms(200);
        while ((port_tmp&0x01)==0)
    	{
        shezhi=1;   //设置键的标志置1      
        }
    }  
}	  
	  
   
void shuzijia0 ()
{
port_tmp = PINB;

    while ((port_tmp&0x02)==0)  	 //数字加键的按下
    {   
    delay_nms(200);
        while ((port_tmp&0x02)==0)
    	{
        shuzijia=1;                 //数字加的标志置1
        }
    }  
}	   
          

void shuzijian0 ()
{
port_tmp = PINB;

    while ((port_tmp&0x04)==0)  	 //数字减的按下
    {   
    delay_nms(200);
        while ((port_tmp&0x04)==0)
    	{
       shuzijian=1;                 //数字减的标志置1   
        }
    }  
}	



void queren0 ()
{
port_tmp = PINB;

    while ((port_tmp&0x20)==0)  	 //确认键的按下
    {   
    delay_nms(200);
        while ((port_tmp&0x20)==0)
    	{
       queren=1;                  //确认的标志置1  
        }
    }  
}	


void tuichu0 ()
{
port_tmp = PINB;

    while ((port_tmp&0x80)==0)  	  //退出键的按下
    {   
    delay_nms(200);
        while ((port_tmp&0x80)==0)
    	    {
             tuichu=1;                 //退出的标志置1
             shezhi=0;
             tuichu=0;   
            }
    }
	
 }
//剩下3个键做备用







// ***********************************************************
// *                向 BC728X 发送一个字节                   *
// ***********************************************************
void send_byte(uchar send_byte)
{  
    uchar ba;
    DATA_RU; 
   	    do 
   	    {				  // 产生clk 脉冲
   		CLK_0;        
		delay_nus(2);
   		CLK_1;             //怎么是一个上升沿
		//delay_nus(2);
        }      while (DATA);     // 等待 BC728X 输出 dat 低电平响应
		    
		CLK_0;             // 再次输出一 clk 脉冲  
		delay_nus(2);
   		CLK_1; 
		//delay_nus(2); 
	    		
	 //   while (!DATA);    
	   // 等待 BC728X 进入接收状态
	   //再次输出一 clk 脉冲之后,DATA会变为高电位,(!DATA)为假  
	   //while (!DATA)退出循环    进入下一级
	   
       for (ba=0;ba<8;ba++)
   	       {			    // 发送 8 个比特
       		if ((send_byte&0x80)==0)
        		{
                 DATA_CHU;
         		 DATA_0;     // 如果待发bit为0, 置 dat 为 0
				 delay_nus(3);
         	 	}
            else
             	{
	             DATA_CHU;
             	 DATA_1;		// 反之置为 1
				 delay_nus(3);
             	}
    		    send_byte=send_byte*2;	// send_byte 左移一位
                //其实就是send_byte最高位丢弃不要了
				//剩下二进制是00000000
                //重新进入下一位的检测与发送

       		    CLK_0;			// 输出一 clk 脉冲
				delay_nus(2);
       		    CLK_1;
       		    delay_nus(8);		// 短暂延时
   	       }
     DATA_1;				// 恢复 dat 为高电平
   	 delay_nus(8);
}

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




/********************************************************/
/********************************************************/
/************************显示子函数**********************/
/********************************************************/
void shuzi_display(uchar shuzi)
{
    uchar  bf=0,baiwei=0,baiweisj=0,shiwei=0,shiweisj=0,gewei=0,geweisj=0;
    CLK_CHU;
	bf=shuzi;
    //7281开机就开始上电复位了   之后自然不用复位	
   
    baiwei=shuzi/100;
    //调用BC7281显示函数
    baiweisj=(baiwei|0x30);
    write728x(0x15, baiweisj);
    
    shiwei=((shuzi%100)/10);
    //调用BC7281显示函数
    shiweisj=(shiwei|0x20);
    write728x(0x15, shiweisj);
    
    gewei =((shuzi%100)%10);
    //调用BC7281显示函数
    geweisj=(gewei|0x10);
    write728x(0x15, geweisj);

}


/********************************************************/
/********************************************************/
/**********************0~255数字的选定*******************/
/********************************************************/

uchar shuzi_xuanze()                
{
uchar shuzi=0;        //  0~255
        
        while (shuzijia==1)           //数字加键确认
   	        {
		            shuzi++;
		            if(shuzi>255) shuzi=0;//要显示
                                  
					shuzi_display(shuzi);//调用bc7281程序   
  			      	shuzijia=0 ;  
   		    }
        while (shuzijian==1)           //数字减键确认
   	        {
     				  shuzi--;
		              if(shuzi<0)shuzi=255;
		              //要显示
                      //可以调用bc7281程序
					  shuzi_display(shuzi);
    	              shuzijian=0;
   		    }       		 
        if(queren==1) return shuzi; //需要确认才能返回 
			  
        queren=0;    		
}



/********************************************************/
/********************************************************/
/**********************项目选定子函数********************/
/********************************************************/


uchar  xiangmuxuanding()       
{
uchar xmzhi;

shuzi_xuanze();

xmzhi=shuzi_xuanze();

return xmzhi;

}

/********************************************************/
/********************************************************/
/**********************数值选定子函数********************/
/********************************************************/
uchar  shuzhixuanding()        
{
uchar shuzhi;

shuzi_xuanze();

shuzhi=shuzi_xuanze();

return shuzhi;

}

/***************写EEPROM子函数**********************************/

void W_EEP(uint add,uchar dat) 
{
while(EECR&(1<<EEWE));	
EEAR=add;			
EEDR=dat;			
EECR|=(1<<EEMWE);
EECR|=(1<<EEWE);	
}
//****************读EEPROM子函数*******************
uchar R_EEP(uint add)
{
while(EECR&(1<<EEWE));
EEAR=add;			
EECR|=(1<<EERE);
return EEDR;
}

/********************************************************/


/********************************************************/
/********************************************************/
/************************设置大函数**********************/
/********************************************************/







void shezhizong ()
{

        
        while (shezhi==1)    
        { 
		
          CLI();
          
          write728x(0x12,0x82); 
          // 初始化BC728x为164模式,不反相,BMS=1, KMS=0
         
          /**********************调用项目选定函数****有返回值*****/
          //xiangmuxuanding();
          //add=xiangmuxuanding();
        
          /********************调用数值选定函数****有返回值*******/
          //shuzhixuanding();
          //dat=shuzhixuanding();
                
          //  EEPROM的写函数(有2个形参)
          //***************写EEPROM子函数*****************
          W_EEP(xiangmuxuanding(),shuzhixuanding());
          shezhi=0;//退出设置大函数
          SEI(); //重新开启全局允许中断
          
        }
        

}

⌨️ 快捷键说明

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