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

📄 key_init.h

📁 使用IAR编写的DS1302时钟芯片驱动和4*4矩阵按键的扫描函数
💻 H
字号:
//******************************************************************************
//程序名称:按键初始化
//designed by lvshichao
//2008.10.1
//******************************************************************************
//#include "io430.h"
unsigned char key_real;                                                         //全局变量,按键返回值
unsigned char key_setflag=0;                                                    //定时器翻转,控制字的闪烁频率
unsigned char key_flash=0;                                                      //日期闪烁指针
unsigned key_va1,key_va2;                                                       //按键读取函数
unsigned char key_set_datah=0,key_set_datal=0;                                  //用于日期高低位设定的标志位
unsigned char key_set_1302;
//-------------------------------------------
//函数名称:delay_key()
//功能:软件延时
//-------------------------------------------
void delay_key(unsigned int i)
{
while(i--);
}
//------------------------------------------
//函数名称:row_scan()
//功能:确定键值
//------------------------------------------
unsigned char row_scan(void)
{
 unsigned char temp,key_temp;
 
 P1DIR=0XF0;
 P1OUT&=0X0F;
 temp=P1IN;
 if((temp&0x0f)<0x0f)    //检查是否有键按下
   {
    delay_key(0x5ff);    //延时,消除抖动
    temp=P1IN;
    if((temp&0x0f)<0x0f) //确定按键
      {
       switch(temp)
            {
            case 0x07: key_temp=1;break;  //第一行,有键按下
            case 0x0b: key_temp=2;break;  //第二行,有键按下
            case 0x0d: key_temp=3;break;  //第三行,有键按下
            case 0x0e: key_temp=4;break;  //第四行,有键按下
            
            }
       return key_temp; //返回键值
      }
    
   }
  return 0x7f;          //无键按下时,返回0x7f
}
//------------------------------------------
//函数名称:key_scan
//功能:按键扫描
//------------------------------------------
unsigned char key_scan(void)
{   
    unsigned char row_flag=0;//列扫描标志,当有键按下时,置位,确定键值
    unsigned char row_temp=0;//存放列扫描数据
    unsigned char key_temp=0;//
    P1DIR=0X0F;            //P1口设置为输出,行设置为低电平
    P1OUT&=0xf0;           //低四位设置为低电平
    key_temp=P1IN;         //读取键值
    if((key_temp&0XF0)<0XF0)//检查是否有键按下
    {
     delay_key(0x5ff);//延时,消除抖动
       
    key_temp=P1IN;         //确定按键
    if((key_temp&0xf0)<0xf0)      
     {
      //列按键有按下
       row_flag=1;        //列按键有键按下,下一步判断键值
      switch(key_temp)    //确认键值
           {
           case 0xe0: row_temp=1;break;  //第一列,有键按下
           case 0xd0: row_temp=2;break;  //第二列。有键按下
           case 0xb0: row_temp=3;break;  //第三列,有键按下
           case 0x70: row_temp=4;break;  //第四列,有键按下
           }
    
     }
    }
    else
      
    {
    return 0x7f;             //无键按下,返回0x7f
    }
    if(row_flag==1)         //扫描到有键按下,判断具体按键
      {
       row_flag=0 ;//清除置位标志
       switch(row_temp)
       {
       case 1:key_temp=row_scan();
              switch(key_temp)
                {
                case 1:key_real=1;break;//第一个按键按下
                case 2:key_real=5;break;//
                case 3:key_real=9;break;//
                case 4:key_real=13;break;//
                }break;
       case 2:key_temp=row_scan();
              switch(key_temp)
                   {
                   case 1:key_real=2;break;
                   case 2:key_real=6;break;
                   case 3:key_real=10;break;
                   case 4:key_real=14;break;
                   }break;
       case 3:key_temp=row_scan();
              switch(key_temp)
                   {
                   case 1:key_real=3;break;
                   case 2:key_real=7;break;
                   case 3:key_real=11;break;
                   case 4:key_real=15;break;
                   }break;
       case 4:key_temp=row_scan();
               switch(key_temp)
               {
               case 1: key_real=4;break;
               case 2: key_real=8;break;
               case 3: key_real=12;break;
               case 4: key_real=16;break;
               }break;
                
       
       }
       return key_real;//返回键值
        
      }
    

 
}
//------------------------------------------------------------------------------
//函数名称:key_1302_write()
//功能:按键修改DS1302的时间写入函数
//------------------------------------------------------------------------------

void key_1302_write(unsigned char select,unsigned char data)

