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

📄 449的键盘程序(带连击键处理).txt

📁 MSP430框架程序。适用于MSP430F449
💻 TXT
📖 第 1 页 / 共 2 页
字号:
于本站449的键盘程序(带连击键处理)

微控论坛原创作品 作者:xuesheng 
Microcontrol CODE 

包括74hc595驱动,键盘用定时中断实现。 
main。c 
/*****************************************************************************\\ 

文件名:main.c 
描述:MSP430框架程序。适用于MSP430F449,其他型号需要适当改变。 
      不使用的中断函数保留或者删除都可以,但保留时应确保不要打开不需要的中断。 
      保留中断函数,编译器将会为BSL密码填充所有的字节。 
版本:1.0      2005-1-13 
\*****************************************************************************/ 

//头文件 
#include <MSP430x44x.h> 
#include "lcd.h" 
#include "key.h" 
#include "hc595.h" 
typedef unsigned char Uchar; 
typedef unsigned int  Uint; 
//全局变量声明 
Uchar addr=0; 

//函数声明 
void InitSys(); 


int main( void ) 
{ 

  WDTCTL = WDTPW + WDTHOLD;                //关闭看门狗 

  InitSys();                              //初始化 
key_ok=0; 
byte_0fhc595_out(addr); 
LCDMEM[6]=digit[addr%10];//个 
  LCDMEM[5]=digit[addr/10%10];//十 
  LCDMEM[4]=digit[addr/100%10];//百 
  LCDMEM[3]=digit[0];//十分 
  LCDMEM[2]=digit[0];//个时 
  LCDMEM[1]=digit[0];//十时 
start: 
  //以下填充用户代码 


     LPM3;      //进入低功耗模式n,n:0~4。若不希望进入低功耗模式,屏蔽本句 
        if(key_ok==1) 
        { 
          switch(key_data) 
          { 
          case  0x18: 
            addr=0; 
            P1OUT=0;break; 
          case  0x14: 
            addr+=32;   
            if(P1OUT & BIT2) 
               P1OUT &= ~BIT2; 
            else 
               P1OUT |= BIT2; 
              if(P3OUT & BIT7) 
               P3OUT &= ~BIT7; 
            else 
               P3OUT |= BIT7;break; 
          case  0x12: 
            addr--; 
            if(P1OUT & BIT3) 
               P1OUT &= ~BIT3; 
            else 
               P1OUT |= BIT3; 
            if(P3OUT & BIT7) 
               P3OUT &= ~BIT7; 
            else 
               P3OUT |= BIT7;break; 
          case  0x11: 
            addr++; 
            if(P1OUT & BIT1) 
               P1OUT &= ~BIT1; 
            else 
               P1OUT |= BIT1; 
            if(P3OUT & BIT7) 
               P3OUT &= ~BIT7; 
            else 
               P3OUT |= BIT7;break; 
          } 
         key_ok=0; 
  LCDMEM[6]=digit[addr%10];//个 
  LCDMEM[5]=digit[addr/10%10];//十 
  LCDMEM[4]=digit[addr/100%10];//百 
  LCDMEM[3]=digit[0];//十分 
  LCDMEM[2]=digit[0];//个时 
  LCDMEM[1]=digit[0];//十时 
  byte_0fhc595_out(addr); 
        } 
     goto start; 

} 

/***************************************************************************** 
系统初始化 
******************************************************************************/ 
void InitSys() 
{ 
   unsigned int iq0; 

//使用XT2振荡器 
   FLL_CTL1&=~XT2OFF; //打开XT2振荡器 
   do 
   { 
             IFG1 &= ~OFIFG;                              // 清除振荡器失效标志 
             for (iq0 = 0xFF; iq0 > 0; iq0--);            // 延时,等待XT2起振 
       } 
       while ((IFG1 & OFIFG) != 0);                        // 判断XT2是否起振 

       FLL_CTL1 =SELM1+SELS;                              //选择MCLK、SMCLK为XT2 

     //以下填充用户代码,对各种模块、中断、外围设备等进行初始化 
    //****************************************************************************** 
  LcdInit(); 
  IoInit(); 
    
  TACTL=TASSEL1+TACLR+ID0+ID1;//Timer_a 125ns*20000*8中断 8分频 
    CCTL0=CCIE; 
    CCR0=20000; 
    TACTL|=MC0; 
    
   _EINT();      //打开全局中断控制,若不需要打开,可以屏蔽本句 
} 
/***************************************************************************** 
端口2中断函数 
******************************************************************************/ 
#pragma vector=PORT2_VECTOR 
__interrupt void Port2() 
{ 
     //以下为参考处理程序,不使用的端口应当删除其对于中断源的判断。 
     if((P2IFG&BIT0) == BIT0) 
     { 
           //处理P2IN.0中断 
           P2IFG &= ~BIT0; //清除中断标志 
           //以下填充用户代码 

     } 
     else if((P2IFG&BIT1) ==BIT1) 
     { 
           //处理P2IN.1中断 
           P2IFG &= ~BIT1;      //清除中断标志 
           //以下填充用户代码 


     } 
     else if((P2IFG&BIT2) ==BIT2) 
     { 
           //处理P2IN.2中断 
           P2IFG &= ~BIT2;      //清除中断标志 
           //以下填充用户代码 

     } 
     else if((P2IFG&BIT3) ==BIT3) 
     { 
           //处理P2IN.3中断 
           P2IFG &= ~BIT3;      //清除中断标志 
           //以下填充用户代码 


     } 
     else if((P2IFG&BIT4) ==BIT4) 
     { 
           //处理P2IN.4中断 
           P2IFG &= ~BIT4;      //清除中断标志 
           //以下填充用户代码 

     } 
     else if((P2IFG&BIT5) ==BIT5) 
     { 
           //处理P2IN.5中断 
           P2IFG &= ~BIT5;      //清除中断标志 
           //以下填充用户代码 

     } 
     else if((P2IFG&BIT6) ==BIT6) 
     { 
           //处理P2IN.6中断 
           P2IFG &= ~BIT6;      //清除中断标志 
           //以下填充用户代码 

     } 
     else 
     { 
           //处理P2IN.7中断 
           P2IFG &= ~BIT7;      //清除中断标志 
           //以下填充用户代码 

     } 
  LCDMEM[6]=digit[addr%10];//个 
  LCDMEM[5]=digit[addr/10%10];//十 
  LCDMEM[4]=digit[addr/100%10];//百 
  LCDMEM[3]=digit[0];//十分 
  LCDMEM[2]=digit[0];//个时 
  LCDMEM[1]=digit[0];//十时 
     LPM3_EXIT;      //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽 
} 

