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

📄 149_5.c

📁 这个是MSP430F1494位数码管+1显示程序
💻 C
字号:
//*************************************
//*  149_5.C for LED Key_scan,process *
//*     LPM3       LDT 2006/11/30     *
//*************************************
#include"msp430x14x.h"
const unsigned char NUM_LED[12]=
{0XDB,0X88,0X97,0X9D,0XCC,0X5D,0X5F,0X98,0XDF,0XDD,0X04,0X00};
// 0 ,  1 ,  2 ,  3 ,  4 ,  5 ,  6 ,  7 ,  8 ,  9 ,  - ,Dark //
const unsigned int Limit[10]=
{50,12,31,24,60,999,999,999,800,50};
unsigned int TaskData[10]={7,5,1,12,30,15,4,800,200,30};
unsigned char LED_BUF[3];
unsigned char LED_CTRL;
unsigned int RTC =0;
unsigned char wait_time=0;
unsigned char KEY_VALUE=0;
unsigned char KEY1_FLAG=0;
unsigned char KEY2_FLAG=0;
unsigned char KEY3_FLAG=0;
unsigned char LPM_FLAG=0;
unsigned char KeyValue;
unsigned char Tast=0;
unsigned char X=0;
unsigned char DelayCnt=0;

void Init_CLK(void)
{
    unsigned char i;
    BCSCTL1 = 0X00;			//将寄存器的内容清零
					//XT2振荡器开启
					//LFTX1工作在低频模式
					//ACLK的分频因子为1
					
    do
    {
	IFG1 &= ~OFIFG;                       // 清除OSCFault标志
	for (i = 0x20; i > 0; i--);
    }
    while ((IFG1 & OFIFG) ==0);      // 如果OSCFault =1
					
    BCSCTL1 &= ~(XT2OFF + XTS);//open XT2, LFTX2 select low frequency
    BCSCTL1 |= RSEL0 + RSEL1 + RSEL2; //DCO Rsel=7(Freq=3200k/25摄氏度)
    BCSCTL1 |= 0x07;
    BCSCTL2 += SELM1;		//MCLK的时钟源为TX2CLK,分频因子为1
    BCSCTL2 += SELS;		//SMCLK的时钟源为TX2CLK,分频因子为1

}
void Init_TimerB(void)
{
    TBCTL = TBSSEL0 + TBCLR;    // 选择ACLK,清除TAR
    TBCCTL0 = CCIE;             // TBCCR0 中断允许
    TBCCR0 = 32768;	        // 时间间隔为 1 s

    TBCTL |= MC0;               // 增记数模式
}

void Init_WDT(void)
{
  WDTCTL=WDT_ADLY_1000;
  IE1=WDTIE;
}

void Init_InputPort(void)
{
  P1DIR=0;                      //P1输入
  P1SEL=0;
  P1IE=0X00;                    //P1不允许中断
  P1IES=0X00;                   // 上升沿触发
  P1IFG=0;
}

void Init_DispPort(void)
{
  P4DIR=0;
  P4SEL=0;
  P5DIR=0;
  P5SEL=0;
  P4DIR=0xff;
  P5DIR=0xff;
  char i;
  LED_CTRL=0;
  for(i=0;i<3;i++)
  {
    LED_BUF[i]=0;
  }
}

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

void KeyProcess(void)
{
  char i;
 KeyValue=P1IN&0XE0;
 delay(100);
   if(KeyValue!=(P1IN&0XE0))
   {
     KeyValue=0XE0;
   }
 switch (KeyValue)
 {
 case 0XE0:    //No key press
   DelayCnt=0;
   break;
 case 0X60:    // bit7 press;Function Select
   wait_time=0;
   KEY2_FLAG=0;
   KEY3_FLAG=0;
   if ((KEY1_FLAG==1)&(DelayCnt==0))
   {
     Tast++;
     if(Tast>9) Tast=0;
   }
   DelayCnt++;
   KEY1_FLAG=1;
   LED_BUF[0]=10;
   LED_BUF[2]=10;
   LED_BUF[1]=Tast;
    break;

 case 0XA0:    // bit6 press;INC
   wait_time=0;
   KEY1_FLAG=0;
   KEY3_FLAG=0;
   if ((KEY2_FLAG==1)&(DelayCnt==0))
   {
     TaskData[Tast]++;
     DelayCnt=0;
       if (TaskData[Tast]>Limit[Tast])
       TaskData[Tast]=0;
   }
     DelayCnt++;
     X=TaskData[Tast];
     KEY2_FLAG=1;
  for (i=0;i<3;i++)
  {
    LED_BUF[i]=X%10;
    X/=10;
  }
   break;

 case 0XC0:    // bit5 press;DEC
   wait_time=0;
   KEY2_FLAG=0;
   KEY1_FLAG=0;
   if ((KEY3_FLAG==1)&(DelayCnt==0))
   {
       TaskData[Tast]--;
       if (TaskData[Tast]==0)
       TaskData[Tast]=Limit[Tast];
   }
    DelayCnt++;
    X=TaskData[Tast];
    KEY3_FLAG=1;
  for (i=0;i<3;i++)
  {
    LED_BUF[i]=X%10;
    X/=10;
  }
 }
}

void LED_DISPLAY()
{
  unsigned tmp;
  tmp=0x01;
  P4OUT=0;
  P5OUT=NUM_LED[LED_BUF[LED_CTRL]];
  P4OUT=tmp<<LED_CTRL;
  LED_CTRL=(LED_CTRL+1)%3;
}

void DISP_OFF()
{
  P4OUT=0;
  P5OUT=0;
}

void main(void)
{
  WDTCTL=WDTPW+WDTHOLD;
  _DINT();
  Init_InputPort();
  Init_DispPort();
  Init_CLK();
  Init_WDT();
  Init_TimerB();
  _EINT();
  for(;;)
  {
    KeyProcess();
    LED_DISPLAY();
    delay(800);
    }
 }

// TimerB interrupt service routine
#pragma vector=TIMERB0_VECTOR
__interrupt void timerB_ISR(void)
{
    RTC++;
}

// PORT1 interrupt service routine//
#pragma vector=PORT1_VECTOR
__interrupt void PORT1_ISR(void)
{
  P1IE=0X00;                  //P1不允许中断
  P1IFG=0;
  Init_WDT();
  LPM_FLAG=0;
  wait_time=0;
  _BIC_SR_IRQ(LPM3_bits);     //退出LPM3_model
}

// WDT interrupt service routine//
#pragma vector=WDT_VECTOR
__interrupt void WDT_ISR(void)
{
    wait_time++;
    if(wait_time>=10)
    {
    wait_time=0;
    DISP_OFF();
    LPM_FLAG=1;
    WDTCTL=WDTPW+WDTHOLD;       //WDT 关闭
    P1IE=0XE0;                  //P1允许中断
    _BIS_SR(LPM3_bits+GIE);     //Enter the LPM3 model interrupt_EN
    }
 }

⌨️ 快捷键说明

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