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

📄 main.c

📁 自己开发的实用的430定时器自己开发的实用的定时器自己开发的实用的定时器自己开发的实用的定时器
💻 C
字号:
#include <msp430x41x.h>



//定义按键
#define SET 		BIT3  
#define START_UP	BIT4  
#define STOP_DOWN	BIT5  


//定义系统模式,由按键改变系统模式,不同的模式执行不同的任务
#define MODE_SET_TIME	        1
#define MODE_OK			10
#define MODE_UP			11
#define MODE_DOWN		12
#define MODE_START		2
#define MODE_STOP		3

//set_flag的几种状态值,根据其值移位分别调整minute的个位,十位和百位
#define BAIWEI    1
#define SHIWEI    2
#define GEWEI     3
#define DONE      4

// LCD segment definitions ( 4-mux LCD)
/*
#define SEG_F   0x80                            //  AAAA
#define SEG_G   0x40                            // F    B
#define SEG_E   0x20                            // F    B
#define SEG_D   0x10                            //  GGGG
#define SEG_A   0x08                            // E    C
#define SEG_B   0x04                            // E    C
#define SEG_C   0x02                            //  DDDD   H
#define SEG_H   0x01
*/


#define SEG_A   0x80                            //  AAAA
#define SEG_B   0x40                            // F    B
#define SEG_C   0x20                            // F    B
#define SEG_H   0x10                            //  GGGG
#define SEG_F   0x08                            // E    C
#define SEG_G   0x04                            // E    C
#define SEG_E   0x02                            //  DDDD   H
#define SEG_D	0x01

const unsigned char LCD_Tab[] = {
  SEG_A + SEG_B + SEG_C + SEG_D + SEG_E + SEG_F,          // Displays "0"
  SEG_B + SEG_C,                                          // Displays "1"
  SEG_A + SEG_B + SEG_D + SEG_E + SEG_G,                  // Displays "2"
  SEG_A + SEG_B + SEG_C + SEG_D + SEG_G,                  // Displays "3"
  SEG_B + SEG_C + SEG_F + SEG_G,                          // Displays "4"
  SEG_A + SEG_C + SEG_D + SEG_F + SEG_G,                  // Displays "5"
  SEG_A + SEG_C + SEG_D + SEG_E + SEG_F + SEG_G,          // Displays "6"
  SEG_A + SEG_B + SEG_C,                                  // Displays "7"
  SEG_A + SEG_B + SEG_C + SEG_D + SEG_E + SEG_F + SEG_G,  // Displays "8"
  SEG_A + SEG_B + SEG_C + SEG_D + SEG_F + SEG_G,          // Displays "9"
  SEG_A + SEG_B + SEG_C + SEG_E + SEG_F + SEG_G,          // Displays "A"
  SEG_B + SEG_C + SEG_E + SEG_F + SEG_G,                  // Displays "H"
  SEG_A + SEG_D + SEG_E + SEG_F,                          // Displays "C"
  SEG_D + SEG_E + SEG_F,                                  // Displays "L"
  SEG_A + SEG_B + SEG_E + SEG_F + SEG_G,                  // Displays "P"
  0x00                                                    // Displays Blank
};



//unsigned char menu=0;
//unsigned char flag=0;

unsigned int MODE=0;  //系统状态
unsigned char set_flag = 0;
//unsigned char editing = 0; //定义修改标志
//unsigned char flash = 0; //被修改位闪烁标志

unsigned char first_start = 0;

//unsigned char low_bat = 0; // low battary voltage flag

unsigned int minute;     
unsigned char second;  

unsigned char bat_second = 0;
unsigned char bat_minute = 0;

unsigned char ge=0,shi=0,bai=0;


unsigned int timer_set = 60;   // count_down timer value
//int timer_buffer[2] = {0};  //for MINITE and SECOND storage
unsigned char time_disbuff[6] = {0}; //datas for LCD display

//循环一次约5us
void delay(unsigned int v)
{
  while(v!=0)v--;
}


void ClrLcd(void)
{ 
  unsigned int i;          
  for(i=0;i<6;i++)
   LCDMEM[i]=0;
}

void InitLcd(void)
{ 
  LCDCTL|=LCDON+LCD4MUX+LCDP0;//LCDP1;
  BTCTL |= BTFRFQ0;  // BTFRQ0
  P5SEL|=0XFC;
  ClrLcd();
}

