久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3633|回復: 0
打印 上一主題 下一主題
收起左側

MSP430單片機阻塞性菜單程序設計

[復制鏈接]
跳轉到指定樓層
樓主
ID:108615 發表于 2016-3-14 19:47 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本程序是《MSP430系列單片機系統工程設計與實踐》書里面的源碼,(包含工程文件 (例4.3.1))完整例程下載:http://www.zg4o1577.cn/bbs/dpj-46245-1.html


關于本程序的詳細解說大家可以點擊上圖下載電子書

主程序mian
  1. /*
  2.                
  3.                          菜單程序范例(溫度報警器)


  4.   說明:在《溫度計_基本原理》程序中,已經實現了一個溫度測量和顯示的系統,為其
  5.         添加菜單。


  6.   (C)西安電子科技大學 測控技術與儀器教研中心   編 寫:謝 楷 2008/06/30
  7.   
  8. */
  9. //
  10. //                   MSP430FE425
  11. //             ----------------------
  12. //            |                   XIN|-
  13. //            |                      | 32kHz
  14. //            |RST               XOUT|-
  15. //            |                      |    +----------------------+
  16. //            |A0.6+ -|        S0-S15|--->|   SoftBaugh LCD_048  |
  17. //            |A0.6-  |     COM0-COM3|--->|   7.1Digit,4-Mux LCD |
  18. //            |     | |              |    +----------------------+
  19. //            |     | |         VREF |---+
  20. //      (P1.5)|    \| |/             |   |
  21. //   KEY1---->|     \_/              |  -+- 100nF
  22. //   ADD+     |    內部              |  -+-
  23. //            | 溫度傳感器           |   |
  24. //      (P1.6)|                 AVss |---+
  25. //   KEY2---->|                      |
  26. //   SUB-     |                      |
  27. //            |                      |
  28. //      (P1.7)|                      |
  29. //   KEY3---->|                      |
  30. //   ENT      |                      |
  31. //*****************************************************************************
  32. #include "MSP430X42X.h"      /*430單片機寄存器頭文件*/
  33. #include "LCD_Display.h"     /*LCD顯示函數庫頭文件*/
  34. #include "BasicTimer.h"      /*基礎定時器函數庫頭文件*/
  35. #include "ADC16.h"           /*16位ADC函數庫頭文件*/
  36. #include "Menu.h"            /*菜單各函數的頭文件*/
  37. #define LED_RED_ON      P1OUT|=BIT3
  38. #define LED_RED_OFF     P1OUT&=~BIT3
  39. #define LED_GREEN_ON    P1OUT|=BIT1
  40. #define LED_GREEN_OFF   P1OUT&=~BIT1


  41. #define T_OFFSET (0)         /*25度左右條件下,顯示溫度減去標準溫度計溫度*/
  42.                              /*作為校準偏移值。注意要乘10倍,10=1.0度*/

  43. /****************************************************************************
  44. * 名    稱:main()主程序
  45. * 功    能:每1秒采集溫度一次并顯示;每1/16秒掃描一次按鍵并處理。
  46. * 入口參數:無
  47. * 出口參數:無
  48. ****************************************************************************/
  49. void main( void )
  50. { int i;
  51.   int ADC_Result=0;
  52.   int DegC;int Timer=0;
  53.   WDTCTL=WDTPW+WDTHOLD;  //停止看門狗
  54.   FLL_CTL0|=XCAP18PF;          //配置晶振負載電容
  55.   P1DIR|=BIT0+BIT1+BIT2+BIT3+BIT4;
  56.   P2DIR|=BIT0+BIT1+BIT2+BIT3;       //懸空的IO口要置為輸出
  57.   P1OUT =0;                         //不確定電平會造成IO耗電
  58.   P2OUT =0;   
  59.   BT_Init(16);                      //BasicTimer設置為1/16秒中斷(喚醒)CPU一次
  60.   LCD_Init();                       //LCD初始化
  61.   ADC16_Init(0,6,'S',1);//ADC16初始化,設置ADC0采樣溫度傳感器,有符號,增益=1
  62.   Menu_DefaultSettings();
  63.   Menu_LoadSettings();
  64.   while(1)
  65.   {
  66.     Cpu_SleepWaitBT();//CPU休眠,等待被BasicTimer喚醒
  67.     Timer++;
  68.     if(Timer>=16)   //---------以下代碼每1秒執行一次-----------
  69.     {  Timer=0;      
  70.        ADC16_VrefOn();                  //打開基準源
  71.        for(i=0;i<30;i++);               //略等待,等基準穩定
  72.        ADC_Result=ADC16_Sample(0,1);    //采樣ADC0,單次采樣
  73.        ADC16_VrefOff();                 //關閉基準源
  74.        DegC=((long int)ADC_Result * 9090)/65536 - 2730;//計算攝氏度
  75.        DegC-=T_OFFSET;                  //扣除校準偏移量
  76.        LCD_DisplayDecimal(DegC,1);      //顯示攝氏度,帶1位小數
  77.        LCD_InsertChar(DT);         
  78.        LCD_InsertChar(CC);              // 尾部添加單位: 'C
  79.        if(DegC>=Alarm_H) LED_RED_ON;
  80.        else              LED_RED_OFF;   // 上限報警
  81.        if(DegC<=Alarm_L) LED_GREEN_ON;
  82.        else              LED_GREEN_OFF; // 下限報警      
  83.        Menu_Process();                  // 菜單處理
  84.     }
  85.   }
  86. }
