www.pudn.com > msp430_Temperature.rar > section3.c


#include  
#include "alarm.h" 
 
#define AT_DATA1   0xef00 
#define AT_DATA2   0xf000 
#define AT_DATA3   0xf100 
#define AT_DATA4   0xf200 
 
// 全局变量 
int FLAG_PORT; 
int PORT_INPUT; 
int PORT_count; 
int nADC_Flag; 
int nADC_Count; 
int ADC_BUF_Temp[10]; 
int ADC_BUF[10; 
int UP1;// 上门限整数部分 
int UP2;// 上门限小数部分 
int DOWN1; // 下门限整数部分 
int DOWN2; // 下门限小数部分 
void main(void) 
{ 
    int nTemp; 
    int *pFlash; 
    int nRes; 
    int nCount; 
    char chrTemp[6]; 
    float fTemp; 
     
    int m_up1; 
    int m_up2; 
    int m_down1; 
    int m_down2; 
    char nTemp1; 
    char nTemp2; 
    char nTemp3; 
     
    WDTCTL = WDTPW + WDTHOLD;   // 关闭看门狗 
     
    _DINT();			// 关闭中断 
     
    // 初始化变量 
    FLAG_PORT = 0; 
    PORT_INPUT = 0; 
    PORT_count = 0; 
    nADC_Flag = 0; 
    nADC_Count = 0; 
    nRes = 1; 
    // 初始化 
    Init_CLK(); 
    Init_ADC(); 
    Init_TimerA(); 
    Init_INPUTPort(); 
    Init_TimerB(); 
 
    Init_DispPort(); 
    Init_AlarmPort(); 
 
    _EINT(); 			// 打开中断 
    //读取FLASH里面的内容 
    pFlash= (int*)(AT_DATA1); 
    UP1 = *pFlash; 
    if(UP1 == 0X00FF) 
    { 
    	nRes = 0; 
    } 
	else 
	{ 
		UP1 *= 8; 
	} 
    pFlash= (int*)(AT_DATA2); 
    UP2 = *pFlash; 
    if(UP2 == 0X00FF) 
    { 
    	nRes = 0; 
    } 
	else 
	{ 
		UP1 += UP2; 
	} 
 
    pFlash= (int*)(AT_DATA3); 
    DOWN1 = *pFlash; 
    if(DOWN1 == 0X00FF) 
    { 
    	nRes = 0; 
    } 
	else 
	{ 
        DOWN1 *= 8; 
	} 
    pFlash= (int*)(AT_DATA4); 
    DOWN2 = *pFlash; 
    if(DOWN2 == 0X00FF) 
    { 
    	nRes = 0; 
    } 
	else 
	{ 
        DOWN1 += DOWN2; 
	} 
     
    if(nRes == 0) 
    { 
    	nCount = 0; 
    	// 需要读取4个数据 
    	for(;;) // 等待配置数据 
    	{ 
    	     
    	    if(FLAG_PORT == 1) 
    	    { 
				switch(nCount) 
				{ 
				case 0: 
					{ 
						FLASH_ww(AT_DATA1,PORT_INPUT) 
						break; 
					} 
				case 1: 
					{ 
						FLASH_ww(AT_DATA2,PORT_INPUT) 
						break; 
					} 
				case 2: 
					{ 
						FLASH_ww(AT_DATA3,PORT_INPUT) 
						break; 
					} 
				case 3: 
					{ 
						FLASH_ww(AT_DATA4,PORT_INPUT) 
						break; 
					} 
				default:break; 
				} 
    	    	 
    	    	FLAG_PORT = 0; 
    	    	chrTemp[nCount] = PORT_INPUT; 
 
				nCount += 1; 
				if(nCount >= 4)  
				{ 
					UP1 = chrTemp[0] * 8 + chrTemp[1]; 
     
                    DOWN1 = chrTemp[2] * 8 + chrTemp[3]; 
					break;//数据配置完毕 
				} 
    	    } 
    	     
    	} 
    } 
     
     
    for(;;) 
    { 
    	if(nADC_Flag == 1) 
    	{ 
    	    nTemp = ADC_BUF_Temp[0]; 
    	    nADC_Flag = 0; 
    	    // 这里只是简单的化成整数处理,就是乘以100 
    	    nTemp = 16434 - 29 * nTemp; 
    	     
    	    nTemp = (int)((nTemp / 100);//将结果除以100 
    	    nTemp1 = (int)(nTemp / 100);//最高位 
    	    nTemp2 = (nTemp - nTemp1 * 100) / 10;// 十位 
    	    nTemp3 = (nTemp - nTemp2 * 10 - nTemp1 * 100);//个位 
    	     
    	    // 这里只是简单的比较整数部分 
    	    if((nTemp > UP1) || (nTemp < DOWN1)) 
    	    { 
    	    	// 报警 
    	    	Ring(); 
    	    } 
    	    else 
    	    { 
    	    	// 显示 
    	    	Display(nTemp2,nTemp3,0); 
    	    } 
    	 
    	} 
    } 
 
} 
 
////////////////////////////////////////////// 
// 定时器中断,完成 ADC 转换 
interrupt [TIMERA0_VECTOR] void TimerA_ISR(void) 
{ 
    int results; 
     
    ADC12CTL0 &= ~ENC;		    // 关闭转换 
          	 
    results = ADC12MEM0;	    // 读出转换结果                      
    ADC_BUF[nADC_Count] = results; 
             
    nADC_Count += 1;      
    if(nADC_Count == 10) 
    { 
         nADC_Flag = 1;            //设置标志 
         nADC_Count = 0;  
         for(int i = 0;i < 10;i++) ADC_BUF_Temp[i] = ADC_BUF[i];       
    } 
                 
    ADC12CTL0 |= ENC + ADC12SC;	   // 开启转换 
} 
/////////////////////////////////////// 
// 处理来自端口 1 的中断 
interrupt [PORT1_VECTOR] void PORT_ISR(void) 
{ 
    Delay_us(100);//消除延时抖动 
    if(P1IFG & BIT0) // P1.0列线上有按键输入 
    { 
    	P1IFG &= ~(BIT4);	// 清除中断标志位 
    	Delay_ms(1); 
    	for(;;) 
    	{ 
    	    if((P1IFG & BIT4) == 0) break; 
    	} 
    	// 获得输入值 
    	switch(PORT_count) 
    	{ 
            case 0: 
            { 
            	PORT_INPUT = 9; 
            	PORT_count = 1; 
            	break; 
            } 
            case:1 
            { 
            	PORT_INPUT = 7; 
            	PORT_count = 2; 
            	break; 
            } 
            case 2: 
            { 
            	PORT_INPUT = 5; 
            	PORT_count = 3; 
            	break; 
            } 
            case 3: 
            { 
            	PORT_INPUT = 3; 
            	PORT_count = 4; 
            	break; 
            } 
            case 4: 
            { 
            	PORT_INPUT = 1; 
            	PORT_count = 0; 
            	break; 
            } 
            default:break; 
    	} 
    	FLAG_PORT = 1; 
    } 
     
    if(P1IFG & BIT1)//// P1.1列线上有按键输入 
    { 
    	P1IFG &= ~(BIT5);	// 清除中断标志位 
    	Delay_ms(1); 
    	for(;;) 
    	{ 
    	    if((P1IFG & BIT5) == 0) break; 
    	} 
    	// 获得输入值 
    	switch(PORT_count) 
    	{ 
            case 0: 
            { 
            	PORT_INPUT = 0; 
            	PORT_count = 1; 
            	break; 
            } 
            case:1 
            { 
            	PORT_INPUT = 8; 
            	PORT_count = 2; 
            	break; 
            } 
            case 2: 
            { 
            	PORT_INPUT = 6; 
            	PORT_count = 3; 
            	break; 
            } 
            case 3: 
            { 
            	PORT_INPUT = 4; 
            	PORT_count = 4; 
            	break; 
            } 
            case 4: 
            { 
            	PORT_INPUT = 2; 
            	PORT_count = 0; 
            	break; 
            } 
            default:break; 
    	} 
    	FLAG_PORT = 1; 
    } 
} 
interrupt [TIMERB0_VECTOR] void TimerB_ISR(void) 
{ 
    // 设置相应的行线为低电平 
    switch(PORT_count) 
    { 
        case 0: 
        { 
            // 设置为高电平 
            P1OUT |= BIT3; 
            P1OUT |= BIT4; 
            P1OUT |= BIT5; 
            P1OUT |= BIT6; 
            // 设置为低电平 
            P1OUT &= ~(BIT2);             
            break; 
        } 
        case:1 
        { 
            // 设置为高电平 
            P1OUT |= BIT2; 
            P1OUT |= BIT4; 
            P1OUT |= BIT5; 
            P1OUT |= BIT6; 
            // 设置为低电平 
            P1OUT &= ~(BIT3);  
            break; 
        } 
        case 2: 
        { 
            // 设置为高电平 
            P1OUT |= BIT3; 
            P1OUT |= BIT2; 
            P1OUT |= BIT5; 
            P1OUT |= BIT6; 
            // 设置为低电平 
            P1OUT &= ~(BIT4);  
            break; 
        } 
        case 3: 
        { 
            // 设置为高电平 
            P1OUT |= BIT3; 
            P1OUT |= BIT4; 
            P1OUT |= BIT2; 
            P1OUT |= BIT6; 
            // 设置为低电平 
            P1OUT &= ~(BIT5);  
            break; 
        } 
        case 4: 
        { 
            // 设置为高电平 
            P1OUT |= BIT3; 
            P1OUT |= BIT4; 
            P1OUT |= BIT5; 
            P1OUT |= BIT2; 
            // 设置为低电平 
            P1OUT &= ~(BIT6);  
            break; 
        } 
            default:break; 
    } 
           
}