msp430 三级菜单 菜单算法
- 格式:doc
- 大小:69.00 KB
- 文档页数:11
各个时钟信号源介绍如下:1、LFXT1CLK:低频/高频时钟源。
可以外接32768Hz的时钟芯片或频率为450KHz~8MHz的标准警惕或共振器。
2、XT2CLK:高频时钟源。
需要外接两个震荡电容器。
可以外接32768Hz的时钟芯片或频率为450KHz~8MHz的标准警惕或共振器和外部时钟输入。
较常用的晶体是8MHz的。
3、DCOCLK:内部数字可控制的RC振荡器。
MSP430单片机时钟模块提供3个时钟信号以供给片内各部分电路使用,这3个时钟信号分别是:(1)ACLK:辅助时钟信号。
ACLK是从LFXT1CLK信号由1/2/4/8分频器分频后得到的。
由BCSCTL1寄存器设置DIV A相应位来决定分频因子。
ACLK可提供给CPU外围功能模块做时钟信号使用。
(2)MCLK:主时钟信号。
MCLK是由3个时钟源所提供的。
它们分别是:LFXT1CLK、XT2CLK、和DCO时钟源信号。
MCLK主要用于MCU和相关模块做时钟。
同样可设置相关寄存器来决定分频因子及相关设置。
(3)SMCLK:子系统时钟。
SMCLK由2个时钟源信号提供,他们分别是XT2CLK 和DCO。
如果是F11或F11X1系列单片机,则由LFXT1CLK代替XT2CLK。
同样可设置相关寄存器来决定分频因子及相关的设置。
低频振荡器LFXT1:LFXT1支持超低功耗,它在低频模式下使用一个32768Hz的晶体。
不需要任何电容因为在低频模式下内部集成了电容。
低频振荡器也支持高频模式和高速晶体,但连接时每端必须加电容。
电容的大小根据所接晶体频率的高低来选择。
低频振荡器在低频和高频模式下都可以选择从XIN引脚接入一个外部输入时钟信号,但所接频率必须根据所设定的工作模式来选择,并且OSCOFF位必须复位。
高频振荡器LFXT2:LFXT2作为MSP430的第二晶体振荡器。
与低频相比,其功耗更大。
高频晶体真大气外接在XIN2和XOUT2两个引脚,并且必须外接电容。
MSP430F5529 实验指导书(V1.0)2014年10月27日东北林业大学机电工程学院“3+1”实验室实验一基础GPIO实验实验二键盘与液晶显示实验实验三时钟系统配置实验实验四看门狗与定时器实验实验五 AD/DA实验实验六比较器实验实验七 Flash实验实验八串行通信实验实验一基础GPIO实验【实验目的】1、熟悉CCS的基本使用方法;2、掌握MSP430系列单片机程序开发的基本步骤;3、掌握MSP430 IO口的基本功能。
【实验仪器】1、SEED-EXP430F5529v1.0开发板一套;2、PC机操作系统Windows XP或Windows 7,CCSv5.1集成开发环境。
【实验原理】CCS(Code Composer Studio)是 TI 公司研发的一款具有环境配置、源文件编辑、程序调试、跟踪和分析等功能的集成开发环境,能够帮助用户在一个软件环境下完成编辑、编译、链接、调试和数据分析等工作。
CCSv5.1 为 CCS 软件的最新版本,功能更强大、性能更稳定、可用性更高,是 MSP430 软件开发的理想工具。
SEED-EXP430F5529v1.0开发板上的有8个可操作的LED灯,与MCU的IO口对应关系如图1-1所示:图1-1 LED与MCU的IO对应关系电路我们可以通过控制单片机IO口的输出电平状态来控制各个LED灯的亮灭。
开发板上还有2个可操作的按键S1,S2。
如图1-2所示。
图1-2 按键电路我们可以通过读取与按键相连的IO口的输入电平状态来执行相应的操作。
此外,S1,S2还可以作为外部中断源,触发中断。
【实验内容】1、用调用头文件的方法,使能MSP430F5529开发板上的8个LED灯依次按顺序循环点亮;2、用按键S1控制开发板上LED1的亮灭状态(查询法);3、用按键S2控制开发板上跑马灯的循环速度(中断方式)。
【实验步骤】内容1:使能开发板上的8个LED灯依次按顺序循环点亮1、打开CCSv5并确定工作区间,然后选择File-->New-->CCS Project 弹出图1-3对话框。
#include <msp430x14x.h>#define uchar unsigned char#define uint unsigned int#define LCD_data P5DIR=0XFF //数据口输出#define LCD_CMDOUT P3DIR|=0xe0 //P3口的高三位设置为输出#define LCD_RS_LOW P3OUT &= ~BIT7 //RS=0#define LCD_RS_HIGH P3OUT |=BIT7 //RS=1#define LCD_RW_LOW P3OUT &= ~BIT6 //RW=0#define LCD_RW_HIGH P3OUT |=BIT6 //RW=1#define LCD_EN_LOW P3OUT &= ~BIT5 //EN=0#define LCD_EN_HIGH P3OUT |=BIT5 //EN=1uchar k=0,flag=0,flag1=0;uchar dis1_[] = {"系统初始化. "};uchar dis2_[] = {"系统初始化.. "};uchar dis3_[] = {"系统初始化... "};uchar dis4_[] = {" 按选择键开始! "};uchar dis1[] = {"手1:手机设定"}; //一级菜单1uchar dis2[] = {"机2:管理器"}; //一级菜单2uchar dis3[] = {"菜3:通话"}; //一级菜单3uchar dis4[] = {"单4:信息功能"}; //一级菜单5uchar dis5[] = {"手5:文件管理"}; //一级菜单7uchar dis6[] = {"机6:通讯录"}; //一级菜单8uchar dis7[] = {"菜"}; //一级菜单8uchar dis8[] = {"单"}; //一级菜单8uchar dis1_1[] = {"手1:时间和日期"}; //一级菜单1下的子菜单1 uchar dis2_1[] = {"机2:语言"}; //一级菜单1下的子菜单2 uchar dis3_1[] = {"设3:语音控制"}; //一级菜单1下的子菜单3 uchar dis4_1[] = {"定4:关闭无线电"}; //一级菜单1下的子菜单4uchar dis1_2[] = {"管1:闹铃"}; //一级菜单2下的子菜单1 uchar dis2_2[] = {"理2:视频电话"}; //一级菜单2下的子菜单2 uchar dis3_2[] = {"器3:日历"}; //一级菜单2下的子菜单3 uchar dis4_2[] = {" 4:任务"}; //一级菜单2下的子菜单4uchar dis1_3[] = {"通1:全部"}; //一级菜单3下的子菜单1 uchar dis2_3[] = {"话2:已接来电"}; //一级菜单3下的子菜单2 uchar dis3_3[] = {" 3:未接来电"}; //一级菜单3下的子菜单3 uchar dis4_3[] = {" 4:已拨电话"}; //一级菜单3下的子菜单4uchar dis1_4[] = {"信1:编写新信息"}; //一级菜单4下的子菜单1uchar dis2_4[] = {"息2:收件箱"}; //一级菜单4下的子菜单2uchar dis3_4[] = {"功3:电子邮件"}; //一级菜单4下的子菜单3uchar dis4_4[] = {"能4:草稿箱"}; //一级菜单4下的子菜单4uchar dis1_5[] = {"文1:相册"}; //一级菜单5下的子菜单1uchar dis2_5[] = {"件2:音乐"}; //一级菜单5下的子菜单2uchar dis3_5[] = {"管3:视频"}; //一级菜单5下的子菜单3uchar dis4_5[] = {"理4:图片"}; //一级菜单5下的子菜单4uchar dis1_6[] = {"通1:快速拨号"}; //一级菜单6下的子菜单1uchar dis2_6[] = {"讯2: 我的名片"}; //一级菜单6下的子菜单2uchar dis3_6[] = {"录3: 组群"}; //一级菜单6下的子菜单3uchar dis4_6[] = {" 4:特定号码"}; //一级菜单6下的子菜单4void delay_1ms(uint x){uint i,j;for(j=0;j<x;j++)for(i=0;i<113;i++);}void write_cmd(uchar cmd)//写指令数据到LCD :RS=L,RW=L,E=高脉冲,D0-D7=指令码{LCD_RS_LOW ;LCD_RW_LOW ;LCD_EN_LOW ;P5OUT = cmd;delay_1ms(1);LCD_EN_HIGH;delay_1ms(1);LCD_EN_LOW;}void write_dat(uchar dat)//写显示数据到LCD :RS=H,RW=L,E=高脉冲,D0-D7=数据。
程序下载方法
1:首先安装Lite FET‐Pro430 Elprotronic,点击Setup.exe。
具体如何安装就不做详细介绍,直接下一步到最后。
2:成功安装之后,重启电脑,启动软件,界面如下图所示:
3:Lite FET‐Pro430菜单设置
首先打开软件,点击菜单栏的Setup,再选择Connection/Device Reset,如图所示:
然后自设置图中指示的1处和2处,然后确定。
红色1:选择JTAG(4wire);
红色2:选择USB。
最后回到主界面如下图所示:
红色1:选择要烧录的硬件型号选择;
红色2:选择要下载的文件:txt格式的文件 红色3:点击AUTO PROG 下载程序
如果出现固件升级提示请选择否
红色4:程序下载成功后,点击RESET
下载完成如下图。
IAR-for-MSP430新手教程IAR for 430软件的设置与调试1.运行IAR EmbededWorkbench经常使用的话,可以在桌面上建一个快捷方式,这样比较方遍2. project 的建立打开IAR4.11会出现一个工程建立的向导选第一个就可以在现在的workspace建立一个new project,再点OK 就行了如果不用向导,可以按一下步骤:(1)选择主菜单的File >New>Workspace命令,然后开启一个空白工作区窗口(2)选择主菜单Project>Create New Project,弹出生成新项目窗口中我们选择Empty project。
点击OK写好代码后,选择主菜单的File >Save命令文件名可以自己起,但后面一定要加”.c”,保存为C文件右击工程名,将写好的程序添加进去Add>Add Files选好后点击打开对于刚存好的程序,例如例子中的main.c,也可以用Add>Add “main.c”添加入工程。
如果工程很庞大,需要添加的文件很多。
可以用Add>Add Group,加入新的组,将加入的文件分组管理。
4. 软件的设置将工程建好后,往往需要先进行设置,才能正常的使用现在说说一些常用的设置。
右击工程名,点击Option可以看到首先是在General Option中修改Device这要根据你所用的芯片选取,如图中的MSP430F149 然后在Debugger中修改DriverSimulator是用软件仿真FET Debugger是用Jtag调试接下来在FET Debugger中修改Connection第一项是TI的USB-Jtag 可以用U口调试第二项是普通的Jtag,要用到计算机的并口调试第三项是J-link,在新版本的IAR EW430中没有这一项后面的几项不常用现在选择第二项,如果电脑有多个并口,还需选择并口号注意:在连到并口时,可能会出现连接错误,应该检查目标板电源是否正常,是否有其他程序占用了并口,在BIOS中将并口设置为ECP方式,连接线是否有断路或短路至此,基本的设置结束,其他还有许多选项,大家可以自己摸索。
MSP430BSL 使用说明REV 3.0首先感谢您购买了本公司的MSP430开发工具我们将为您提供最完善的售后服务和最全面的技术支持下图是MSP430BSL的产品清单1、MSP430BSL*12、DB9针对孔串口连线*13、10芯扁平连线*14、附有BSL软件的光盘*1一、BSL的介绍什么是BSL(Bootstrap loader)? Bootstrap loader是MSP430FLASH系列单片机独有的一项功能。
在程序空间、RAM之外有1K左右的引导区,用来存放430的BOOTROM文件(这是一个引导ROM,类似网卡上的BOOTROM)。
当外界给芯片提供一种特定的激励时,芯片内的引导程序开始工作,引导外部数据写入片内ROM、RAM区,或者是发送片内数据到外部。
这些都是通过一个软UART来完成的。
如果是FLASH系列的单片机,则FLASH空间包含了ROM和RAM。
这个引导程序是固化在BOOTROM空间内,而且是一个用户不能直接使用和修改的存储空间。
430BSL的主要原理是通过芯片特殊的上电复位后,引导片外代码烧录到片内FLASH中,来完成系统编程的。
我们的MSP430BSL工具使用非常方便,图形化的界面让你通过鼠标就能顺利下载代码,读出内部任何数据。
这里提及的代码是TI专用的430-TXT格式文本,可以通过IAR-EW430的编译器生成。
MSP430BSL的主要特点1、代码下载。
下载任意编译系统提供的标准430-TXT源代码。
2、读出芯片内的程序、信息FLASH等随意指定空间。
目前支持TI推出的MSP430 FLASH全系列芯片,包括一些补丁程序所做的修改,都在REV3.0软件上做了改进。
3、芯片加密后还能通过256BIT密码字校验后下载、升级、读写芯片内容。
对一些产品遭受破坏还需要读出内部数据来说是非常好的一种工具。
其在仪表的软件调校上也有很广泛的应用。
(JTAG接口一般不留在成熟的产品里)4、尺寸小,随身携带。
用于MSP430™的IAR嵌入式工作平台版本3+用户指南Literature Number:ZHCU026XJune2004–Revised November2011内容Preface (5)1现在就开始! (7)1.1软件安装 (8)1.2LED闪烁 (8)1.3光盘和网络上重要的MSP430文档 (9)2开发流程 (10)2.1概述 (11)2.2使用KickStart (11)2.2.1项目设置 (12)2.2.2用于MSP430L092/MSP430C092的附件项目设置 (13)2.2.3从零开始创建一个项目 (15)2.2.4用于LPMx.5调试的附加项目设置 (16)2.2.5MSP430器件的密码保护 (17)2.2.6使用一个现有的IAR V1.x/V2.x/V3.x项目 (18)2.2.7堆栈管理和.xcl文件 (18)2.2.8如何生成德州仪器(TI).TXT(和其它格式)文件 (18)2.2.9示例程序概述 (18)2.3使用C-SPY (18)2.3.1断点类型 (19)2.3.2使用断点 (20)2.3.3使用单步执行 (21)2.3.4使用观察窗口 (21)A常见问题和解答 (23)A.1硬件 (24)A.2程序开发(汇编语言、C语言编译器、连接器) (24)A.3调试中(C-SPY) (26)B FET专用菜单 (30)B.1菜单 (31)B.1.1Emulator→Device Information (31)B.1.2Emulator→Release JTAG on Go (31)B.1.3Emulator→Resynchronize JTAG (31)B.1.4Emulator→Init New Device (31)B.1.5Emulator→Secure-Blow JTAG Fuse (31)B.1.6Emulator→Breakpoint Usage (31)B.1.7Emulator→Advanced→Clock Control (31)B.1.8Emulator→Advanced→Emulation Mode (31)B.1.9Emulator→Advanced→Memory Dump (32)B.1.10Emulator→Advanced→Breakpoint Combiner (32)B.1.11Emulator→State Storage Control (32)B.1.12Emulator→State Storage Window (32)B.1.13Emulator→Sequencer Control (32)B.1.14Emulator→"Power on"Reset (32)B.1.15Emulator→GIE on/off (32)B.1.16Emulator→Leave Target Running (32)B.1.17Emulator→Force Single Stepping (32)文档修订历史记录 (33)图片列表1-1.激活项目 (8)1-2.在Workspace Overview中激活项目 (9)2-1.L092模式 (13)2-2.C092仿真模式 (13)2-3.C092密码 (14)2-4.启用LPMx.5 (16)2-5.LPMx.5通知 (17)2-6.JTAG密码 (17)图表列表2-1.器件架构、断点和其它仿真特性 (19)4图片列表ZHCU026X–June2004–Revised November2011PrefaceZHCU026X–June2004–Revised November2011请先阅读关于本手册这本手册说明了IAR嵌入式工作平台(EW430)(带有MSP430超低功耗微控制器)™的使用方法。
(完整版)单片机多级菜单编程实现单片机多级菜单编程实现单片机多级菜单编程实现(ZT)建立一个树状的菜单结构,用链表实现链表中包含:1、指向同级左右菜单和指向父菜单、子菜单的四个菜单结构体指针;2、进入该菜单时需要执行的初始化函数指针3、退出该菜单时需要执行的结束函数指针4、该菜单内的按键处理函数指针数组的指针操作菜单模块需要的按键操作有:左、右、确认、退出。
采用这种办法,可以方便的添加或删减菜单。
并且只需要在其头文件中修改初始变量就可以实现,完全无须修改C文件中的任何函数。
具体结构定义我的定义,做个参考:#define MENU_HLP_EN //菜单帮助信息使能typedef struct{void (*pMenuTaskInit)(void); //指向菜单任务初始化函数的指针void (*pMenuTaskEnd)(void); //指向菜单任务结束函数的指针}MENU_TASK_TYP;typedef struct MenuTyp{INT8U *MenuName; //菜单名称字符串WORK_MOD WorkMod; //工作状态编号MENU_TASK_TYP *pMenuTask; //指向菜单任务的指针void (**pTaskKeyDeal)(void); //指向菜单任务按键处理函数数组#ifdef MENU_HLP_ENINT8U *MenuHlp; //菜单帮助字符串#endifstruct MenuTyp *pParent; //指向上层菜单的指针struct MenuTyp *pChild; //指向子菜单的指针struct MenuTyp *pRight; //指向右菜单的指针struct MenuTyp *pLeft; //指向左菜单的指针}MENU_TYP;我根据网上的资料做的一个菜单:/****************菜单数据结构**********************/struct KeyTabStruct{uint8 MenuIndex; //当前状态索引号uint8 MaxItems; //本级菜单最大条目数uint8 ShowLevel; //菜单显示内容uint8 PressOk; //按下"回车"键时转向的状态索引号uint8 PressEsc; //按下"返回"键时转向的状态索引号uint8 PressDown; //按下"向下"键时转向的状态索引号uint8 PressUp; //按下"向上"键时转向的状态索引号void (*CurrentOperate)(); //当前状态应该执行的功能操作};uint8 MenuID; //菜单ID号uint8 MenuNextID; //下级菜单ID号//CurMenuID=本菜单ID//MaxMenuItem=同级菜单最大项数//OkMenuID=子菜单层所对应的菜单ID,ID=999为菜单已经到底了//EscMenuID=父菜单层所对应的菜单ID,ID=999为菜单已经到顶了//DownMenuID=弟菜单层所对应的菜单ID,ID=999为菜单是独//UpMenuID=兄菜单层所对应的菜单ID,ID=999为菜单是独生子//CurFunction=本菜单所对应的菜单函数指针const struct KeyTabStruct KeyTab[MAX_KEYTABSTRUCT_NUM]={//CurMenuID, axMenuItem, MenuShowLevel, OkMenuID, EscMenuID, DownMenuID, UpMenuID, CurFunction{MENU_EDIT, 0, 0, MENU_DATA_VIEW, MENU_NO, MENU_NO, MENU_NO, *MenuEdit},{MENU_DATA_VIEW, 3, 1, MENU_DATA_VIEW_FIRE, MENU_EDIT, MENU_ SYS_EDIT, MENU_PRINT_DATA,*MenuEdit}, {MENU_DATA_VIEW_FIRE, 5, MENU_NO, MENU_NO, MENU_DATA_VIEW, MENU_DATA_VIEW_TROUBLE, MENU_STEP_FOLLOW, *MenuDataViewIn}, {MENU_DATA_VIEW_TROUBLE, 5, MENU_NO, MENU_NO, MENU_DATA_VI EW, MENU_DATA_VIEW_REPEAT, MENU_DATA_VIEW_FIRE, *MenuDataVie wIn},{MENU_DATA_VIEW_REPEAT, 5, MENU_NO,MENU_NO, MENU_DATA_VIEW, MENU_FACE_CHECK,MENU_DATA_VIEW_TROUBLE, *MenuDataViewIn},{MENU_FACE_CHECK, 5, MENU_NO,MENU_NO, MENU_DATA_VIEW, MENU_STEP_FOLLOW,MENU_DATA_VIEW_REPEAT, *MenuFaceCheck},{MENU_STEP_FOLLOW, 5, MENU_NO,MENU_NO, MENU_DATA_VIEW, MENU_DATA_VIEW_FIRE, MENU_FACE_CH ECK,*MenuStepFollow},{MENU_SYS_EDIT, 3,2, MENU_SUM_SET, MENU_EDIT,MENU_PRINT_DATA, MENU_DATA_VIEW, *MenuEdit},{MENU_SUM_SET, 6, MENU_NO,MENU_NO, MENU_SYS_EDIT, MENU_EDIT_INSULATE,MENU_TIME_SET, *MenuSumSet},{MENU_EDIT_INSULATE, 6, MENU_NO,MENU_NO, MENU_SYS_EDIT, MENU_EDIT_HZ, MENU_SUM_SET,*MenuEditInsulate},{MENU_EDIT_HZ, 6, MENU_NO,MENU_NO, MENU_SYS_EDIT, MENU_LD_CONTROL,MENU_EDIT_INSULATE, *MenuEditHZ},{MENU_LD_CONTROL, 6,MENU_NO, MENU_NO, MENU_SYS_EDIT, MENU_LD_DELAY, MENU_EDIT_HZ, *MenuLDControl},{MENU_LD_DELAY, 6,MENU_NO, MENU_NO, MENU_SYS_EDIT, MENU_TIME_SET, MENU_LD_CONTROL, *MenuLDDelay},{MENU_TIME_SET, 6, MENU_NO,MENU_NO, MENU_SYS_EDIT, MENU_SUM_SET, MENU_LD_DELAY,*MenuTimeSet},{MENU_PRINT_DATA, 3, 3,MENU_PRINT_DATA_FIRE, MENU_EDIT, MENU_DATA_VIEW, MENU_SYS_EDIT, *MenuEdit},{MENU_PRINT_DATA_FIRE, 4,MENU_NO, MENU_NO, MENU_PRINT_DATA,MENU_PRINT_DATA_TROUBLE, MENU_PRINT_SET, *MenuPrintDataIn}, {MENU_PRINT_DATA_TROUBLE, 4, MENU_NO,MENU_NO, MENU_PRINT_DATA, MENU_PRINTER_CHECK,MENU_PRINT_DATA_FIRE, *MenuPrintDataIn},{MENU_PRINTER_CHECK, 4, MENU_NO,MENU_NO, MENU_PRINT_DATA, MENU_PRINT_SET,MENU_PRINT_DATA_TROUBLE, *MenuPrintDataIn},{MENU_PRINT_SET, 4, MENU_NO,MENU_NO, MENU_PRINT_DATA, MENU_PRINT_DATA_FIRE, MENU_PRINTER_CHECK, *MenuPrintSet},};/**************************************编程菜单显示数据******************************/const struct MenuDispData MenuEditShow[][MENU_MAX] = {{{MENU_NO , 0, 0, "选择: 消音→退出"}, //主菜单{MENU_DATA_VIEW , 1, 6, "⒈数据查看"},{MENU_SYS_EDIT , 2, 6, "⒉系统编程"},{MENU_PRINT_DATA , 3, 6, "⒊数据打印"}},{{MENU_NO , 0, 0, "数据查看: 消音→退出"}, //数据查看{MENU_DATA_VIEW_FIRE , 1, 4, "⒈火警"},{MENU_DATA_VIEW_TROUBLE, 2, 4, "⒉故障"},{ME NU_DATA_VIEW_REPEAT , 3, 4, "⒊重码"},{MENU_FACE_CHECK , 1,12, "⒋面板检测"},{MENU_STEP_FOLLOW , 2,12, "⒌单步跟踪"}},{{MENU_NO , 0, 0, "系统编程: 消音→退出"}, //系统编程{MENU_SUM_SET , 1, 0, "⒈容量设置"},{MENU_EDIT_INSULATE , 2, 0, "⒉隔离点"},{MENU_EDIT_HZ , 3, 0, "⒊汉字描述"},{MENU_LD_CONTROL , 1,12, "⒋联动控制"},{MENU_LD_DELAY , 2,12, "⒌模块延时"},{MENU_TIME_SET , 3,12, "⒍时钟调整"}},{{MENU_NO , 0, 0, "数据打印: 消音→退出"}, //数据打印{MENU_PRINT_DATA_FIRE , 1, 0, "⒈火警数据"},{MENU_PRINT_DATA_TROUBLE,2, 0, "⒉故障数据"},{MENU_PRINTER_CHECK , 3, 0, "⒊打印机自检"},{MENU_PRINT_SET , 1,12, "⒋打印设置"}},};/***********************************等待按键******************** **************/void WaitKey(void){uint32 time;time = RTCFlag;WhichKey = KEY_NONE;while(!EscFlag){if(RTCFlag - time >= EDIT_TIME)EscFlag = TRUE;if(WhichKey != KEY_NONE){KeySound(300); //按键音return;}}}/*********************************显示多级菜单**********************************/void MenuEdit(){uint32 i,j=0;uint32 oldid;j = KeyTab[MenuID].ShowLevel;if(WhichKey == KEY_ESC || WhichKey == KEY_OK){ClearScreen();for(i=0;i0;//没有原先选择的项}else{if(WhichKey == KEY_UP)oldid = KeyTab[MenuNextID].PressDown;elseoldid = KeyTab[MenuNextID].PressUp;//指示原先的项}for(i=1;i<keytab[menunextid].maxitems+1;i++){< p=""> if(MenuEditShow[j][i].Id == oldid)ShowString(MenuEditShow[j][i].Lin,MenuEditShow[j][i].Column,MenuEditShow[j][i].Pdata,0); //正常显示原先的项else{if(MenuEditShow[j][i].Id == MenuNextID)ShowString(MenuEditShow[j][i].Lin,MenuEditShow[j][i].Column,MenuEditShow[j][i].Pdata,1); //反显当前选择的项}}WhichKey = KEY_NONE;}/******************************系统编程************************* ******/uint32 Edit(void){struct KeyTabStruct NowKeyTab; //指示当前的菜单值uint32 escflag = FALSE;ResetFlag = FALSE;ChangeFlag = FALSE;EscFlag = FALSE;MenuID = MENU_EDIT;NowKeyTab = KeyTab[MenuID];MenuNextID = NowKeyTab.PressOk;(*NowKeyTab.CurrentOperate)(); //显示主菜单do{if(WhichKey == KEY_NONE)WaitKey(); //等待按键switch(WhichKey){case KEY_ESC : if(NowKeyTab.PressEsc != MENU_NO) {MenuID =NowKeyTab.PressEsc;MenuNextID =NowKeyTab.MenuIndex;NowKeyTab = KeyTab[MenuID];NowKeyTab.PressOk =MenuNextID;(*NowKeyTab.CurrentOperate)(); //显示当前菜单}elseescflag =TRUE; //退出编程状态break;case KEY_OK : if(NowKeyTab.PressOk != MENU_NO) {MenuID =NowKeyTab.PressOk;NowKeyTab = KeyTab[MenuID];MenuNextID =NowKeyTab.PressOk;}(*NowKeyTab.CurrentOperate)(); //执行当前按键的操作break;case KEY_UP : if((MenuNextID != MENU_NO) && (KeyTab[MenuNextID].PressUp != MENU_NO)){NowKeyTab.PressOk =KeyTab[MenuNextID].PressUp;MenuNextID = KeyTab[MenuNextID].PressUp;(*NowKeyTab.CurrentOperate)(); //执行当前按键的操作}break;case KEY_DOWN: if((MenuNextID != MENU_NO) && (KeyTab[MenuNextID].PressDown != MENU_NO)){NowKeyTab.PressOk =KeyTab[MenuNextID].PressDown;MenuNextID = KeyTab[MenuNextID].PressDown;(*NowKeyTab.CurrentOperate)(); //执行当前按键的操作}break;case KEY_RESET: ResetFlag = TRUE;break;default : break;}}while(!ResetFlag && !EscFlag && !escflag);if(ChangeFlag && !EscFlag && !ResetFlag) EditDataChange();if(ResetFlag)return SYS_RESET;else{return 0;}}关于这个菜单的说明:1.我用的是ARM处理器,所以51的时候把const改成code,uint32改成unsign ed char。
使用MSP430设计系统监控器MSP430是一种低功耗的微控制器,适合用于设计系统监控器。
在本文中,将详细介绍如何使用MSP430设计一个功能齐全的系统监控器。
首先,我们需要选择一个合适的MSP430系列微控制器。
MSP430系列中有多个不同型号可供选择,其中一些具有特定的功能和性能。
我们需要根据我们的系统监控器的需求来选择一个适当的型号。
接下来,我们需要设计电路图。
系统监控器通常包括多个传感器,如温度传感器、湿度传感器、光照传感器等,以及一些输出设备,如显示屏、蜂鸣器等。
我们需要将这些组件与MSP430微控制器连接起来,并确保电路图的正确性和可靠性。
在完成电路图设计后,我们可以使用相应的软件工具进行电路模拟和仿真。
这可以帮助我们验证电路的功能和性能,并进行必要的调整和改进。
然后,我们需要编写软件代码。
MSP430系列微控制器通常使用C语言进行编程。
我们可以使用开发套件中提供的IDE(集成开发环境)来编写和调试代码。
在编写代码时,我们需要考虑以下几个方面:1.设置传感器和输出设备的接口。
我们需要了解每个设备连接到MSP430微控制器的引脚,并设置相应的GPIO(通用输入/输出)配置。
2.编写数据采集和处理代码。
我们需要使用传感器读取数据,并进行适当的数据处理和计算。
例如,我们可以使用温度传感器读取当前温度,并根据一些预定的阈值判断是否需要触发警报。
3.确定监控指标和警报阈值。
我们需要明确监控的指标,例如温度、湿度等,并设置相应的警报阈值。
当监测的指标超过或低于设定的阈值时,系统应该触发相关的警报。
4.设计用户界面。
系统监控器通常需要一个用户界面来显示监测的数据和警报信息。
我们可以使用MSP430的显示屏来设计一个简单的用户界面,并将数据以易理解的方式显示出来。
5.调试和测试。
在完成编写代码后,我们需要使用调试工具对代码进行调试,并测试系统监控器的各项功能。
在测试过程中,我们可以使用虚拟传感器输入模拟不同的条件,并验证系统的相应。
uchar M_MENU; //等于0则在测量界面,等于1在菜单uchar M_HAOMA; //菜单的号码uchar NUM1; //main程序用传递主号码uchar huancun1; //程序内部用,存放缓存HAOMA uchar huancun2; //程序内部用,存放缓存WEIZHI uchar M_BEIFEN; //备份上一次的操作uchar M_CAIDANSHU; //此时菜单的数量uchar M_CAIDANWEIZHI; //此时菜单位置uchar M_XIA; //下“键是否可用,1为可用uchar M_YOU; //右“键是否可用,1为可用uchar M_QUEREN;uchar siweishu[]={0x00,0x00,0x00,0x00};uchar digits_siweistr[]={0x00,0x00,0x00,0x05};ulong zhanhao;uchar siwei_weizhi;#include "XIANSHI.h"//********声明菜单void(*zhizhen)();void displaymenu(); //第一次进入主菜单void caidanxia();void caidanqueren();void RS485menu();void RS485xia();void RS485queren();void RS485diancimenu();void RS485diancixia();void RS485dianciqueren();void RS485diancizhanhao();void siweishumenu();//光标位置void guangbiao(unsigned int x){uint y;if((x==0)|(x==4)|(x==8))y=0;}if((x==1)|(x==5)){y=1;}if((x==2)|(x==6)){y=2;}if((x==3)|(x==7)){y=3;}switch(y){case 0:LCD_write_com(0x81); LCD_write_data(0x10); LCD_write_com(0x91); LCD_write_data(0x20); LCD_write_com(0x89); LCD_write_data(0x20); LCD_write_com(0x99); LCD_write_data(0x20); break;case 1:LCD_write_com(0x81); LCD_write_data(0x20); LCD_write_com(0x91); LCD_write_data(0x10); LCD_write_com(0x89); LCD_write_data(0x20); LCD_write_com(0x99); LCD_write_data(0x20); break;case 2:LCD_write_com(0x81); LCD_write_data(0x20); LCD_write_com(0x91); LCD_write_data(0x20); LCD_write_com(0x89); LCD_write_data(0x10);LCD_write_com(0x99);LCD_write_data(0x20);break;case 3:LCD_write_com(0x81);LCD_write_data(0x20);LCD_write_com(0x91);LCD_write_data(0x20);LCD_write_com(0x89);LCD_write_data(0x20);LCD_write_com(0x99);LCD_write_data(0x10);break;}}//四位数光标位置void guangbiao_siwei(uchar x) {switch (x){case 0:LCD_write_com(0x8b);LCD_write_com(0x0f);break;case 1:LCD_write_com(0x8c);LCD_write_com(0x0f);break;case 2:LCD_write_com(0x8d);LCD_write_com(0x0f);break;case 3:LCD_write_com(0x8e);LCD_write_com(0x0f);break;}}//***********设置形式typedef struct{uchar haoma;uchar xiajian;uchar youjian;uchar querenjian;void(*chengxu)();}keystruct;//************.库keystruct key[]={{0,1,0,2,(*displaymenu)}, //第一次进入菜单项{1,0,0,0,(*caidanxia)}, //主菜单时下{2,0,0,0,(*caidanqueren)}, //主菜单时确认{3,4,5,6,(*RS485menu)}, //485测试主项{4,0,0,0,(*RS485xia)}, //485测试菜单按下{5,0,0,0,(*displaymenu)}, //485测试菜单按右{6,0,0,0,(*RS485queren)}, //485测试菜单确认{7,8,9,10,(*RS485diancimenu)}, //485测试电磁主项{8,0,0,0,(*RS485diancixia)}, //电磁下{9,0,0,0,(*RS485menu)}, //电磁右{10,0,0,0,(*RS485dianciqueren)}, //电磁确认{11,12,13,14,(*RS485diancizhanhao)},};//第一次进入菜单void displaymenu(){M_CAIDANWEIZHI=0; //菜单位置为0M_XIA=1; //下可用M_YOU=0; //右不可用M_QUEREN=1; //确认可用XIANSHI_MENU1(); //液晶显示guangbiao(M_CAIDANWEIZHI); //光标显示M_HAOMA=0; //标记目前操作所处菜单级别}//主菜单时下void caidanxia(){if(M_CAIDANWEIZHI==4){XIANSHI_MENU1();}else if(M_CAIDANWEIZHI<3){M_CAIDANWEIZHI=M_CAIDANWEIZHI+1;}else{M_CAIDANWEIZHI=M_CAIDANWEIZHI+1;XIANSHI_MENU2();}guangbiao(M_CAIDANWEIZHI);}//主菜单下按下确认键void caidanqueren(){huancun1=0;switch(M_CAIDANWEIZHI){case 0: //如果进485测试M_HAOMA=3;zhizhen=key[M_HAOMA].chengxu;(*zhizhen)();break;}}//进入485主项测试void RS485menu(){M_CAIDANWEIZHI=0; //菜单位置为0 M_XIA=1; //下可用M_YOU=1; //右可用M_QUEREN=1; //确认可用XIANSHI_4851(); //液晶显示guangbiao(M_CAIDANWEIZHI); //光标显示M_HAOMA=3;}//485测试时下void RS485xia(){{M_CAIDANWEIZHI=0;XIANSHI_4851();}else if(M_CAIDANWEIZHI<3){M_CAIDANWEIZHI=M_CAIDANWEIZHI+1;}else{M_CAIDANWEIZHI=M_CAIDANWEIZHI+1;XIANSHI_4852();}guangbiao(M_CAIDANWEIZHI);}//485测试下按下确认键void RS485queren(){huancun1=0;switch(M_CAIDANWEIZHI){case 0: //如果进电磁测试M_HAOMA=7;zhizhen=key[M_HAOMA].chengxu;(*zhizhen)();break;}}//进入485电磁主项测试void RS485diancimenu(){M_CAIDANWEIZHI=0; //菜单位置为0 M_XIA=1; //下可用M_YOU=1; //右可用M_QUEREN=1; //确认可用RS485diancixianshi(); //液晶显示guangbiao(M_CAIDANWEIZHI); //光标显示M_HAOMA=7;}//485电磁测试下按下键void RS485diancixia(){if(M_CAIDANWEIZHI==4){M_CAIDANWEIZHI=0;}else{M_CAIDANWEIZHI=M_CAIDANWEIZHI+1;}guangbiao(M_CAIDANWEIZHI);}//485电磁测试下按下确认键void RS485dianciqueren(){huancun1=0;switch(M_CAIDANWEIZHI){case 0: //如果进入电磁站号设置M_HAOMA=11;zhizhen=key[M_HAOMA].chengxu;(*zhizhen)();break;}}//电磁站号主项void RS485diancizhanhao(){M_XIA=1; //下可用M_YOU=1; //右可用M_QUEREN=1; //确认可用siweishumenu(zhanhao);}//四位数设置void siweishumenu(ulong Q){ulong Q1=Q;uchar digits_siwei[4]={0x00,0x00,0x00,0x00};ulong mask_siwei[4]={1000,100,10,1,};for(uchar i=0;i<4;i++){digits_siwei[i]=0;while(Q1>=mask_siwei[i]){digits_siwei[i]++;Q1-=mask_siwei[i];}digits_siweistr[i]=digits_siwei[i]+0x30; }xianshi_siwei();siwei_weizhi=3; //光标位置guangbiao_siwei(siwei_weizhi);}。
msp430三级菜单菜单算法#include "msp430x14x.h"#include "lcd12864.h"#include "jianpan.h"#include "fun.h"#define uchar unsigned char#define uint unsigned intuchar func_index;uint i;void (*current_operation_index)();/********************主函数******************************************/ void main() { P1DIR=0Xf0;P1OUT=0X00;WDTCTL = WDTPW + WDTHOLD;lcd12864_init();init();//初始化LCD模块delay2(1);while(1){/*******************find index****************************/if(P1IN==0X0E){func_index=table[func_index].up; //向上翻while((P1IN&0x0f)!=0x0f);//松手检测write_con(0x01);//清屏}if(P1IN==0x0D){func_index=table[func_index].down; //向下翻while((P1IN&0x0f)!=0x0f);write_con(0x01);//清屏}if(P1IN==0x0B){func_index=table[func_index].enter; //确认while((P1IN&0x0f)!=0x0f);write_con(0x01);//清屏}current_operation_index=table[func_index].current_operatio n;(*current_operation_index)();//执行当前操作函数}}#include"msp430f149.h"#define uchar unsigned char#define uint unsigned int#define keyin (P1IN&0X0F)uchar keyValue;/****************延时1ms******************/void delay2(uchar time){uint i,j;for(i=0;i<time;i++)< p="">{for(j=0;j<150;j++);}}#include"msp430f149.h"/****************菜单结构体***************************/typedef struct{uchar current;uchar up;//向上翻索引号uchar down;//向下翻索引号uchar enter;//确认索引号void (*current_operation)();} key_table;/**************菜单功能显示***********************************/ void fun1(){display_hz(1,0,"【菜单1 】",12);display_hz(2,1,"菜单2",3);display_hz(3,1,"菜单3",3);display_hz(4,3,"返回",2);}void fun2(){display_hz(1,1,"菜单1",2);display_hz(2,0,"【菜单2 】",2);display_hz(3,1,"菜单3",2);display_hz(4,3,"返回",2);}void fun3(){display_hz(1,1,"菜单1",2);display_hz(2,1,"菜单2",2);display_hz(3,0,"【菜单3 】",2);display_hz(4,3,"返回",2);void fun4(){display_hz(1,1,"菜单1",2);display_hz(2,1,"菜单2",2);display_hz(3,1,"菜单3",2);display_hz(4,2,"【返回】",2);}void fun5(){display_hz(1,0,"【菜单1.1 】",2);display_hz(2,1,"菜单1.2",2);display_hz(3,1,"菜单1.3",2);display_hz(4,3,"返回",2);void fun6(){display_hz(1,1,"菜单1.1",2); display_hz(2,0,"【菜单1.2 】",2); display_hz(3,1,"菜单1.3",2); display_hz(4,3,"返回",2);}void fun7(){display_hz(1,1,"菜单 1.1",2); display_hz(2,1,"菜单 1.2",2); display_hz(3,0,"【菜单1.3 】",2); display_hz(4,3,"返回",2);}void fun8(){display_hz(1,1,"菜单 1.1",2); display_hz(2,1,"菜单 1.2",2); display_hz(3,1,"菜单1.3",2); display_hz(4,2,"【返回】",2);}void fun9()display_hz(1,0,"【菜单2.1 】",2); display_hz(2,1,"菜单2.2",2); display_hz(3,1,"菜单2.3",2); display_hz(4,3,"返回",2);}void fun10(){display_hz(1,1,"菜单2.1",2); display_hz(2,0,"【菜单2.2 】",2); display_hz(3,1,"菜单2.3",2); display_hz(4,3,"返回",2);}void fun11(){display_hz(1,1,"菜单 2.1",2); display_hz(2,1,"菜单 2.2",2); display_hz(3,0,"【菜单2.3 】",2); display_hz(4,3,"返回",2);}void fun12()display_hz(1,1,"菜单 2.1",2); display_hz(2,1,"菜单 2.2",2); display_hz(3,1,"菜单2.3",2); display_hz(4,2,"【返回】",2);}void fun13(){display_hz(1,0,"【菜单3.1 】",2); display_hz(2,1,"菜单3.2",2); display_hz(3,1,"菜单3.3",2); display_hz(4,3,"返回",2);}void fun14(){display_hz(1,1,"菜单3.1",2); display_hz(2,0,"【菜单3.2 】",2); display_hz(3,1,"菜单3.3",2); display_hz(4,3,"返回",2);}void fun15(){display_hz(3,0,"【菜单3.3 】",2); display_hz(4,3,"返回",2);}void fun16(){display_hz(1,1,"菜单 3.1",2); display_hz(2,1,"菜单 3.2",2); display_hz(3,1,"菜单3.3",2); display_hz(4,2,"【返回】",2);}void fun17(){display_hz(1,1,"菜单1.1.1",2); display_hz(2,1,"菜单1.1.2",2); display_hz(3,1,"菜单1.1.3",2); display_hz(4,2,"【返回】",2);}void fun18(){display_hz(1,1,"菜单1.2.1",3);display_hz(3,1,"菜单1.2.3",3); display_hz(4,2,"【返回】",2);}void fun19(){display_hz(1,1,"菜单1.3.1",2);display_hz(2,1,"菜单1.3.2",2);display_hz(3,1,"菜单1.3.3",2);display_hz(4,2,"【返回】",2); }void fun20(){display_hz(1,1,"菜单2.1.1",2); display_hz(2,1,"菜单2.1.2",2); display_hz(3,1,"菜单2.1.3",2); display_hz(4,2,"【返回】",2); } void fun21(){display_hz(3,1,"菜单2.2.3",2); display_hz(4,2,"【返回】",2); } void fun22(){display_hz(1,1,"菜单2.3.1",2); display_hz(2,1,"菜单2.3.2",2); display_hz(3,1,"菜单2.3.3",2); display_hz(4,2,"【返回】",2); } void fun23(){display_hz(1,1,"菜单3.1.1",2); display_hz(2,1,"菜单3.1.2",2); display_hz(3,1,"菜单3.1.3",2); display_hz(4,2,"【返回】",2); } void fun24(){display_hz(1,1,"菜单3.2.1",2); display_hz(2,1,"菜单3.2.2",2); display_hz(3,1,"菜单3.2.3",2);}void fun25(){display_hz(1,1,"菜单3.3.1",2);display_hz(2,1,"菜单3.3.2",2);display_hz(3,1,"菜单3.3.3",2);display_hz(4,2,"【返回】",2);}void fun26(){display_hz(1,0,"错",2);display_hz(2,0,"误",2);display_hz(3,0,"操",2);display_hz(4,0,"作",2);}/**************************结构体数组***************************************/ key_table table[30]= {{0,3,1,4,(*fun1)},//第一层,显示【菜单1】、菜单2、菜单3 、返回{1,0,2,8,(*fun2)},//第一层,显示菜单1、【菜单2】、菜单3 、返回{2,1,3,12,(*fun3)},//第一层,显示菜单1、菜单2、【菜单3】、返回{3,2,0,25,(*fun4)},//第一层,显示菜单1、菜单2、菜单3 、【返回】{4,7,5,16,(*fun5)},//第二层,菜单1层下显示【菜单1.1】、菜单1.2、菜单1.3、返回{5,4,6,17,(*fun6)},//第二层,菜单1层下显示菜单1.1、【菜单1.2】、菜单1.3、返回{6,5,7,18,(*fun7)}, //第二层,菜单1层下显示菜单1.1、菜单1.2、【菜单1.3】、返回{7,6,4,0,(*fun8)},//第二层,菜单1层下显示菜单 1.1、菜单 1.2、菜单 1.3、【返回】{8,11,9,19,(*fun9)},//第二层,菜单2层下显示【菜单2.1】、菜单2.2、菜单2.3、返回{9,8,10,20,(*fun10)},//第二层,菜单2层下显示菜单2.1、【菜单2.2】、菜单2.3、返回{10,9,11,21,(*fun11)}, //第二层,菜单2层下显示菜单 2.1、菜单 2.2、【菜单 2.3】、返回{11,10,8,1,(*fun12)},//第二层,菜单2层下显示菜单2.1、菜单2.2、菜单2.3、【返回】{12,15,13,22,(*fun13)},//第二层,菜单3层下显示【菜单3.1】、菜单3.2、菜单3.3、返回{13,12,14,23,(*fun14)}, //第二层,菜单3层下显示菜单3.1、【菜单3.2】、菜单3.3、返回{14,13,15,24,(*fun15)}, //第二层,菜单3层下显示菜单3.1、菜单3.2、【菜单3.3】、返回{15,14,12,2,(*fun16)}, //第二层,菜单3层下显示菜单3.1、菜单3.2、菜单3.3、【返回】{16,16,16,4,(*fun17)}, //第三层,菜单1.1层{17,17,17,5,(*fun18)}, //第三层,菜单1.2层{18,18,18,6,(*fun19)}, //第三层,菜单1.3层{19,19,19,8,(*fun20)}, //第三层,菜单2.1层{20,20,20,9,(*fun21)}, //第三层,菜单2.2层{21,21,21,10,(*fun22)}, //第三层,菜单2.3层{22,22,22,12,(*fun23)}, //第三层,菜单3.1层{23,23,23,13,(*fun24)}, //第三层,菜单3.2层{24,24,24,14,(*fun25)}, //第三层,菜单3.3层{25,25,25,0,(*fun26)}, //第0层};#include"msp430f149.h"#define uchar unsigned char#define uint unsigned int#define RS_0 (P3OUT&=~BIT0)#define RS_1 (P3OUT|=BIT0)#define RW_0 (P3OUT&=~BIT1)#define RW_1 (P3OUT|=BIT1)#define EN_0 (P3OUT&=~BIT2)#define EN_1 (P3OUT|=BIT2)/****************延时1ms******************/void delay1(uchar time){uint i,j;for(i=0;i<time;i++)< p="">{for(j=0;j<150;j++);}}/*************IO初始化*****************************/void lcd12864_init(void){P4DIR=0XFF;P6DIR|=BIT2;P6DIR |= BIT3;P3DIR|=0X07;}/**********lcdd写指令**************************/void write_con(uchar con){RS_0;RW_0;EN_0;P4OUT=con;delay1(2);EN_1;EN_0;}/****************lcd写数据********************************/ void write_data(uchar data){RS_1;RW_0;EN_0;P4OUT=data;delay1(2);EN_1;EN_0;}/***********lcd初始化****************************/void init(){P6OUT|=0X04;P6OUT |= BIT3;write_con(0x30);//基本指令集delay1(2);write_con(0x02);//地址归位delay1(2);write_con(0x0c);//显示delay1(2);write_con(0x01);//清屏delay1(2);write_con(0x06);//点设定delay1(2);}/*****************lcd写指令/数据地址****************************/void write_ardd(uchar hang,uchar lie){switch(hang){case 1 :write_con(0x80+lie);break;case 2 :write_con(0x90+lie);break;case 3 :write_con(0x88+lie);break;case 4 :write_con(0x98+lie);break;default:break;}}/*********************lcd显示数据串**************************************/ void display_shujc(ucharhang,uchar lie,uint shujc){uint i;uchar tab[4];write_ardd(hang,lie);tab[0]=shujc/1000;tab[1]=shujc%1000/100;tab[2]=shujc%100/10;tab[3]=shujc%10;for(i=0;i<4;i++){write_data(0x30+tab[i]);}}/***********************lcd显示数字******************************************/ void display_shuzi(uchar hang,uchar lie,uchar shuzi){write_ardd(hang,lie);write_data(0x30+shuzi);}/************************lcd显示汉字*****************************************************/void display_hz(uchar hang,uchar lie,uchar *data,uchar shu) {uint i;write_ardd(hang,lie);for(i=0;i<shu;i++)< p="">{while(*data!='\0'){write_data(*data); data++;}}}</shu;i++)<></time;i++)<> </time;i++)<>。
IARMSP430使用指引本指引是为配合推出的MSP430学习系统而写的,当然您也可以把它当成您使用IAR FOR MSP430(以下简写为EW430)的一个参考文档!本指引会按照建立一个项目的步骤来撰写,并且会插入附图以加快大家对IAR FOR MSP430的学习使用。
一、安装和运行EW430:EW430是IAR SYSTEMS SOFTWARE INC的产品,该公司的网站是,您可以到这个公司的网站下载到试用版的软件,它和正式版不同的是试用版可以免费使用一段时间而没有功能上的限制,超过这段试用期,如果您打算继续使用,那么您得购买此软件的授权。
下载了试用版后,点击安装包的SETUP.EXE,选择安装路径和安装方式或采用默认的安装,安装包会在目录下产生IAR的目录,并在”开始”菜单产生快捷方式,这一个工程对于经常使用软件的用户来说是非常简单的,因此不再AOSHU。
系统重启后,在系统栏会出现图1.1中的图标。
在这个图标上点击鼠标左键可以很方便的开启IAR FOR MSP和其它IAR系统软件(图1.2)。
图1.1图1.2运行后的界面如图1.3所示(以1.26A版为例)图1.3二、建立工程文件和添加文件我们习惯了在WINDOWS下的各种编程软件中以一个工程(PROJECT)来管理我们正在作的工作,EW430也不例外,因此第一步要作的就是新建一个工程或用其它方法来建立一个工程。
点击”File”菜单下的”New”菜单,出现图2.1中的框,选择”Project”后点击”确定”按键。
图2.1接下来会出现对话框,您得指定你的工程文件保存在哪个目录下图2.2我这此建立的是一个控制液晶模块1602A的工程,取名为lcm1602.prj。
然后点击”Create”按键生成这个项目。
图2.3图中的”Targets”一项中表示目前的这个工程的是用于调试的。
好了,工程文件已经建立完成了,现在可以把要用到的文件添加到工程中去。
要提醒您的是经常使用”File”菜单下的”Save all”保存您到目前完成的工作。
#include "msp430x14x.h"#include "lcd12864.h"#include "jianpan.h"#include "fun.h"#define uchar unsigned char#define uint unsigned intuchar func_index;uint i;void (*current_operation_index)();/********************主函数******************************************/ void main(){ P1DIR=0Xf0;P1OUT=0X00;WDTCTL = WDTPW + WDTHOLD;lcd12864_init();init();//初始化LCD模块delay2(1);while(1){/*******************find index****************************/if(P1IN==0X0E){func_index=table[func_index].up; //向上翻while((P1IN&0x0f)!=0x0f);//松手检测write_con(0x01);//清屏}if(P1IN==0x0D){func_index=table[func_index].down; //向下翻while((P1IN&0x0f)!=0x0f);write_con(0x01);//清屏}if(P1IN==0x0B){func_index=table[func_index].enter; //确认while((P1IN&0x0f)!=0x0f);write_con(0x01);//清屏}current_operation_index=table[func_index].current_operation;(*current_operation_index)();//执行当前操作函数}}#include"msp430f149.h"#define uchar unsigned char#define uint unsigned int#define keyin (P1IN&0X0F)uchar keyValue;/****************延时1ms******************/void delay2(uchar time){uint i,j;for(i=0;i<time;i++){for(j=0;j<150;j++);}}#include"msp430f149.h"/****************菜单结构体***************************/typedef struct{uchar current;uchar up;//向上翻索引号uchar down;//向下翻索引号uchar enter;//确认索引号void (*current_operation)();} key_table;/**************菜单功能显示***********************************/ void fun1(){display_hz(1,0,"【菜单1 】",12);display_hz(2,1,"菜单2",3);display_hz(3,1,"菜单3",3);display_hz(4,3,"返回",2);}void fun2(){display_hz(1,1,"菜单1",2);display_hz(2,0,"【菜单2 】",2);display_hz(3,1,"菜单3",2);display_hz(4,3,"返回",2);}void fun3(){display_hz(1,1,"菜单1",2);display_hz(2,1,"菜单2",2);display_hz(3,0,"【菜单3 】",2);display_hz(4,3,"返回",2);}void fun4(){display_hz(1,1,"菜单1",2);display_hz(2,1,"菜单2",2);display_hz(3,1,"菜单3",2);display_hz(4,2,"【返回】",2);}void fun5(){display_hz(1,0,"【菜单1.1 】",2);display_hz(2,1,"菜单1.2",2);display_hz(3,1,"菜单1.3",2);display_hz(4,3,"返回",2);void fun6(){display_hz(1,1,"菜单1.1",2); display_hz(2,0,"【菜单1.2 】",2); display_hz(3,1,"菜单1.3",2); display_hz(4,3,"返回",2);}void fun7(){display_hz(1,1,"菜单1.1",2); display_hz(2,1,"菜单1.2",2); display_hz(3,0,"【菜单1.3 】",2); display_hz(4,3,"返回",2);}void fun8(){display_hz(1,1,"菜单1.1",2); display_hz(2,1,"菜单1.2",2); display_hz(3,1,"菜单1.3",2); display_hz(4,2,"【返回】",2);}void fun9(){display_hz(1,0,"【菜单2.1 】",2); display_hz(2,1,"菜单2.2",2); display_hz(3,1,"菜单2.3",2); display_hz(4,3,"返回",2);}void fun10(){display_hz(1,1,"菜单2.1",2); display_hz(2,0,"【菜单2.2 】",2); display_hz(3,1,"菜单2.3",2); display_hz(4,3,"返回",2);}void fun11(){display_hz(1,1,"菜单2.1",2); display_hz(2,1,"菜单2.2",2); display_hz(3,0,"【菜单2.3 】",2); display_hz(4,3,"返回",2);}void fun12()display_hz(1,1,"菜单2.1",2); display_hz(2,1,"菜单2.2",2); display_hz(3,1,"菜单2.3",2); display_hz(4,2,"【返回】",2);}void fun13(){display_hz(1,0,"【菜单3.1 】",2); display_hz(2,1,"菜单3.2",2); display_hz(3,1,"菜单3.3",2); display_hz(4,3,"返回",2);}void fun14(){display_hz(1,1,"菜单3.1",2); display_hz(2,0,"【菜单3.2 】",2); display_hz(3,1,"菜单3.3",2); display_hz(4,3,"返回",2);}void fun15(){display_hz(1,1,"菜单3.1",2); display_hz(2,1,"菜单3.2",2); display_hz(3,0,"【菜单3.3 】",2); display_hz(4,3,"返回",2);}void fun16(){display_hz(1,1,"菜单3.1",2); display_hz(2,1,"菜单3.2",2); display_hz(3,1,"菜单3.3",2); display_hz(4,2,"【返回】",2);}void fun17(){display_hz(1,1,"菜单1.1.1",2); display_hz(2,1,"菜单1.1.2",2); display_hz(3,1,"菜单1.1.3",2); display_hz(4,2,"【返回】",2);}void fun18(){display_hz(1,1,"菜单1.2.1",3);display_hz(3,1,"菜单1.2.3",3); display_hz(4,2,"【返回】",2);}void fun19(){display_hz(1,1,"菜单1.3.1",2);display_hz(2,1,"菜单1.3.2",2);display_hz(3,1,"菜单1.3.3",2);display_hz(4,2,"【返回】",2); }void fun20(){display_hz(1,1,"菜单2.1.1",2); display_hz(2,1,"菜单2.1.2",2); display_hz(3,1,"菜单2.1.3",2); display_hz(4,2,"【返回】",2); }void fun21(){display_hz(1,1,"菜单2.2.1",2); display_hz(2,1,"菜单2.2.2",2); display_hz(3,1,"菜单2.2.3",2); display_hz(4,2,"【返回】",2); }void fun22(){display_hz(1,1,"菜单2.3.1",2); display_hz(2,1,"菜单2.3.2",2); display_hz(3,1,"菜单2.3.3",2); display_hz(4,2,"【返回】",2); }void fun23(){display_hz(1,1,"菜单3.1.1",2); display_hz(2,1,"菜单3.1.2",2); display_hz(3,1,"菜单3.1.3",2); display_hz(4,2,"【返回】",2); }void fun24(){display_hz(1,1,"菜单3.2.1",2); display_hz(2,1,"菜单3.2.2",2); display_hz(3,1,"菜单3.2.3",2);}void fun25(){display_hz(1,1,"菜单3.3.1",2);display_hz(2,1,"菜单3.3.2",2);display_hz(3,1,"菜单3.3.3",2);display_hz(4,2,"【返回】",2);}void fun26(){display_hz(1,0,"错",2);display_hz(2,0,"误",2);display_hz(3,0,"操",2);display_hz(4,0,"作",2);}/**************************结构体数组***************************************/ key_table table[30]={{0,3,1,4,(*fun1)},//第一层,显示【菜单1】、菜单2、菜单3 、返回{1,0,2,8,(*fun2)},//第一层,显示菜单1、【菜单2】、菜单3 、返回{2,1,3,12,(*fun3)},//第一层,显示菜单1、菜单2、【菜单3】、返回{3,2,0,25,(*fun4)},//第一层,显示菜单1、菜单2、菜单3 、【返回】{4,7,5,16,(*fun5)},//第二层,菜单1层下显示【菜单1.1】、菜单1.2、菜单1.3、返回{5,4,6,17,(*fun6)},//第二层,菜单1层下显示菜单1.1、【菜单1.2】、菜单1.3、返回{6,5,7,18,(*fun7)}, //第二层,菜单1层下显示菜单1.1、菜单1.2、【菜单1.3】、返回{7,6,4,0,(*fun8)},//第二层,菜单1层下显示菜单1.1、菜单1.2、菜单1.3、【返回】{8,11,9,19,(*fun9)},//第二层,菜单2层下显示【菜单2.1】、菜单2.2、菜单2.3、返回{9,8,10,20,(*fun10)},//第二层,菜单2层下显示菜单2.1、【菜单2.2】、菜单2.3、返回{10,9,11,21,(*fun11)}, //第二层,菜单2层下显示菜单2.1、菜单2.2、【菜单2.3】、返回{11,10,8,1,(*fun12)},//第二层,菜单2层下显示菜单2.1、菜单2.2、菜单2.3、【返回】{12,15,13,22,(*fun13)},//第二层,菜单3层下显示【菜单3.1】、菜单3.2、菜单3.3、返回{13,12,14,23,(*fun14)}, //第二层,菜单3层下显示菜单3.1、【菜单3.2】、菜单3.3、返回{14,13,15,24,(*fun15)}, //第二层,菜单3层下显示菜单3.1、菜单3.2、【菜单3.3】、返回{15,14,12,2,(*fun16)}, //第二层,菜单3层下显示菜单3.1、菜单3.2、菜单3.3、【返回】{16,16,16,4,(*fun17)}, //第三层,菜单1.1层{17,17,17,5,(*fun18)}, //第三层,菜单1.2层{18,18,18,6,(*fun19)}, //第三层,菜单1.3层{19,19,19,8,(*fun20)}, //第三层,菜单2.1层{20,20,20,9,(*fun21)}, //第三层,菜单2.2层{21,21,21,10,(*fun22)}, //第三层,菜单2.3层{22,22,22,12,(*fun23)}, //第三层,菜单3.1层{23,23,23,13,(*fun24)}, //第三层,菜单3.2层{24,24,24,14,(*fun25)}, //第三层,菜单3.3层{25,25,25,0,(*fun26)}, //第0层};#include"msp430f149.h"#define uchar unsigned char#define uint unsigned int#define RS_0 (P3OUT&=~BIT0)#define RS_1 (P3OUT|=BIT0)#define RW_0 (P3OUT&=~BIT1)#define RW_1 (P3OUT|=BIT1)#define EN_0 (P3OUT&=~BIT2)#define EN_1 (P3OUT|=BIT2)/****************延时1ms******************/void delay1(uchar time){uint i,j;for(i=0;i<time;i++){for(j=0;j<150;j++);}}/*************IO初始化*****************************/void lcd12864_init(void){P4DIR=0XFF;P6DIR|=BIT2;P6DIR |= BIT3;P3DIR|=0X07;}/**********lcdd写指令**************************/void write_con(uchar con){RS_0;RW_0;EN_0;P4OUT=con;delay1(2);EN_1;EN_0;}/****************lcd写数据********************************/ void write_data(uchar data){RS_1;RW_0;EN_0;P4OUT=data;delay1(2);EN_1;EN_0;}/***********lcd初始化****************************/void init(){P6OUT|=0X04;P6OUT |= BIT3;write_con(0x30);//基本指令集delay1(2);write_con(0x02);//地址归位delay1(2);write_con(0x0c);//显示delay1(2);write_con(0x01);//清屏delay1(2);write_con(0x06);//点设定delay1(2);}/*****************lcd写指令/数据地址****************************/void write_ardd(uchar hang,uchar lie){switch(hang){case 1 :write_con(0x80+lie);break;case 2 :write_con(0x90+lie);break;case 3 :write_con(0x88+lie);break;case 4 :write_con(0x98+lie);break;default:break;}}/*********************lcd显示数据串**************************************/ void display_shujc(uchar hang,uchar lie,uint shujc){uint i;uchar tab[4];write_ardd(hang,lie);tab[0]=shujc/1000;tab[1]=shujc%1000/100;tab[2]=shujc%100/10;tab[3]=shujc%10;for(i=0;i<4;i++){write_data(0x30+tab[i]);}}/***********************lcd显示数字******************************************/ void display_shuzi(uchar hang,uchar lie,uchar shuzi){write_ardd(hang,lie);write_data(0x30+shuzi);}/************************lcd显示汉字*****************************************************/void display_hz(uchar hang,uchar lie,uchar *data,uchar shu){uint i;write_ardd(hang,lie);for(i=0;i<shu;i++){while(*data!='\0'){write_data(*data);data++;}}}。