復制代碼

菜單子程序:
  1. #include <msp430x42x.h>
  2. #include "KEY.h"
  3. #include "LCD_Display.h"
  4. #include "Flash.h"
  5. #include "BasicTimer.h"
  6. #define ADDR_DEFAULT    0  /*第一次上電標志*/
  7. #define ADDR_AH         2  /*報警門限上限存儲地址*/
  8. #define ADDR_AL         4  /*報警門限下限存儲地址*/
  9. int Alarm_H;
  10. int Alarm_L;               /*報警上下限全局變量*/

  11. /*************************************************************************
  12. * 名    稱:Menu_SetValue()
  13. * 功    能:調整數值的大小
  14. * 入口參數:Value: 當前數值
  15.                 Key:按鍵
  16.                         MIN:被調整參數的最小值
  17.                         MAX:被調整參數的最大值
  18.                         Step:長按鍵的調整步長
  19. * 出口參數:被調整后的參數值
  20. * 說    明: 參數超過最大值,會變為最小值。小于最小值會變為最大值。
  21. *************************************************************************/
  22. int Menu_SetValue(int Value,char Key,int MIN,int MAX, int Step)
  23. {   switch(Key)
  24.      {
  25.       case KEY_ADD:         Value++;        break;  // 加減按鍵的處理
  26.       case KEY_SUB:        Value--;        break;
  27.       case KEY_ADD_L: Value+=Step;        break;  // 長按鍵的處理
  28.       case KEY_SUB_L:        Value-=Step;        break;
  29.       default:                                break;
  30.      }                       
  31.     if (Value>MAX) Value=MIN;                        //超量程處理
  32.     if (Value<MIN) Value=MAX;                        //超量程處理     
  33.    return(Value);
  34. }

  35. /*************************************************************************
  36. * 名    稱:Menu_DefaultSettings()
  37. * 功    能:初始化各參數,寫為默認值
  38. * 入口參數:無
  39. * 出口參數:無
  40. * 說    明: 該函數內的參數初始化程序只會在第一次通電時執行
  41. *************************************************************************/
  42. void Menu_DefaultSettings()
  43. {
  44.   if(Flash_ReadChar(ADDR_DEFAULT)!=0x00)    //如果第0單元內容非0(第一次上電)
  45.      {
  46.         Flash_WriteWord(ADDR_AH,400);      //上限40.0度
  47.         Flash_WriteWord(ADDR_AL,0);            //下限0度
  48.         Flash_WriteChar(ADDR_DEFAULT,0x00); //第0單元寫入0(以后再也不運行)
  49.      }
  50. }

  51. /*************************************************************************
  52. * 名    稱:Menu_LoadSettings()
  53. * 功    能:從存儲器中調出設置參數
  54. * 入口參數:無
  55. * 出口參數:無
  56. * 說    明: 主循環開始之前執行
  57. *************************************************************************/
  58. void Menu_LoadSettings()
  59. {
  60.    Alarm_H=Flash_ReadWord(ADDR_AH);      //讀取溫度上限
  61.    Alarm_L=Flash_ReadWord(ADDR_AL);      //讀取溫度上限   
  62. }


  63. /*************************************************************************
  64. * 名    稱:Menu_SettingAH()
  65. * 功    能:報警上限設置
  66. * 入口參數:無
  67. * 出口參數:無
  68. * 說    明: 該程序會阻塞CPU的執行
  69. *************************************************************************/
  70. void Menu_SettingAH()
  71. {
  72.    int Temp;                                    // 臨時變量
  73.    char Key;                                    // 按鍵
  74.    Temp=Alarm_H;                                // 被調整的變量是Alarm_H
  75.    while(1)                                     // 每項菜單設置都是一個死循環
  76.    {
  77.      LCD_DisplayDecimal(Temp,1);                //顯示溫度上限值,保留一位小數
  78.      LCD_DisplayChar(AA,6);
  79.      LCD_DisplayChar(HH,5);                     //提示符"AH"
  80.      Key=Key_WaitKey();                         // 等待一次按鍵
  81.      Temp=Menu_SetValue(Temp,Key,-200,500,10);  //根據按鍵調整參數數值
  82.      if(Key==KEY_ENT)                           //當ENT鍵按下時
  83.       {
  84.          Alarm_H=Temp;                          //更新報警上限全局變量
  85.          Flash_WriteWord(ADDR_AH,Alarm_H);      //報警上限值寫入Flash
  86.          return;                                //退出本項菜單循環
  87.       }
  88.      if(Key==KEY_ENT_FL) return;                //當ENT鍵長按時,不保存直接退出
  89.    }
  90. }

  91. /*************************************************************************
  92. * 名    稱:Menu_SettingAL()
  93. * 功    能:報警下限設置
  94. * 入口參數:無
  95. * 出口參數:無
  96. * 說    明: 該程序會阻塞CPU的執行
  97. *************************************************************************/
  98. void Menu_SettingAL()
  99. {
  100.    int Temp;                                    // 臨時變量
  101.    char Key;                                    // 按鍵
  102.    Temp=Alarm_L;                                // 被調整的變量是Alarm_L
  103.    while(1)                                     // 每項菜單設置都是一個死循環
  104.    {
  105.      LCD_DisplayDecimal(Temp,1);                // 顯示溫度上限值,保留一位小數
  106.      LCD_DisplayChar(AA,6);
  107.      LCD_DisplayChar(LL,5);                     // 提示符"AL"
  108.      Key=Key_WaitKey();                         // 等待一次按鍵
  109.      Temp=Menu_SetValue(Temp,Key,-200,500,10);  // 根據按鍵調整參數數值
  110.      if(Key==KEY_ENT)                           // 當ENT鍵按下時
  111.       {
  112.          Alarm_L=Temp;                          // 更新報警下限全局變量
  113.          Flash_WriteWord(ADDR_AL,Alarm_L);      // 報警上限值寫入Flash
  114.          return;                                // 退出本項菜單循環
  115.       }
  116.      if(Key==KEY_ENT_FL) return;                // 當ENT鍵長按時,不保存直接退出
  117.    }
  118. }

  119. /*************************************************************************
  120. * 名    稱:Menu_Process()
  121. * 功    能:菜單程序
  122. * 入口參數:無
  123. * 出口參數:無
  124. * 說    明: 該程序會阻塞CPU的執行
  125. *************************************************************************/
  126. void Menu_Process()
  127. {
  128.   if(Key_GetKey()!=KEY_ENT_FL) return;      // 長按ENT鍵才能進入菜單
  129.   LCD_Clear();
  130.   LCD_DisplayChar(SS,2);
  131.   LCD_DisplayChar(EE,1);                    // 顯示"SET",提示菜單開始
  132.   LCD_DisplayChar(tt,0);
  133.   while(Key_WaitKey()!=KEY_ENT);            // 等待一次短按鍵(防止連續長鍵)
  134. //-------------------------------------------------  
  135.   Menu_SettingAH();                         // 設置報警上限
  136.   Menu_SettingAL();                         // 設置報警下限
  137. //-------------------------------------------------  
  138.   LCD_Clear();  
  139.   LCD_DisplayChar(EE,2);
  140.   LCD_DisplayChar(nn,1);                    // 顯示"END",提示菜單已結束
  141.   LCD_DisplayChar(DD,0);
  142.   Cpu_SleepDelay(8);                        // "END"持續0.5秒
  143. }
