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

📄 12键盘密码锁.txt

📁 MSP430F449 12密码锁 MSP430F449 MSP430F449 MSP430F449
💻 TXT
字号:
#include <msp430x44x.h>
#define KEY_BOARD 1

unsigned char key_Pressed,      // 是否有键值按下
              key_val,          // 存放键值
              key_Flag;         // 是否一个按下的按键已经松开,
                                // 即是按键的键值可以读取
                                 
unsigned char key_Map[12] ={    //设置键盘逻辑键值与程序计算键值的映射
                           1,2,3,10,4,5,
                           6,0,7,8,9,11
                           };
/********************************************************
*  初始化键盘设备
********************************************************/
void init_Keyboard(void){
     
      P1DIR &= 0x01;  // P1.4~P1.7 设置为输入模式
      P1DIR |= 0x0E;  // set p1.1~p1.3 设置为输出模式
      P1OUT |= 0x0E;  // p1.1~p1.3 输出值清零
      key_Flag    = 0;// 初始化key_Flag 
      key_Pressed = 0;// 初始化key_Pressed 
      
}
/*********************************************
* Check_Key(),检查按键,确认键值
*********************************************/
void check_Key(void){
    
    unsigned char row ,col,tmp1,tmp2;
    // tmp1用来设置P1OUT的值,使P1.1~P1.3中有一个为0
    tmp1 = 0x08;
    for(row=0;row<3;row++){
        P1OUT |= 0x0E;                          // p1.1~P1.3=1
        P1OUT -= tmp1;                          // P1.1~p1.3中有一个为0
        tmp1 = tmp1/2;                          // tmp1 右移一位      
        if ((P1IN & 0xf0) < 0xf0){              // 是否P1IN的P1.4~P1.7中有一位为0         
           tmp2 = 0x80;                         // tmp2用于检测出那一位为0  
           for(col =0;col<0x04;col++){          // 列检测 
              if((P1IN & tmp2)==0x00){          // 是否是该列
                key_val =key_Map[ row*4 +col] ; // 获取键值
                return;                         // 退出循环
              }
              tmp2 /= 2;                        // tmp2右移 
           }
        }
    }
         
}

void delay(){
     unsigned char tmp;
      for(tmp=0xff;tmp>0;tmp--);
}
/************************************************************
*  key_Event(),检测键盘是否有键按下,如果有获取键值
*************************************************************/
void key_Event(void){
     
     unsigned char tmp;
     P1OUT &= 0x01;         // 设置P1OUT输出值
     tmp = P1IN;            // 获取 p1IN
     if ((key_Pressed ==0x00)&&((tmp & 0xf0) < 0xf0)) 
     {                      //是否有键按下
         key_Pressed = 1;   // 如果有按键按下,设置key_Pressed标识
         delay();           //消除抖动
         check_Key();       // 调用check_Key(),获取键值
     }else if ((key_Pressed ==1)&&((tmp & 0xf0) == 0xf0))
     {                      //是否按键已经释放
         key_Pressed = 0;   // 清除key_Pressed标识
         key_Flag    = 1;   // 设置key_Flag标识
     }
     
}

#define LED_IN_USE 6

const unsigned char NUM_LED[17]=
                       {0xd7,0x14,0xcd,0x5d,0x1E,  // 0 ~ 4
                       0x5b,0xdb,0x15,0xdf,0x5f,   // 5 ~ 9
                       0x9f,0xda,0xc3,0xcc,0xcf,   // a ~ e
                       0x8b,0x00};                 //f,0x00使LED不显示

                       
unsigned char led_Buf[LED_IN_USE];  // LED显示缓冲区 ,
                                    // 存放要显示数据                         
unsigned char led_Ctrl;
/*******************************************************
*     模块初始化
*******************************************************/
void init_LED(void){
    char tmpv;
    P3DIR  = 0xff;    // 设置 p3 输出  
    P3OUT  = 0x00;    // 设置 初始值为0
    P4DIR |= 0x03;    // 设置 p4.0,p4.1 输出 
    P4OUT &= 0xfc;    // 设置初始值
    led_Ctrl = 0;     // led_Ctrl用于控制那个LED可显示
    for(tmpv=0;tmpv<LED_IN_USE;tmpv++)
    {                 // 初始化缓冲区 
      led_Buf[tmpv] = 0;
    }
    
}
/****************************************************
*     LED 显示  ,该函数可以放到定时器中断中
****************************************************/
void led_Display(){                   
    unsigned tmp ;
      
      tmp    = 0x01;
      P3OUT  = NUM_LED[led_Buf[led_Ctrl]];  // 设置显示值
      P4OUT |= 0x02;                        // 打开数据锁存器 
      P4OUT &= 0XFD;                        // 关闭数据锁存
      P3OUT  = ~(tmp<<led_Ctrl);            // 设置那只LED显示 
      P4OUT  |= 0x01;                       // 打开控制锁存
      P4OUT  &= 0XFE;                       // 关闭控制锁存
      led_Ctrl= (led_Ctrl +1) % LED_IN_USE; // 设置下一个要显示的LED
      
}



void main(void)
{   
     unsigned char keyin[]={1,2,3,4,5,6};
     WDTCTL = WDTHOLD + WDTPW ;          // 停止看门狗
 ggg:P5DIR |= 0x02;
     P5OUT &=0X00;
     
     char k[6]={0};
     
               
     init_Keyboard();                     // 初始化键盘                
     while(1)
     {
           for(int i=0;i<6;)
           {
            key_Event();                  //检测按键事件
            if (key_Flag == 1)           // 检测key_val里是否有键值可以读取
              {
                k[i]=key_val;
                i++;
                key_Flag= 0;
              }
            
           }
    if( k[0] == keyin[0])
        if( k[1] == keyin[1])
          if( k[2] == keyin[2])
            if( k[3] == keyin[3])
              if( k[4] == keyin[4])
                if(k[5] == keyin[5])
                 {
                  P5OUT |=0X02;
                  goto kkk;
                 }
         else
           P5OUT &=~0X02;
       else
         P5OUT &=~0X02;
     else
        P5OUT &=~0X02;
    else
       P5OUT &=~0X02;
   else
      P5OUT &=~0X02;
     }
     
 kkk:  for(int j=0;j<6;j++)
     {
       keyin[j]=(( keyin[j]+5)/2)%12;
     }  
  led_Ctrl =0;
  init_LED();
  for(unsigned char i=99999999;i!=0;i--)
  {
 for(int i=0;i<6;i++)
  { 
    led_Buf[led_Ctrl]=keyin[i];
    led_Display();
    delay(500);
  
  }
  } 
 goto ggg; 
     
     
}
             
             
             
             
      







 

 

⌨️ 快捷键说明

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