void InitBt(void)
{ 
  BTCTL=BT_ADLY_1000;  // for 1s timer interrupt
  //IE2 &= ~BTIE;
  IE2 |= BTIE; 
}
void InitPort(void)
{ 
  P1IE = 0;
  P1IFG = 0;
  
  P1IES |= STOP_DOWN+START_UP+SET;
  P1IE |= STOP_DOWN+START_UP+SET; //BIT3+BIT4+BIT5; 
  
  
  //设置比较器,做电池电压检测。接P1.6,CA0
  CACTL1 |= CARSEL+CAREF_2+CAON;//CAIES+CAIE+CAON;
  CACTL2 |= P2CA0+CAF;
  //CACTL1 &= ~CAON;
  
  //P1.7做电池欠压指示,正常输出0,欠压输出方波信号,指示灯闪烁
  P1DIR |= BIT7;
  P1OUT &= ~BIT7;
  
   
  //P2.0 控制电机启停,初始状态输出为0,关闭电机
  P2DIR |= BIT0; 
  P2OUT &= ~BIT0;
}
void InitSys(void)
{ 
  FLL_CTL0 |= XCAP14PF; 
  //TACTL = TASSEL0+MC1+TACLR; 
 
  InitPort();
  InitBt();
  InitLcd();    
}
void LCD_disp(unsigned char location,unsigned char num)
{  
   LCDMEM[location]=LCD_Tab[num];
}

//时间值转换为LCD显示的单个数字
void time_convert(void)
{
  time_disbuff[0] = minute/100;
  time_disbuff[1] = (minute%100)/10;
  time_disbuff[2] = minute%10;
  
  //time_disbuff[3] = SEG_G;
  
  time_disbuff[4] = second/10;
  time_disbuff[5] = second%10;
}

//时间显示函数
void time_display(void)
{
  unsigned char i; 
  for(i=0;i<6;i++)
  {
  	LCD_disp(i,time_disbuff[i]);
  	if(time_disbuff[0]==0)
  	{
  	  if(time_disbuff[1]==0)
  	  {
  	  	LCDMEM[0]=0;
  	  	LCDMEM[1]=0;
  	  }
  	  else
  	  	LCDMEM[0]=0;
  	}
  	
  	if(second==60)
  	{
  		LCDMEM[4] = LCD_Tab[0];
  		LCDMEM[5] = LCD_Tab[0];
  	}  
  	
  	if(i==3)LCDMEM[i] = SEG_G;
  }
}

//设置定时时间时,更新LCD显示
void LCD_update(void)
{
  unsigned char i; 
  
  time_disbuff[0] = minute/100;
  time_disbuff[1] = (minute%100)/10;
  time_disbuff[2] = minute%10;
  
  
  for(i=0;i<3;i++)
  {
  	LCD_disp(i,time_disbuff[i]);
  	
  	if(time_disbuff[0]==0)
  	{
  	  if(time_disbuff[1]==0)
  	  {
  	  	LCDMEM[0]=0;
  	  	LCDMEM[1]=0;
  	  }
  	  else
  	  	LCDMEM[0]=0;
  	}
  }
  LCDMEM[3] = SEG_G;
  LCDMEM[4] = LCD_Tab[0];
  LCDMEM[5] = LCD_Tab[0];
}

//设置定时时间
void set_time(void)
{
  
  //IE2 |= BTIE;
        P1IE &= ~(STOP_DOWN+START_UP);
	//second = 60;
	    LCDMEM[0] = LCD_Tab[bai];
		LCDMEM[1] = LCD_Tab[shi];
		LCDMEM[2] = LCD_Tab[ge];
	
        LCDMEM[3] = SEG_G;
        LCDMEM[4] = LCD_Tab[0];
        LCDMEM[5] = LCD_Tab[0];
	
     
    
        while(set_flag==BAIWEI)  //if
        {
          LCDMEM[0] |= SEG_H;
          if(!(P1IN&START_UP))
          {
                bai ++;
				if(bai>9)bai=0;
                LCDMEM[0] = LCD_Tab[bai]|SEG_H;
               
                delay(60000);
          }
          if(!(P1IN&STOP_DOWN))
          {
              
				if(bai<1)bai=9;
                                else   bai --;
		        LCDMEM[0] = LCD_Tab[bai]|SEG_H;
               
                delay(60000);
          }  
        }
        
        while(set_flag==SHIWEI)
        {
          LCDMEM[1] |= SEG_H;
          if(!(P1IN&START_UP))
          {
                shi ++;
				if(shi>9)shi=0;
		
                LCDMEM[1] = LCD_Tab[shi]|SEG_H;
               
                delay(60000);
          }
          if(!(P1IN&STOP_DOWN))
          {
                
				if(shi<1)shi=9;
		                 else  shi --; 
                LCDMEM[1] = LCD_Tab[shi]|SEG_H;
               
                delay(60000);
          }  
        }
        
        while(set_flag==GEWEI)
        {
          LCDMEM[2] |= SEG_H;
          if(!(P1IN&START_UP))
          {
                ge ++;
				if(ge>9)ge=0;
		
                LCDMEM[2] = LCD_Tab[ge]|SEG_H;
                
                delay(60000);
          }
          if(!(P1IN&STOP_DOWN))
          {
				if(ge<1)ge=9;
                                else ge --;
                LCDMEM[2] = LCD_Tab[ge]|SEG_H;
                
                delay(60000);
          }  
        }
        
        if(set_flag==DONE)
        {
          set_flag = 0;
          if(bai>0)
          {
            minute = bai*100+shi*10+ge;
          }
          else
          {
            minute =shi*10+ge;
          }
          
          bai=0;shi=0;ge=0;
          
          second = 60;
          ClrLcd();
          LCD_update();
        }
    
    MODE = 0;    
	
    P1IE |= STOP_DOWN+START_UP;
}