復制代碼



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91视频一区 | 91精品国产色综合久久 | 中文在线一区二区 | 国产小视频在线观看 | 91亚洲精华国产 | 日本精品视频一区二区 | 在线国产一区二区三区 | 国产一区二区精品在线观看 | h视频在线免费 | 自拍偷拍亚洲一区 | 91精品国产欧美一区二区 | 久久亚洲视频网 | 国产精品久久久久久久久免费相片 | 欧美男人的天堂 | 国产精品亚洲一区二区三区在线观看 | 日本不卡一区二区三区在线观看 | 国产成人av在线播放 | 久久一区二区三区四区五区 | 日本久久久影视 | 日韩福利在线 | 久艹网站 | 在线一区二区三区 | 操操日 | 久久精品国产亚洲夜色av网站 | 久久99精品久久 | 精品欧美一区二区中文字幕视频 | 欧美精品一区二区在线观看 | 国产成人免费 | 欧美日韩一区不卡 | 久久香蕉网 | 亚洲一区二区电影网 | 99一区二区 | 天天干天天谢 | 免费日本视频 | 欧美1页| 久久久久久成人 | 人人干人人看 | 亚洲一区二区三区在线视频 | 国产精品久久久久久亚洲调教 | 国产精品亚洲视频 | 国产免费自拍 |