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

📄 main.c

📁 MSP430的P2口接4*4键盘
💻 C
字号:
#include <msp430x14x.h>
#include "key.h"


void delay(int v)
    {
        while(v!=0)v--;
    }


void InitBcs(void)
{
         unsigned int i;     
         WDTCTL=WDTPW+WDTHOLD;                           //关闭关门狗
        _BIS_SR(OSCOFF);                                
	BCSCTL1&=~XT2OFF;				//XT2开启 											//启动XT2振荡器,
	BCSCTL1 |= RSEL0+RSEL1+RSEL2;                   // 选择最高不标称频率
	DCOCTL = 0xE0;																	//DCOCLK频率最高,不利用MOD进行调整
	do
	{
		IFG1 &= ~OFIFG;						// Clear OSCFault flag
		for(i=0xFF;i>0;i--);				// Time for flag to set
	}
	while((IFG1 & OFIFG) == OFIFG);			// OSCFault flag still set?
	_NOP();		
	BCSCTL2 |= SELS+DIVS_2;                        //SMCLK  SOURCE  XT2/4=460.8KHz 
}

void InitUART1(void)
{
  P3SEL |= BIT6+BIT7;                            // P3.6,7 = USART1 TXD/RXD
  U1CTL |= SWRST;  
  U1CTL |= CHAR;                            // 8-bit character
  U1TCTL |= SSEL1;                          // UCLK = ACLK
  U1BR0 = 0x30;                             // 32k/9600 - 3.41
  U1BR1= 0x00;                             //
  U1MCTL = 0x00;                            // Modulation
  U1CTL &= ~SWRST;                          // Initialize USART state machine  
  ME2 |= UTXE1 + URXE1;                     // Enable USART0 TXD/RXD
  IE2 |= URXIE1;                            // Enable USART0 RX interrupt
  //IFG2 &= ~UTXIFG1;
  
}

void InitKey(void)
{
  KeyDIR=0X0f;
  KeyOUT=0X0f;
  Keybuff=0xff;
  
}  


 
unsigned char key(void)
  {
    unsigned char x=0xff;
    KeyDIR=0X0F;
    KeyOUT=0X01;                 //扫描第一行
    if((KeyIN&0Xf0)==0X10)         x=0;             
    else  if((KeyIN&0Xf0)==0X20)   x=4;                     
    else   if((KeyIN&0Xf0)==0x40)  x=8;  
    else   if((KeyIN&0Xf0)==0x80)  x=12;
    else 
    {
       KeyOUT=0X2;            //扫描第二行
       if((KeyIN&0Xf0)==0X10)          x=1;             
       else  if((KeyIN&0Xf0)==0X20)    x=5;                                
       else  if((KeyIN&0Xf0)==0x40)    x=9; 
        else   if((KeyIN&0Xf0)==0x80)  x=13;
       else
       {
             KeyOUT=0X4;           //扫描第三行
             if((KeyIN&0Xf0)==0X10)        x=2;            
             else  if((KeyIN&0Xf0)==0X20)  x=6;                                
             else   if((KeyIN&0Xf0)==0x40) x=10; 
              else   if((KeyIN&0Xf0)==0x80)  x=14;
             else 
              {
                KeyOUT=8;           //扫描第四行
                if((KeyIN&0Xf0)==0X10  )       x=3;         
                else  if((KeyIN&0Xf0)==0X20)   x=7;                     
                else if((KeyIN&0Xf0)==0x40)    x=11;
                 else   if((KeyIN&0Xf0)==0x80)  x=15;
              }
         }      
     }    
  return(x);
  }
  
  
unsigned char keyjudge(void) 
{
    unsigned char x;
    KeyDIR=0xff;
    KeyOUT=0x0;
    KeyDIR=0x0f;
    KeyOUT=0x0f;        //键盘硬件:P10--P13为行线,最上面一根为P10
    x=(KeyIN&0Xf0);      // P14--P16为列线,最左边一根为P14,列线下拉
    return(x);          // 无按键,返回 0?;  有按键返回 非0
}  


void GetKey()
{
  unsigned char ReleaseKey;
          if(keyjudge()!=0X00)
           {
           delay(1000)  ;   //消抖动
               if(keyjudge()!=0X0)
                 {
                    Keybuff=key();    //按键见键值保存到队列
                    TXBUF1=key();
                    while (!(IFG2 & UTXIFG1));                                                                   
                  }
            }
         ReleaseKey= keyjudge(); 
        while(ReleaseKey!=0X00)    ReleaseKey= keyjudge();    //等待键释放           
         KeyOUT=0X0f;         
}         
   
void TaskKey(void)
{
    GetKey();                                            //get key number  						
   /* if(( Keybuff>=0) && ( Keybuff<10))   DealNum();       
    else if( Keybuff==11)      Rest();						
    else if(Keybuff==12 )      DealDel();               
    else if( Keybuff==13)      Dealpschange();          
    else if( Keybuff==14)      DealENl();		                             
    else if( Keybuff==15)      Doorbell();   */         
   
    
}

void main(void)
{ 
  //WDTCTL = WDTPW + WDTHOLD;  /*   // Stop WDT */
  InitBcs();
  InitUART1();
  InitKey();
   //_EINT();                      /*/ Enable interrupts                 */
  while(1)
  {
   TaskKey();
   _NOP();
  }
  
}

//头文件

#ifndef __KEY_H__
#define __KEY_H__



#define   KeyDIR	P2DIR
#define   KeyOUT       	P2OUT
#define   KeyIN       	P2IN
unsigned char   Keybuff;            //

#endif  //__KEY_H__


⌨️ 快捷键说明

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