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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4850|回復: 0
收起左側

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

[復制鏈接]
ID:108615 發表于 2016-3-14 19:50 | 顯示全部樓層 |閱讀模式
本程序是《MSP430系列單片機系統工程設計與實踐》書里面的源碼,(包含工程文件  例4.3.2)完整例程下載:http://www.zg4o1577.cn/bbs/dpj-46245-1.html


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

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


  4.   說明:利用狀態機實現非阻塞性的菜單。


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


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

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

菜單子程序:
  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. int Menu_Temp;            //調整數據的臨時變量(為了實現放棄保存功能)

  12. char Menu_State=0;
  13. #define MENU_QUIT     0
  14. #define MENU_SET      1
  15. #define MENU_AH       2
  16. #define MENU_AL       3
  17. #define MENU_END      4

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

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

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



  70. /*************************************************************************
  71. * 名    稱:Menu_Process()
  72. * 功    能:菜單程序
  73. * 入口參數:無
  74. * 出口參數:無
  75. * 說    明: 利用狀態機實現的菜單,該程序不阻塞CPU的執行
  76. *************************************************************************/
  77. void Menu_Process()
  78. {
  79.   char Key;
  80.   Key=Key_GetKey();   //從鍵盤緩沖區讀取一次按鍵
  81.   static int Timer;
  82.   static int TimeOutTimer;
  83.   switch(Menu_State)
  84.   {
  85.     case MENU_QUIT: if(Key==KEY_ENT_FL) Menu_State=MENU_SET;
  86.                     break;
  87.     case MENU_SET:  LCD_Clear();
  88.                     LCD_DisplayChar(SS,2);
  89.                     LCD_DisplayChar(EE,1);   // 顯示"SET",提示菜單開始
  90.                     LCD_DisplayChar(tt,0);
  91.                     if(Key==KEY_ENT)   
  92.                       {
  93.                         Menu_Temp=Alarm_H;
  94.                         Menu_State=MENU_AH;
  95.                       }  
  96.                     break;
  97.     case MENU_AH :  Menu_Temp=Menu_SetValue(Menu_Temp,Key,-200,500,10);// 根據按鍵調整參數數值
  98.                     LCD_DisplayDecimal(Menu_Temp,1); // 顯示溫度上限值,保留一位小數
  99.                     LCD_DisplayChar(AA,6);
  100.                     LCD_DisplayChar(HH,5);           // 提示符"AH"        
  101.                     if(Key==KEY_ENT)
  102.                       {
  103.                         Alarm_H=Menu_Temp;               // 更新報警上限全局變量
  104.                         Flash_WriteWord(ADDR_AH,Alarm_H);// 報警上限值寫入Flash
  105.                         Menu_Temp=Alarm_L;
  106.                         Menu_State=MENU_AL;
  107.                       }
  108.                     if(Key==KEY_ENT_FL)
  109.                       {
  110.                         Menu_Temp=Alarm_L;
  111.                         Menu_State=MENU_AL;
  112.                       }
  113.                     break;
  114.     case MENU_AL :  Menu_Temp=Menu_SetValue(Menu_Temp,Key,-200,500,10);// 根據按鍵調整參數數值
  115.                     LCD_DisplayDecimal(Menu_Temp,1);      // 顯示溫度下限值,保留一位小數
  116.                     LCD_DisplayChar(AA,6);
  117.                     LCD_DisplayChar(LL,5);               // 提示符"AL"  
  118.                     if(Key==KEY_ENT)
  119.                       {
  120.                         Alarm_L=Menu_Temp;               // 更新報警上限全局變量
  121.                         Flash_WriteWord(ADDR_AL,Alarm_L);// 報警上限值寫入Flash
  122.                         Menu_State=MENU_END;
  123.                       }
  124.                     if(Key==KEY_ENT_FL) Menu_State=MENU_END;
  125.                     break;                       
  126.    case MENU_END :  LCD_Clear();
  127.                     LCD_DisplayChar(EE,2);
  128.                     LCD_DisplayChar(nn,1);   // 顯示"End",提示菜單結束
  129.                     LCD_DisplayChar(DD,0);
  130.                     if(++Timer>16) {Timer=0;Menu_State=MENU_QUIT;}//0.5秒后退出
  131.                     break;
  132.     }
  133. //---------------------------超時退出-----------------------------------
  134.   if(Key!=0) TimeOutTimer=0;  //任何按鍵都可以將無操作時間清零
  135.   if(Menu_State!=MENU_QUIT)   //在菜單中,對無操作時間計時
  136.    {
  137.      TimeOutTimer++;        
  138.      if(TimeOutTimer>160) Menu_State = MENU_QUIT; //無操作超過10秒,退出菜單
  139.    }
  140.   else TimeOutTimer=0;
  141. //---------------------------------------------------------------------  
  142. }
復制代碼



回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩欧美在线视频一区 | 国产精品成人一区二区三区 | 久久99深爱久久99精品 | 精品99久久久久久 | 毛片视频网址 | 最新日韩在线 | 欧美精品一二三 | 最新午夜综合福利视频 | 一区二区精品 | 天天影视综合 | 台湾佬久久| 欧美久久精品一级c片 | 国产精品欧美一区喷水 | 日本黄色一级视频 | 精品成人在线观看 | 9久久精品 | 99久久精品免费看国产四区 | 国产精品一二三区 | 久久免费视频观看 | 久草网站 | 嫩呦国产一区二区三区av | 一区二区三区在线免费观看 | 一区二区三区国产在线观看 | 日韩免费一区 | 国产精品视频免费观看 | 麻豆亚洲| 国产一级特黄真人毛片 | 亚洲在线| 在线观看视频福利 | 嫩草伊人| 国产精品不卡视频 | 一区二区三区四区不卡 | 福利视频三区 | av天天操 | 免费一级黄色录像 | 日韩aⅴ片 | 男人天堂网址 | 韩国久久 | 最新中文字幕在线 | 欧美精品一区二区在线观看 | 精品久久久久久久久久久久 |