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

📄 main.c

📁 MSP430的P2口接4*4按键
💻 C
字号:

#include <msp430x14x.h>

//#include <msp430x14x.h>  
unsigned char keybuff[10];
unsigned char keypoint=0; 
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)
{
  P2DIR=0X0F;
  P2OUT=0X0F;
  P2IES=0X0;
  P2IE=0Xf0;    //列线上升沿允许P1中断
}  


 
unsigned char key(void)
  {
    unsigned char x=0xff;
    P2DIR=0X0F;
    P2OUT=0X01;                 //扫描第一行
    if((P2IN&0Xf0)==0X10)         x=0;             
    else  if((P2IN&0Xf0)==0X20)   x=4;                     
    else   if((P2IN&0Xf0)==0x40)  x=8;  
    else   if((P2IN&0Xf0)==0x80)  x=12;
    else 
    {
       P2OUT=0X2;            //扫描第二行
       if((P2IN&0Xf0)==0X10)          x=1;             
       else  if((P2IN&0Xf0)==0X20)    x=5;                                
       else  if((P2IN&0Xf0)==0x40)    x=9; 
        else   if((P2IN&0Xf0)==0x80)  x=13;
       else
       {
             P2OUT=0X4;           //扫描第三行
             if((P2IN&0Xf0)==0X10)        x=2;            
             else  if((P2IN&0Xf0)==0X20)  x=6;                                
             else   if((P2IN&0Xf0)==0x40) x=10; 
              else   if((P2IN&0Xf0)==0x80)  x=14;
             else 
              {
                P2OUT=8;           //扫描第四行
                if((P2IN&0Xf0)==0X10  )       x=3;         
                else  if((P2IN&0Xf0)==0X20)   x=7;                     
                else if((P2IN&0Xf0)==0x40)    x=11;
                 else   if((P2IN&0Xf0)==0x80)  x=15;
              }
         }      
     }    
  return(x);
  }
  
  
unsigned char keyjudge(void) 
{
    unsigned char x;
    P2DIR=0xff;
    P2OUT=0x0;
    P2DIR=0x0f;
    P2OUT=0x0f;        //键盘硬件:P10--P13为行线,最上面一根为P10
    x=(P2IN&0Xf0);      // P14--P16为列线,最左边一根为P14,列线下拉
    return(x);          // 无按键,返回 0?;  有按键返回 非0
}  
     
       
#pragma vector = PORT2_VECTOR
__interrupt void P2_Interrupt(void)
{
          unsigned char ReleaseKey;
          if(keyjudge()!=0X00)
           {
           delay(1000)  ;   //消抖动
               if(keyjudge()!=0X0)
                 {
                    keybuff[keypoint]=key();    //按键见键值保存到队列
                    TXBUF1=key();
                    while (!(IFG2 & UTXIFG1));                          
                    keypoint++;                 //
                    if(keypoint==10)  keypoint=0;                        
                  }
            }
         ReleaseKey= keyjudge(); 
        while(ReleaseKey!=0X00)    ReleaseKey= keyjudge();    //等待键释放           
         P2OUT=0X0F;
         P2IFG=0X0;         //清除中断标志
}
   
void main(void)
{ 
  //WDTCTL = WDTPW + WDTHOLD;  /*   // Stop WDT */
  InitBcs();
  InitUART1();
  InitKey();
   _EINT();                      /*/ Enable interrupts                 */
  
  while(1)
  {    
     LPM0;                   
    _NOP();   
   
  }
}



⌨️ 快捷键说明

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