|
本程序是《MSP430系列單片機系統工程設計與實踐》書里面的源碼,(包含工程文件 (例4.3.1))完整例程下載:http://www.zg4o1577.cn/bbs/dpj-46245-1.html

關于本程序的詳細解說大家可以點擊上圖下載電子書
主程序mian
- /*
-
- 菜單程序范例(溫度報警器)
- 說明:在《溫度計_基本原理》程序中,已經實現了一個溫度測量和顯示的系統,為其
- 添加菜單。
-
- (C)西安電子科技大學 測控技術與儀器教研中心 編 寫:謝 楷 2008/06/30
-
- */
- //
- // MSP430FE425
- // ----------------------
- // | XIN|-
- // | | 32kHz
- // |RST XOUT|-
- // | | +----------------------+
- // |A0.6+ -| S0-S15|--->| SoftBaugh LCD_048 |
- // |A0.6- | COM0-COM3|--->| 7.1Digit,4-Mux LCD |
- // | | | | +----------------------+
- // | | | VREF |---+
- // (P1.5)| \| |/ | |
- // KEY1---->| \_/ | -+- 100nF
- // ADD+ | 內部 | -+-
- // | 溫度傳感器 | |
- // (P1.6)| AVss |---+
- // KEY2---->| |
- // SUB- | |
- // | |
- // (P1.7)| |
- // KEY3---->| |
- // ENT | |
- //*****************************************************************************
- #include "MSP430X42X.h" /*430單片機寄存器頭文件*/
- #include "LCD_Display.h" /*LCD顯示函數庫頭文件*/
- #include "BasicTimer.h" /*基礎定時器函數庫頭文件*/
- #include "ADC16.h" /*16位ADC函數庫頭文件*/
- #include "Menu.h" /*菜單各函數的頭文件*/
- #define LED_RED_ON P1OUT|=BIT3
- #define LED_RED_OFF P1OUT&=~BIT3
- #define LED_GREEN_ON P1OUT|=BIT1
- #define LED_GREEN_OFF P1OUT&=~BIT1
- #define T_OFFSET (0) /*25度左右條件下,顯示溫度減去標準溫度計溫度*/
- /*作為校準偏移值。注意要乘10倍,10=1.0度*/
- /****************************************************************************
- * 名 稱:main()主程序
- * 功 能:每1秒采集溫度一次并顯示;每1/16秒掃描一次按鍵并處理。
- * 入口參數:無
- * 出口參數:無
- ****************************************************************************/
- void main( void )
- { int i;
- int ADC_Result=0;
- int DegC;int Timer=0;
- WDTCTL=WDTPW+WDTHOLD; //停止看門狗
- FLL_CTL0|=XCAP18PF; //配置晶振負載電容
- P1DIR|=BIT0+BIT1+BIT2+BIT3+BIT4;
- P2DIR|=BIT0+BIT1+BIT2+BIT3; //懸空的IO口要置為輸出
- P1OUT =0; //不確定電平會造成IO耗電
- P2OUT =0;
- BT_Init(16); //BasicTimer設置為1/16秒中斷(喚醒)CPU一次
- LCD_Init(); //LCD初始化
- ADC16_Init(0,6,'S',1);//ADC16初始化,設置ADC0采樣溫度傳感器,有符號,增益=1
- Menu_DefaultSettings();
- Menu_LoadSettings();
- while(1)
- {
- Cpu_SleepWaitBT();//CPU休眠,等待被BasicTimer喚醒
- Timer++;
- if(Timer>=16) //---------以下代碼每1秒執行一次-----------
- { Timer=0;
- ADC16_VrefOn(); //打開基準源
- for(i=0;i<30;i++); //略等待,等基準穩定
- ADC_Result=ADC16_Sample(0,1); //采樣ADC0,單次采樣
- ADC16_VrefOff(); //關閉基準源
- DegC=((long int)ADC_Result * 9090)/65536 - 2730;//計算攝氏度
- DegC-=T_OFFSET; //扣除校準偏移量
- LCD_DisplayDecimal(DegC,1); //顯示攝氏度,帶1位小數
- LCD_InsertChar(DT);
- LCD_InsertChar(CC); // 尾部添加單位: 'C
- if(DegC>=Alarm_H) LED_RED_ON;
- else LED_RED_OFF; // 上限報警
- if(DegC<=Alarm_L) LED_GREEN_ON;
- else LED_GREEN_OFF; // 下限報警
- Menu_Process(); // 菜單處理
- }
- }
- }
復制代碼
菜單子程序:
- #include <msp430x42x.h>
- #include "KEY.h"
- #include "LCD_Display.h"
- #include "Flash.h"
- #include "BasicTimer.h"
- #define ADDR_DEFAULT 0 /*第一次上電標志*/
- #define ADDR_AH 2 /*報警門限上限存儲地址*/
- #define ADDR_AL 4 /*報警門限下限存儲地址*/
- int Alarm_H;
- int Alarm_L; /*報警上下限全局變量*/
- /*************************************************************************
- * 名 稱:Menu_SetValue()
- * 功 能:調整數值的大小
- * 入口參數:Value: 當前數值
- Key:按鍵
- MIN:被調整參數的最小值
- MAX:被調整參數的最大值
- Step:長按鍵的調整步長
- * 出口參數:被調整后的參數值
- * 說 明: 參數超過最大值,會變為最小值。小于最小值會變為最大值。
- *************************************************************************/
- int Menu_SetValue(int Value,char Key,int MIN,int MAX, int Step)
- { switch(Key)
- {
- case KEY_ADD: Value++; break; // 加減按鍵的處理
- case KEY_SUB: Value--; break;
- case KEY_ADD_L: Value+=Step; break; // 長按鍵的處理
- case KEY_SUB_L: Value-=Step; break;
- default: break;
- }
- if (Value>MAX) Value=MIN; //超量程處理
- if (Value<MIN) Value=MAX; //超量程處理
- return(Value);
- }
- /*************************************************************************
- * 名 稱:Menu_DefaultSettings()
- * 功 能:初始化各參數,寫為默認值
- * 入口參數:無
- * 出口參數:無
- * 說 明: 該函數內的參數初始化程序只會在第一次通電時執行
- *************************************************************************/
- void Menu_DefaultSettings()
- {
- if(Flash_ReadChar(ADDR_DEFAULT)!=0x00) //如果第0單元內容非0(第一次上電)
- {
- Flash_WriteWord(ADDR_AH,400); //上限40.0度
- Flash_WriteWord(ADDR_AL,0); //下限0度
- Flash_WriteChar(ADDR_DEFAULT,0x00); //第0單元寫入0(以后再也不運行)
- }
- }
- /*************************************************************************
- * 名 稱:Menu_LoadSettings()
- * 功 能:從存儲器中調出設置參數
- * 入口參數:無
- * 出口參數:無
- * 說 明: 主循環開始之前執行
- *************************************************************************/
- void Menu_LoadSettings()
- {
- Alarm_H=Flash_ReadWord(ADDR_AH); //讀取溫度上限
- Alarm_L=Flash_ReadWord(ADDR_AL); //讀取溫度上限
- }
- /*************************************************************************
- * 名 稱:Menu_SettingAH()
- * 功 能:報警上限設置
- * 入口參數:無
- * 出口參數:無
- * 說 明: 該程序會阻塞CPU的執行
- *************************************************************************/
- void Menu_SettingAH()
- {
- int Temp; // 臨時變量
- char Key; // 按鍵
- Temp=Alarm_H; // 被調整的變量是Alarm_H
- while(1) // 每項菜單設置都是一個死循環
- {
- LCD_DisplayDecimal(Temp,1); //顯示溫度上限值,保留一位小數
- LCD_DisplayChar(AA,6);
- LCD_DisplayChar(HH,5); //提示符"AH"
- Key=Key_WaitKey(); // 等待一次按鍵
- Temp=Menu_SetValue(Temp,Key,-200,500,10); //根據按鍵調整參數數值
- if(Key==KEY_ENT) //當ENT鍵按下時
- {
- Alarm_H=Temp; //更新報警上限全局變量
- Flash_WriteWord(ADDR_AH,Alarm_H); //報警上限值寫入Flash
- return; //退出本項菜單循環
- }
- if(Key==KEY_ENT_FL) return; //當ENT鍵長按時,不保存直接退出
- }
- }
- /*************************************************************************
- * 名 稱:Menu_SettingAL()
- * 功 能:報警下限設置
- * 入口參數:無
- * 出口參數:無
- * 說 明: 該程序會阻塞CPU的執行
- *************************************************************************/
- void Menu_SettingAL()
- {
- int Temp; // 臨時變量
- char Key; // 按鍵
- Temp=Alarm_L; // 被調整的變量是Alarm_L
- while(1) // 每項菜單設置都是一個死循環
- {
- LCD_DisplayDecimal(Temp,1); // 顯示溫度上限值,保留一位小數
- LCD_DisplayChar(AA,6);
- LCD_DisplayChar(LL,5); // 提示符"AL"
- Key=Key_WaitKey(); // 等待一次按鍵
- Temp=Menu_SetValue(Temp,Key,-200,500,10); // 根據按鍵調整參數數值
- if(Key==KEY_ENT) // 當ENT鍵按下時
- {
- Alarm_L=Temp; // 更新報警下限全局變量
- Flash_WriteWord(ADDR_AL,Alarm_L); // 報警上限值寫入Flash
- return; // 退出本項菜單循環
- }
- if(Key==KEY_ENT_FL) return; // 當ENT鍵長按時,不保存直接退出
- }
- }
- /*************************************************************************
- * 名 稱:Menu_Process()
- * 功 能:菜單程序
- * 入口參數:無
- * 出口參數:無
- * 說 明: 該程序會阻塞CPU的執行
- *************************************************************************/
- void Menu_Process()
- {
- if(Key_GetKey()!=KEY_ENT_FL) return; // 長按ENT鍵才能進入菜單
- LCD_Clear();
- LCD_DisplayChar(SS,2);
- LCD_DisplayChar(EE,1); // 顯示"SET",提示菜單開始
- LCD_DisplayChar(tt,0);
- while(Key_WaitKey()!=KEY_ENT); // 等待一次短按鍵(防止連續長鍵)
- //-------------------------------------------------
- Menu_SettingAH(); // 設置報警上限
- Menu_SettingAL(); // 設置報警下限
- //-------------------------------------------------
- LCD_Clear();
- LCD_DisplayChar(EE,2);
- LCD_DisplayChar(nn,1); // 顯示"END",提示菜單已結束
- LCD_DisplayChar(DD,0);
- Cpu_SleepDelay(8); // "END"持續0.5秒
- }
復制代碼
|
|