找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3040|回复: 0
打印 上一主题 下一主题
收起左侧

MSP430单片机阻塞性菜单程序设计

[复制链接]
跳转到指定楼层
楼主
ID:108615 发表于 2016-3-14 19:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本程序是《MSP430系列单片机系统工程设计与实践》书里面的源码,(包含工程文件 (例4.3.1))完整例程下载:http://www.51hei.com/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 单片机教程网

快速回复 返回顶部 返回列表