/***************************************************************************** 
USART1发送中断函数 
******************************************************************************/ 
#pragma vector=USART1TX_VECTOR 
__interrupt void Usart1Tx() 
{ 
     //以下填充用户代码 


     LPM3_EXIT;      //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽 
} 

/***************************************************************************** 
USART1接收中断函数 
******************************************************************************/ 
#pragma vector=USART1RX_VECTOR 
__interrupt void Ustra1Rx() 
{ 
     //以下填充用户代码 


     LPM3_EXIT;      //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽 
} 

/***************************************************************************** 
端口1中断函数 
多中断中断源:P1IFG.0~P1IFG7 
进入中断后应首先判断中断源,退出中断前应清除中断标志,否则将再次引发中断 
******************************************************************************/ 
#pragma vector=PORT1_VECTOR 
__interrupt void Port1() 
{ 
     //以下为参考处理程序,不使用的端口应当删除其对于中断源的判断。 
     if((P1IFG&BIT0) == BIT0) 
     { 
           //处理P1IN.0中断 
           P1IFG &= ~BIT0;      //清除中断标志 
           //以下填充用户代码 

     } 
     else if((P1IFG&BIT1) ==BIT1) 
     { 
           //处理P1IN.1中断 
           P1IFG &= ~BIT1;      //清除中断标志 
           //以下填充用户代码 

     } 
     else if((P1IFG&BIT2) ==BIT2) 
     { 
           //处理P1IN.2中断 
           P1IFG &= ~BIT2;      //清除中断标志 
           //以下填充用户代码 

     } 
     else if((P1IFG&BIT3) ==BIT3) 
     { 
           //处理P1IN.3中断 
           P1IFG &= ~BIT3;      //清除中断标志 
           //以下填充用户代码 

     } 
     else if((P1IFG&BIT4) ==BIT4) 
     { 
           //处理P1IN.4中断 
           P1IFG &= ~BIT4;      //清除中断标志 
           //以下填充用户代码 

     } 
     else if((P1IFG&BIT5) ==BIT5) 
     { 
           //处理P1IN.5中断 
           P1IFG &= ~BIT5;      //清除中断标志 
           //以下填充用户代码 

     } 
     else if((P1IFG&BIT6) ==BIT6) 
     { 
           //处理P1IN.6中断 
           P1IFG &= ~BIT6;      //清除中断标志 
           //以下填充用户代码 

     } 
     else 
     { 
           //处理P1IN.7中断 
           P1IFG &= ~BIT7;      //清除中断标志 
           //以下填充用户代码 

     } 

     LPM3_EXIT;      //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽 
} 

/***************************************************************************** 
定时器A中断函数 
多中断中断源:CC1~2 TA 
******************************************************************************/ 
#pragma vector=TIMERA1_VECTOR 
__interrupt void TimerA1() 
{ 
     //以下为参考处理程序,不使用的中断源应当删除 
     switch ((TAIV)) 
     { 
           case 2: 
                 //捕获/比较1中断 
                 //以下填充用户代码 

           break; 
           case 4: 
                 //捕获/比较2中断 
                 //以下填充用户代码 

           break; 
 /*               case 6: 
                 //捕获/比较3中断 
                 //以下填充用户代码 

           break; 
                case 8: 
                 //捕获/比较4中断 
                 //以下填充用户代码 

           break;*/ 
           case 10: 
                 //TAIFG定时器溢出中断 
                 //以下填充用户代码 

           break; 
     } 


     LPM3_EXIT;      //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽 
} 

/***************************************************************************** 
定时器A中断函数 
中断源:CC0 
******************************************************************************/ 
#pragma vector=TIMERA0_VECTOR 
__interrupt void TimerA0() 
{ 
     //以下填充用户代码 
KeyScan(); 

     LPM3_EXIT;      //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽 
} 

/***************************************************************************** 
AD转换器中断函数 
多中断源:摸拟0~7、VeREF+、VREF-/VeREF-、(AVcc-AVss)/2 
没有处理ADC12TOV和ADC12OV中断标志 

449ad通道数量 我 不明确 
******************************************************************************/ 
#pragma vector=ADC_VECTOR 
__interrupt void Adc() 
{ 
     //以下为参考处理程序,不使用的中断源应当删除 
     if((ADC12IFG&BIT0)==BIT0) 
     { 
           //通道0 
           //以下填充用户代码 

     } 
     else if((ADC12IFG&BIT1)==BIT1) 
     { 
           //通道1 
           //以下填充用户代码 

⌨️ 快捷键说明

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