標(biāo)題:
MSP430單片機(jī)阻塞性菜單程序設(shè)計(jì)
[打印本頁(yè)]
作者:
51hei單片
時(shí)間:
2016-3-14 19:47
標(biāo)題:
MSP430單片機(jī)阻塞性菜單程序設(shè)計(jì)
本程序是《MSP430系列單片機(jī)系統(tǒng)工程設(shè)計(jì)與實(shí)踐》書里面的源碼,(包含工程文件 (例4.3.1))完整例程下載:
http://www.torrancerestoration.com/bbs/dpj-46245-1.html
關(guān)于本程序的詳細(xì)解說(shuō)大家可以點(diǎn)擊上圖下載電子書
主程序mian
/*
菜單程序范例(溫度報(bào)警器)
說(shuō)明:在《溫度計(jì)_基本原理》程序中,已經(jīng)實(shí)現(xiàn)了一個(gè)溫度測(cè)量和顯示的系統(tǒng),為其
添加菜單。
(C)西安電子科技大學(xué) 測(cè)控技術(shù)與儀器教研中心 編 寫:謝 楷 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+ | 內(nèi)部 | -+-
// | 溫度傳感器 | |
// (P1.6)| AVss |---+
// KEY2---->| |
// SUB- | |
// | |
// (P1.7)| |
// KEY3---->| |
// ENT | |
//*****************************************************************************
#include "MSP430X42X.h" /*430單片機(jī)寄存器頭文件*/
#include "LCD_Display.h" /*LCD顯示函數(shù)庫(kù)頭文件*/
#include "BasicTimer.h" /*基礎(chǔ)定時(shí)器函數(shù)庫(kù)頭文件*/
#include "ADC16.h" /*16位ADC函數(shù)庫(kù)頭文件*/
#include "Menu.h" /*菜單各函數(shù)的頭文件*/
#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度左右條件下,顯示溫度減去標(biāo)準(zhǔn)溫度計(jì)溫度*/
/*作為校準(zhǔn)偏移值。注意要乘10倍,10=1.0度*/
/****************************************************************************
* 名 稱:main()主程序
* 功 能:每1秒采集溫度一次并顯示;每1/16秒掃描一次按鍵并處理。
* 入口參數(shù):無(wú)
* 出口參數(shù):無(wú)
****************************************************************************/
void main( void )
{ int i;
int ADC_Result=0;
int DegC;int Timer=0;
WDTCTL=WDTPW+WDTHOLD; //停止看門狗
FLL_CTL0|=XCAP18PF; //配置晶振負(fù)載電容
P1DIR|=BIT0+BIT1+BIT2+BIT3+BIT4;
P2DIR|=BIT0+BIT1+BIT2+BIT3; //懸空的IO口要置為輸出
P1OUT =0; //不確定電平會(huì)造成IO耗電
P2OUT =0;
BT_Init(16); //BasicTimer設(shè)置為1/16秒中斷(喚醒)CPU一次
LCD_Init(); //LCD初始化
ADC16_Init(0,6,'S',1);//ADC16初始化,設(shè)置ADC0采樣溫度傳感器,有符號(hào),增益=1
Menu_DefaultSettings();
Menu_LoadSettings();
while(1)
{
Cpu_SleepWaitBT();//CPU休眠,等待被BasicTimer喚醒
Timer++;
if(Timer>=16) //---------以下代碼每1秒執(zhí)行一次-----------
{ Timer=0;
ADC16_VrefOn(); //打開基準(zhǔn)源
for(i=0;i<30;i++); //略等待,等基準(zhǔn)穩(wěn)定
ADC_Result=ADC16_Sample(0,1); //采樣ADC0,單次采樣
ADC16_VrefOff(); //關(guān)閉基準(zhǔn)源
DegC=((long int)ADC_Result * 9090)/65536 - 2730;//計(jì)算攝氏度
DegC-=T_OFFSET; //扣除校準(zhǔn)偏移量
LCD_DisplayDecimal(DegC,1); //顯示攝氏度,帶1位小數(shù)
LCD_InsertChar(DT);
LCD_InsertChar(CC); // 尾部添加單位: 'C
if(DegC>=Alarm_H) LED_RED_ON;
else LED_RED_OFF; // 上限報(bào)警
if(DegC<=Alarm_L) LED_GREEN_ON;
else LED_GREEN_OFF; // 下限報(bào)警
Menu_Process(); // 菜單處理
}
}
}
復(fù)制代碼
菜單子程序:
#include <msp430x42x.h>
#include "KEY.h"
#include "LCD_Display.h"
#include "Flash.h"
#include "BasicTimer.h"
#define ADDR_DEFAULT 0 /*第一次上電標(biāo)志*/
#define ADDR_AH 2 /*報(bào)警門限上限存儲(chǔ)地址*/
#define ADDR_AL 4 /*報(bào)警門限下限存儲(chǔ)地址*/
int Alarm_H;
int Alarm_L; /*報(bào)警上下限全局變量*/
/*************************************************************************
* 名 稱:Menu_SetValue()
* 功 能:調(diào)整數(shù)值的大小
* 入口參數(shù):Value: 當(dāng)前數(shù)值
Key:按鍵
MIN:被調(diào)整參數(shù)的最小值
MAX:被調(diào)整參數(shù)的最大值
Step:長(zhǎng)按鍵的調(diào)整步長(zhǎng)
* 出口參數(shù):被調(diào)整后的參數(shù)值
* 說(shuō) 明: 參數(shù)超過(guò)最大值,會(huì)變?yōu)樽钚≈。小于最小值?huì)變?yōu)樽畲笾怠?br />
*************************************************************************/
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; // 長(zhǎng)按鍵的處理
case KEY_SUB_L: Value-=Step; break;
default: break;
}
if (Value>MAX) Value=MIN; //超量程處理
if (Value<MIN) Value=MAX; //超量程處理
return(Value);
}
/*************************************************************************
* 名 稱:Menu_DefaultSettings()
* 功 能:初始化各參數(shù),寫為默認(rèn)值
* 入口參數(shù):無(wú)
* 出口參數(shù):無(wú)
* 說(shuō) 明: 該函數(shù)內(nèi)的參數(shù)初始化程序只會(huì)在第一次通電時(shí)執(zhí)行
*************************************************************************/
void Menu_DefaultSettings()
{
if(Flash_ReadChar(ADDR_DEFAULT)!=0x00) //如果第0單元內(nèi)容非0(第一次上電)
{
Flash_WriteWord(ADDR_AH,400); //上限40.0度
Flash_WriteWord(ADDR_AL,0); //下限0度
Flash_WriteChar(ADDR_DEFAULT,0x00); //第0單元寫入0(以后再也不運(yùn)行)
}
}
/*************************************************************************
* 名 稱:Menu_LoadSettings()
* 功 能:從存儲(chǔ)器中調(diào)出設(shè)置參數(shù)
* 入口參數(shù):無(wú)
* 出口參數(shù):無(wú)
* 說(shuō) 明: 主循環(huán)開始之前執(zhí)行
*************************************************************************/
void Menu_LoadSettings()
{
Alarm_H=Flash_ReadWord(ADDR_AH); //讀取溫度上限
Alarm_L=Flash_ReadWord(ADDR_AL); //讀取溫度上限
}
/*************************************************************************
* 名 稱:Menu_SettingAH()
* 功 能:報(bào)警上限設(shè)置
* 入口參數(shù):無(wú)
* 出口參數(shù):無(wú)
* 說(shuō) 明: 該程序會(huì)阻塞CPU的執(zhí)行
*************************************************************************/
void Menu_SettingAH()
{
int Temp; // 臨時(shí)變量
char Key; // 按鍵
Temp=Alarm_H; // 被調(diào)整的變量是Alarm_H
while(1) // 每項(xiàng)菜單設(shè)置都是一個(gè)死循環(huán)
{
LCD_DisplayDecimal(Temp,1); //顯示溫度上限值,保留一位小數(shù)
LCD_DisplayChar(AA,6);
LCD_DisplayChar(HH,5); //提示符"AH"
Key=Key_WaitKey(); // 等待一次按鍵
Temp=Menu_SetValue(Temp,Key,-200,500,10); //根據(jù)按鍵調(diào)整參數(shù)數(shù)值
if(Key==KEY_ENT) //當(dāng)ENT鍵按下時(shí)
{
Alarm_H=Temp; //更新報(bào)警上限全局變量
Flash_WriteWord(ADDR_AH,Alarm_H); //報(bào)警上限值寫入Flash
return; //退出本項(xiàng)菜單循環(huán)
}
if(Key==KEY_ENT_FL) return; //當(dāng)ENT鍵長(zhǎng)按時(shí),不保存直接退出
}
}
/*************************************************************************
* 名 稱:Menu_SettingAL()
* 功 能:報(bào)警下限設(shè)置
* 入口參數(shù):無(wú)
* 出口參數(shù):無(wú)
* 說(shuō) 明: 該程序會(huì)阻塞CPU的執(zhí)行
*************************************************************************/
void Menu_SettingAL()
{
int Temp; // 臨時(shí)變量
char Key; // 按鍵
Temp=Alarm_L; // 被調(diào)整的變量是Alarm_L
while(1) // 每項(xiàng)菜單設(shè)置都是一個(gè)死循環(huán)
{
LCD_DisplayDecimal(Temp,1); // 顯示溫度上限值,保留一位小數(shù)
LCD_DisplayChar(AA,6);
LCD_DisplayChar(LL,5); // 提示符"AL"
Key=Key_WaitKey(); // 等待一次按鍵
Temp=Menu_SetValue(Temp,Key,-200,500,10); // 根據(jù)按鍵調(diào)整參數(shù)數(shù)值
if(Key==KEY_ENT) // 當(dāng)ENT鍵按下時(shí)
{
Alarm_L=Temp; // 更新報(bào)警下限全局變量
Flash_WriteWord(ADDR_AL,Alarm_L); // 報(bào)警上限值寫入Flash
return; // 退出本項(xiàng)菜單循環(huán)
}
if(Key==KEY_ENT_FL) return; // 當(dāng)ENT鍵長(zhǎng)按時(shí),不保存直接退出
}
}
/*************************************************************************
* 名 稱:Menu_Process()
* 功 能:菜單程序
* 入口參數(shù):無(wú)
* 出口參數(shù):無(wú)
* 說(shuō) 明: 該程序會(huì)阻塞CPU的執(zhí)行
*************************************************************************/
void Menu_Process()
{
if(Key_GetKey()!=KEY_ENT_FL) return; // 長(zhǎng)按ENT鍵才能進(jìn)入菜單
LCD_Clear();
LCD_DisplayChar(SS,2);
LCD_DisplayChar(EE,1); // 顯示"SET",提示菜單開始
LCD_DisplayChar(tt,0);
while(Key_WaitKey()!=KEY_ENT); // 等待一次短按鍵(防止連續(xù)長(zhǎng)鍵)
//-------------------------------------------------
Menu_SettingAH(); // 設(shè)置報(bào)警上限
Menu_SettingAL(); // 設(shè)置報(bào)警下限
//-------------------------------------------------
LCD_Clear();
LCD_DisplayChar(EE,2);
LCD_DisplayChar(nn,1); // 顯示"END",提示菜單已結(jié)束
LCD_DisplayChar(DD,0);
Cpu_SleepDelay(8); // "END"持續(xù)0.5秒
}
復(fù)制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1