//启动电机,开始采样
void motor_start(void)
{
	if(minute<1)return;
	
	P2OUT |= BIT0;
	/*
	if(first_start)
	{
		delay(40000);
		delay(30000);
		first_start = 0;
	}*/
	//IE2 |= BTIE; //开启BT中断
	
}

//关闭电机,停止采样,采样时间回复初始值
void motor_stop(void)
{
	P2OUT &= ~BIT0;
	
	//IE2 &= ~BTIE; //关闭BT中断
	
	minute = timer_set;
	second = 60;
	   
	LCD_update();
   
}




void main (void)
{
  //int timer_set = 60;   // 默认设置时间,分钟
  
  WDTCTL = WDTPW + WDTHOLD;
  InitSys();    
  
  
  
  _EINT();
  
  minute = timer_set;
  second = 60;
  LCD_update();
  
 
  while(1)                  
  {
  // _BIS_SR(LPM3_bits+GIE);
  switch(MODE)
  {
  	case MODE_SET_TIME:
          {
              set_time();
              break;
          }
  		
  	
  	case MODE_START:
          {
              motor_start();
  	      	  time_convert();
              time_display();
              break;
          }
  		 
        
  	
  	case MODE_STOP:
          {
              motor_stop();
              break;
          }
  		
  	
  	default:
          {
             //_BIC_SR_IRQ(LPM3_bits);
              break;
          }
  	      
  }	
  	
  }
  
  
}



// 1000ms timer
#pragma vector = BASICTIMER_VECTOR
__interrupt void BTISR (void)
{
  //if(!(editing))
  //{
    if((MODE == MODE_START)&&(minute>0))
    {
        second --;
    	if(second <1)
    	{
      	second = 60;
      	minute --;
    
      	if(minute<1)
      	{
        	MODE = MODE_STOP;
      	}
        }
    }
    if(!(CACTL2&CAOUT)) // 如果电池电压低,BT提供LED闪烁时基
    {
    	//bat_second ++;
    	P1OUT ^= BIT7;
    	/*if(bat_second>59)
    	{
    		bat_second = 0;
    		bat_minute ++;
    		if(bat_minute>5)   // 检测到电池电压低,5分钟以后关闭电机,停止采样
    		{
    			bat_minute = 0;
    			MODE = MODE_STOP;
    			return;
    		}
    	}*/
    }
    
    
   
  
}


#pragma vector = PORT1_VECTOR
__interrupt void P1ISR (void)
{ 
   if(P1IFG&SET)//(!(P1IN&SET))
   {
   	delay(3000); //延时15ms,按键去抖
   	if(!(P1IN&SET))
   	{
          
            if(MODE==MODE_START)
            	return;
            else
            {
            	MODE = MODE_SET_TIME;                
                
                
                set_flag +=1;
                if(set_flag>4)set_flag=0;
            	
            	while(!(P1IN&SET)){_NOP();}  //按键抬起检测
                
            }
    
   	}
   	   _BIC_SR_IRQ(LPM3_bits);
   }
   else if(P1IFG&START_UP)//(!(P1IN&START_UP))
   {
   	delay(3000);
   	if(!(P1IN&START_UP))
   	{
   		
   		MODE = MODE_START;
   		first_start = 1;
   
   	}
   	_BIC_SR_IRQ(LPM3_bits);
   }
   else if(P1IFG&STOP_DOWN)//(!(P1IN&STOP_DOWN))
   {
   	delay(3000);
   	if(!(P1IN&STOP_DOWN))
   	{
   		
   		MODE = MODE_STOP;
   	
   	}
   	_BIC_SR_IRQ(LPM3_bits);
   }
   
          
   P1IFG = 0;
   
}




//interrupt[TIMERA0_VECTOR] void Timer_A (void)
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
  //_DINT();
  return;
}


⌨️ 快捷键说明

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