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; } }