{     
        unsigned char time_temp[8]; 
        unsigned char i;
       //-----------------------------------------------------------------------
       //读取现在时间 
       for(i=0;i<8;i++)
          {
          time_temp[i]=time_real_buf[i];
          }
        //disp_char(0x94,time_temp[1]);
       // LCD_write_data(time_temp[2]);
       //-----------------------------------------------------------------------
  
       //-----------------------------------------------------------------------
       //修改时间,先判断高低位修改顺序
       if(key_set_datah==1)                                                     //是否修改高位 
       { 
        key_set_datah=0;                                                        //高位修改关闭 
        key_set_datal=1;                                                        //允许低位修改
        data=(data<<4);
        for(i=1;i<7;i++)
           {
            time_temp[i]=(time_temp[i]&0x0f);
            time_temp[i]+=data;
           
           }
        disp_char(0x95,time_temp[1]);
       }
       else if(key_set_datal==1)
       {
       key_set_datah=1;
       key_set_datal=0;
       for(i=1;i<7;i++)
          {
          time_temp[i]=(time_temp[i]&0xf0);
          time_temp[i]+=data;
          }
       }
         
      //------------------------------------------------------------------------  
 ds1302_write_byte(ds1302_control_add,0x00);			                //关闭写保护 
 
 switch(select)
       {
       case 1: ds1302_write_byte(ds1302_year_add,time_temp[1]); break;                  //年
       case 2: ds1302_write_byte(ds1302_month_add,time_temp[2]); break;                 //月
       case 3: ds1302_write_byte(ds1302_date_add,time_temp[3]); break;                  //日
       case 4: ds1302_write_byte(ds1302_hr_add,time_temp[4]);  break;                   //时
       case 5: ds1302_write_byte(ds1302_min_add,time_temp[5]);break;                    //分 
       case 6: ds1302_write_byte(ds1302_sec_add,time_temp[6]); break;                    //秒
       
       }
 ds1302_write_byte(ds1302_control_add,0x80);			                //打开写保护 
               
}
//------------------------------------------------------------------------------
//函数名称:key_function
//功能:按键功能
//------------------------------------------------------------------------------
void key_function(void)
{  
   //---------------------------------------------------------------------------
   
   //---------------------------------------------------------------------------
   key_va1=key_scan();                                                          //读取按键
   if(key_va1!=0x7f)
   {
    do key_va2=key_scan();
    while(key_va1==key_va2);//等待按键释放
    
    //按键功能函数
     switch(key_va1)
      {
        
      //------------------------------------------------------------------------
      //功能按键区  
      case 11:break;
      case 12:                                                                  //确定按键
              //key_set_1302=0;                                                   //确定修改
              break;
      case 13:                                                                  //设置按键
              TACTL|=MC0;                                                       //定时器A允许工作,进入选定步骤                                                     
              key_setflag=1;                                                    //开始闪烁  
              key_set_1302=1;                                                   //时间设置标志,允许修改时间
              key_set_datah=1;                                                  //允许修改高位
              key_set_datal=0;
              //----------------------------------------------------------------
              key_flash++;                                                      //闪烁指针 
              if(key_flash==7)                                                  //每次按键,日期闪烁指针+1
                key_flash=1; 
              //----------------------------------------------------------------
              //disp_char(0x94,(key_flash+0x30));
              break;
              
      case 14:break;
      case 15:break;
      case 16:                                                                  //返回按键
              TACTL&=0XFFCF;                                                    //关闭定时器A
              key_set_1302=0;                                                   //关闭时间修改
              key_setflag=0;                                                    //正常显示
              key_flash=0;                                                      //闪烁指针清零
              disp_char(0x94,0x02);
              break;  
      //------------------------------------------------------------------------
      
      //------------------------------------------------------------------------
      //数字按键区        
      case 1: if(key_set_1302)                                                  //是否允许修改时间
              {
                //if(key_set_datah==0)                                             //高位是否修改
                  
                  
                 key_1302_write(key_flash,1);                                   //修改时间             
                 //disp_char(0x95,0x31);   
             
              
              }
              break;
              
      case 2: 
             if(key_set_1302)                           //
              {
               key_1302_write(key_flash,2);                                  //修改时间 
               //disp_char(0x95,0x32);
              }
              break;
             
      case 3:
             if(key_set_1302)
             {
             key_1302_write(key_flash,3);
             
             }
             break;
      case 4:
            if(key_set_1302)
            {
            key_1302_write(key_flash,4);            
            }
            break;
            
      case 5:
            if(key_set_1302)
            {
            key_1302_write(key_flash,5);
            }
            break;
            
      case 6:
            if(key_set_1302)
            {
            key_1302_write(key_flash,6);
            }
            break;
            
      case 7:
            if(key_set_1302)
            {
            key_1302_write(key_flash,7);
            
            }
            break;
            
      case 8:
           if(key_set_1302)
           {
           key_1302_write(key_flash,8);
           }
           break;
           
      case 9:                                                                   //s数字‘1’
            if(key_set_1302)
            {
            key_1302_write(key_flash,9);
            
            }
            break;
            
      case 10:                                                                  //数字‘0’
            if(key_set_1302)
            {
            key_1302_write(key_flash,0);
            }
            break;
      }
   }
   
   
   
 //-----------------------------------------------------------------------------
 //  时间显示
  if(key_setflag)
  {
          switch(key_flash)
    
          {
              case 1:   
                    disp_char(0x88,0x20);
                    LCD_write_data(0x20);
                    break;
  
              case 2:
                    disp_char(0x8a,0x20);
                    LCD_write_data(0x20);
                    break;
               case 3:
                    disp_char(0x8c,0x20);
                    LCD_write_data(0x20);
                    break;
  
              case 4:
                    disp_char(0x98,0x20);
                    LCD_write_data(0x20);
                    break;
  
             case 5:
                    disp_char(0x9a,0x20);
                    LCD_write_data(0x20);
                    break;
  
             case 6:
                  disp_char(0x9c,0x20);
                  LCD_write_data(0x20);
                  break;
            }
  }
  else
  {
  disp_number(0x88,time_real_buf[1]);//年
  
  disp_number(0x8a,time_real_buf[2]);//月
  disp_number(0x8c,time_real_buf[3]);//日
  disp_number(0x98,time_real_buf[4]);//时
  disp_number(0x9a,time_real_buf[5]);//分
  disp_number(0x9c,time_real_buf[6]);//秒
  disp_char(0x84,time_real_buf[1]);
  LCD_write_data(time_real_buf[2]);
  }  

}

⌨️ 快捷键说明

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