MSP430F149IPM单片机液晶显示时间的程序.docx
通过232串口设置MSP430F149IPM单片机液晶显下时间的程序下面介绍一段通过232串口设置MSP430F149IPM单片机液晶显示时间的程序。用户通过串口发送OXOLOXO2,0X03,0X04可以改变单片机液晶显示时间,当到达一定设置时间时,单片机P2端口输出7路高电平,1路低电平,第二段程序,可以从单片机按键像计算机232串口发送OXOO,同时单片机液晶屏显示时间。MSP430单片机电路如下,程序通过IAR430V5.3软件编译通过,生成文件,使用BSL下载软件-MSP430BSL通过USB端口把.TXT文件烧写到单片机中。程序和电路可以在下面的网址下载:链接:https:/pan.baidu.eom/s/lPxUz7CXQP7hGBTIDc7kUog;提取码:2kcy程序1:/*程序功能:在1602液晶上显示用MCU的TimerA模拟的数字式实时时钟。测试说明:观察液晶显示程序功能:接收来自PC机的字符,然后重新发送给PC机程序功能:串口发送十六进制数Ol,液晶显示时间25:25:25,串口发送十六进制数02,液晶显示时间35:3535,串口发送十六进制数03,液晶显示时间11:11:34,液晶计时11:10:60时,P2口输出01111111,液晶显示3333:11通信格式:N.8.1,9600无校验,8个数据位,1个停止位,波特率9600#include<msp430×14×.h>#include"cryl602.h"#include"clock.h"#include"cryl602.c"#include"clock.c"#definekeyinP3INuchartishi="CurrentTimeis"提示信息voiddelay(void);externucharsecond,minute,hour,hourO;externucharpmin,phour,psl;#defineSetTime(H,M,S)second=S;minute=M;hour=H;hourO=H;ucharscandata16;/*Ivoidmain(void)(*下面六行程序关闭所有的IO口*/PlDIR=OXFF;P10UT=OXFF;P2DIR=0XFF;P2OUT=OXFF;P3DIR=0XFF;P3OUT=OXFF;P4DIR=0XFF;P4OUT=OXFF;P5DIR=0XFF;P5OUT=OXFF;P6DIR=0XFF;P6OUT=OXFF;WDTCTL=WDTPW÷WDTHOLD;关闭看门狗/P6DIR=BIT2;P6OUTI=BlT2;关闭电平转换/P6DIR=BIT6;P6OUT&=BIT6;关闭电平转换P3SEL=0x30;MEl=UTXEO+URXEO;UCTLO=CHAR;UTCTLO=SSELO;UBROO=0×03;UBRlO=0x00;UMCTLO=0×4A;UCTLO&二-SWRST;正1=URXIEO;CCRO=32768-1;TACTL=TASSEL_1+CCTLO=CCIE;/选择P3.4和P3.5做UART通信端口使能USARTO的发送和接受选择8位字符/ UCLK = ACLK波特率9600/ Modulation初始化UART状态机使能USARTO的接收中断设置定时器A的中断时间为ISMC.1; 计数时钟ACLK,增计数模式使能CCRO比较中断打开全局中断/ IEl I= URX正0;使能USARTO的接收中断请在此处设置正确时间SetTime(ll,11,34);顺序:时,分,秒,格式:BCD码-EINT();1.cdReset();DiSPNChar(0,0,15,tishi);显示提示文字DiSPlChar(6,1,':');显示字符:DiSPlChar(9,L':');P2DIR=Oxff;设置P2口方向为输出/SetTime(RXBUFO,RXBUFO,RXBUFO);/P2OUT=0x40;/if(IFGl&URXIFG0)如果收到字符/SetTime(RXBUFO,RXBUFO,RXBUFO);顺序:时,分,秒,格式:BCD/)/else/SetTime(ll,11,34);顺序:时,分,秒,格式:BCD码while(l)/-EINT();打开全局中断/LPMl;进入LPMI模式/while(!(IFGl&TXIFGO);等待以前的字符发送完毕/TXBUFO=RXBUFO;将收到的字符发送出去/if(IFGl&URXIFG0)如果收到字符/Switch(RXBUFO)/case0x01:if(RXBF0=0x01)如果是第一个按键被按下(second=25;minute=25;hour=25;SetTime(19,19,19);TXBUFO=RXBUFO;)if(RXBFO=0x02)如果是第一个按键被按下(second=35;minute=35;hour=35;SetTimeQ9,19,19);TXBUFO=RXBUFO;/)/)if(R×BUF0=0x03)如果是第T按键被按下(second=34;minute=ll;hour=ll;SetTimeQ9,19,19);TXBUFO=RXBUFO;/)/else/SetTime(ll,ll,34);顺序:时,分,秒,格式:BCD码/)/scandata16=RXBUFO;/if(RXBUF0!=0X00)/SetTime(RXBUFO,RXBUFO,RXBUFO);顺序:时,分,秒,格式:BCD/)/LPM3;进入LPM3低功耗模式DispIayO;if(second=60&minute=10&hour=ll)如果是第一个按键被按下P20UT=0×80;SetTime(33,33,11);if(keyin=Oxbf)如果是第一个按键被按下(delay();if(keyin=O×bf)(while(keyin!=Oxbf);等待按键放开SetTime(22,22,ll);顺序:时,分,秒,格式:BCD码return;)/*函数名称:TimerAJSR功能:定时器A的中断服务函数参数:无返回值:无#pragmavector=TIMERAO_VECTOR_interruptvoidTimerAJSR(Void)(Clock();1.PM3_EXIT;)voiddelay(void)uinttmp;for(tmp=12000;tmp>0;tmp);)/*函数名称:UARTO_RXISR功能:UARTO的接收中断服务函数,在这里唤醒CPU,使它退出低功耗模式参数:无返回值:无*/#pragmavector=UARTORX.VECTOR_interruptvoidUARTO_RXISR(void)(1.PM1_EXIT;退出低功耗模式)/#include<msp430×44x.h>#include"cryl602.h"/全局变量*/ucharsecond,minute,hour,hourO;/¾!>s分、时变量ucharpmin,phour,psl;辅助计算变量函数名称:Clock功能:计算当前时间参数:无返回值:无说明:本函数对本文件开头定义的second,minute,hour,hourO四个全局变量进行操作I*:*/voidCIock(Void)second-=1;/second<=60&second>=O;/minute<=60&minute>=0;/hour<=1008ihour>=0;if(second=0)(second=60;minute-=1;if(minute=0)(minute=60;hour-=1;hourO-=1;if(hour=0)hour=24;)/voidClock(void)/second-=1;/second<=60&second>=0;/minute<=60&minute>=0;/hour<=1008ihour>=0;/if(second=60)/second=0;/minute-=1;/if(minute=60)/minute=0;/hour-=1;hourO-=1;/if(hour=24)hour=0;/)/)/)/*函数名称:Display功能:在1602液晶上显示时间参数:无返回值:无说明:本函数对本文件开头定义的全局变量进行操作voidDispIay(Void)(uchars,sl;ucharm,ml;ucharh,hl;si=second/10;十位s=second-(si*10);个位si+=48;加上48等于其对应的ASCII码s+=48;DisplChar(ll,lfsO);if(psl!=si)(psi=si;DisplChar(10,l,sl);if(pmin!=minute)pmin=minute;ml=minute/10;m=minute-(ml*10);ml+=48;m+=48;DisplChar(7,l,ml);DiSPlChar(8,LmO);)if(phour!=hour)(phour=hour;hl=hour/10;h=hour-(hl*10);hl+=48;h+=48;DiSPlChar(4,Lh1);DisplChar(5,l,hO);voidClock(void);voidDispIay(Void);#include<msp430×14x.h>#include"cryl602.h"typedefunsignedcharuchar;typedefunsignedintuint;/宏定义*I#defineDataDirP2DIR#defineDataPortP20UT#defineBusy0×80#defineCtrIDirP6DIR#defineCLR_RSP6OUT&=BIT3;/RS=P3.0# defineSET.RSP6OT=BIT3;# defineCLR_RWP6OUT&=BIT4;/RW=P3.1# defineSET.RWP6OT=B4;# defineCLR_ENP6OUT&=BIT5;/EN=P3.2# defineSET_ENP6OUT=BIT5;/*函数名称:DispNchar功能:让液晶从某个位置起连续显示N个字符参数:X-位置的列坐标y-位置的行坐标n-字符个数Ptr-指向字符存放位置的指针返回值:无*/voidDispNChar(ucharx,uchary,ucharn,uchar*ptr)(uchari;for(i=0;i<n;i+)DisplChar(x+,y,ptri);if(x=OxOf)x=0;y=1;)/*函数名称:LOCateXY功能:向液晶输入显示字符位置的坐标信息参数:X-位置的列坐标y-位置的行坐标返回值:无*voidLocateXY(ucharx,uchary)uchartemp;temp=x&OxOf;y&=0x01;if(y)temp=0×40;如果在第2行temp=0x80;1.cdWriteCommand(temp,l);)/*函数名称:DisplChar功能:在某个位置显示一个字符参数:X-位置的列坐标y-位置的行坐标data-显示的字符球返回值:无*/voidDisplChar(ucharx,uchary,uchardata)1.ocateXY(×,y);1.cdWriteData(data);)/*函数名称:LCdReSet功能:对1602液晶模块进行复位操作参数:无返回值:无*/voidLcdReset(Void)(CtrIDir=0x38;控制线端口设为输出状态DataDir=OxFF;数据端口设为输出状态1.cdWriteCommand(0x38,0);规定的复位操作Delay5ms();1.cdWriteCommand(0x38,0);Delay5ms();1.cdWriteCommand(0x38,0);Delay5ms();1.CdWriteCommand(OX38,1);显示模式设置1.CdWriteCOmmand(OXO8,1);显示关闭1.cdWriteCommand(0×01,1);显示清屏1.cdWriteCommand(0x06,1);写字符时整体不移动1.cdWriteCommand(0×0c,1);显示开,不开游标,不闪烁)/*函数名称:LCdWriteCommand功能:向液晶模块写入命令参数:Cmd-命令,Chk是否判忙的标志,1:判忙,0:不判返回值:无*/voidLcdWriteCommand(ucharcmd,ucharchk)if(chk)WaitForEnabIeQ;检测忙信号?CLR_RS;CLR_RW;-NOP();DataPort=cmd;将命令字写入数据端口-NOP();SET-EN;产生使能脉冲信号-NOP();-NOP();CLR_EN;)/*函数名称:LCdWriteData功能:向液晶显示的当前地址写入显示数据参数:data-显示字符健返回值:无voidLcdWriteData(uchardata)WaitForEnabIeO;等待液晶不忙SET_RS;CLR_RW;-NOP();DataPort=data;将显示期居写入数据端口-NOP();SET_EN;产生使能脉冲信号-NOP();-NOP();CLR_EN;)/*函数名称:WaitForEnabIe功能:等待1602液晶完成内部操作I*:*/voidWaitForEnabIe(Void)(P2DIR&=0x00;将P4口切换为输入状态CLR_RS;SET.RW;-NOP();SET.EN;-NOP();-NOP();while(P2IN&Busy)!=O);检测忙标志CLR_EN;P2DIR=OxFF;»P4口切换为输出状态函数名称:DeIaySms功能:延时约5ms参数:无返回值:无*voidDeIaySms(Void)(uinti=40000;while(i!=O)(i-;)/*函数名称:Delay400ms功能:延时约400ms*/voidDelay400ms(void)(uchari=50;uintj;while(i-)(j=7269;while(j-);)voidDispNChar(unsignedcharx,unsignedchary,unsignedcharn,unsignedchar*ptr);voidLocateXY(unsignedcharx,unsignedchary);voidDisplChar(unsignedchar×,unsignedchary,unsignedchardata);voidLcdReset(void);voidLcdWriteCommand(unsignedcharcmd,unsignedcharchk);voidLcdWriteData(unsignedchardata);voidWaitForEnabIe(Void);voidDelay5ms(void);voidDelay400ms(void);第二段程序#include<msp430×14×.h>typedefunsignedcharuchar;typedefunsignedintuint;/unsignedcharuchar;/unsignedintuint;/*全局变量*/ucharkey_Pressed;按键是否被按下:1-是,O-否ucharkey,val;/得放键值ucharkey.Flag;按键是否已放开:1-是,O-否设置键盘逻辑键值与程序计算键值的映射ucharkey_Map=l,2f3A5,6,7,8,9,10,11,12,13,14,15,16);,*函数名称:InikKeyPad功能:初始化扫描键盘的IO端口参数:无返回值:无*/voidInit_Keypad(void)(PlDIR=OxfO;/P1.0-P1.3设置为输入状态,P1.4P1.7设置为输出状态P10T=OxfO;/P1.4-P1.7输出高电平key_Flag=0;key_Pressed=0;key_val=0;)/*CheCk.Key(),检查按键,确认键值*/*函数名称:Check.Key功能:扫描键盘的IO端口,获得键值参数:无返回值:无voidCheck_Key(void)(ucharrow,col,tmpl,tmp2;tmpl=0x80;for(row=0;row<4;row+)(PlOUT=OxfO;PlOUT-=tmpl;tmpl>>=1;if(PlIN&OxOf)<OxOf)tmp2=0x01;行扫描P1.4P1.7 输出全 1/P1.4-pl.7输出四位中有一个为0是否PUN的P1.0P1.3中有T立为0/tmp2用于检测出那一位为0列检测for(col=0;col<4;col+)if(PUN&tmp2)=OxOO)是否是该列,等于。为是key_val=key_Maprow*4+col;/获取键值return;退出循环)tmp2<<=1;/tmp2右移1位)/*函数名称:delay功能:延时约15ms,完成消抖功能参数:无返回值:无voiddelay()uinttmp;for(tmp=12000;tmp>0;tmp);)/*函数名称:Key-Event功能:检测按键,并获取键值参数:无返回值:无*/voidKey_Event(void)(uchartmp;PlOUT&二0x00;/设置PlOUT全为0,等待按键输入tmp=PlIN;/获取plINif(key,Pressed=0x00)&&(tmp&OxOf)<OXOf)如果有键按下(key,Pressed=1;/如果有按键按下,设置key_Pressed标识delayO;消除抖动Check,KeyO;/调用CheCk_Key(),获取键值elseif(key,Pressed=l)&&(tmp&OxOf)=OXOf)如果按键已经释放key_Pressed=0;/清除key_Pressed标识key_Flag=1;/设置key_Flag标识else,NOP();/#include<msp430×44x.h>#include"cryl602.h"/全局变量*/ucharsecond,minute,hour,hourO;/¾!分、时变量ucharpmin,phour,psl;辅助计算变量/*函数名称:Clock功能:计算当前时间参数:无返回值:无说明:本函数对本文件开头定义的second,minute,hour,hourO四个全局变量进行操作*/voidClock(void)(second-=1;/second<=60&second>=0;/minute<=60&minute>=0;/hour<=1008ihour>=0;if(second=0)second=60;minute-=1;if(minute=0)(minute=60;hour-=1;hourO-=1;if(hour=0)hour=24;)/voidClock(void)/second-=1;/second<=60&second>=0;/minute<=60&minute>=0;/hour<=1008ihour>=0;/if(second=60)/second=0;/minute-=1;/if(minute=60)/minute=0;/hour-=1;hourO-=1;/if(hour=24)hour=0;/)/)/)/*函数名称:Display功能:在1602液晶上显示时间参数:无返回值:无说明:本函数对本文件开头定义的全局变量进行操作/voidDispIay(Void)uchars,sl;ucharm,ml;ucharh,hl;si=second/10;十位s=second-(si*10);个位si+=48;加上48等于其对应的ASCII码s+=48;DisplChar(ll,l,sO);if(psl!=Sl)(psi=si;DisplChar(10,l,sl);if(pmin!=minute)pmin=minute;ml=minute/10;m=minute-(ml*10);ml+=48;m+=48;DisplChar(7,l,ml);DisplChar(8,l,mO);)if(phour!=hour)(phour=hour;hl=hour/10;h=hour-(hl*10);hl+=48;h+=48;DisplChar(4,l,hl);DisplChar(5,l,hO);)voidClock(void);voidDispIay(Void);#include<msp430×14x.h>#include"cryl602.h"typedefunsignedcharuchar;typedefunsignedintuint;*宏定义*#defineDataDirP2DIR#defineDataPortP20UT#defineBusy0×80# defineCtrIDirP6DIRP3.0P3.1# defineCLR_RSP60UT&=BIT3;/RS# defineSET_RSP6OT=BIT3;# defineCLR_RWP6OUT&=-BIT4;/RW#defineSET_RWP6OT=B4;#defineCLR_ENP60UT&二BIT5;EN=P3.2#defineSET_ENP6OT=BIT5;/*函数名称:DispNchar功能:让液晶从某个位置起连续显示N个字符参数:X-位置的列坐标y-位置的行坐标n-字符个数ptr-指向字符存放位置的指针返回值:无*/voidDispNChar(ucharx,uchary,ucharn,uchar*ptr)(uchari;for(i=0;i<n;i+)(DisplChar(x+,y,ptri);if(×=OxOf)x=0;y=1;)/*函数名称:LOCateXY功能:向液晶输入显示字符位置的坐标信息参数:X-位置的列坐标y-位置的行坐标返回值:无voidLocateXY(ucharx,uchary)(uchartemp;temp=x&OxOf;y&=0x01;if(y)temp=0x40;如果在第2行temp=0x80;1.cdWriteCommand(temp,l);)/*函数名称:DisplChar功能:在某个位置显示一个字符参数:X-位置的列坐标y-位置的行坐标data-显示的字符球返回值:无*/voidDisplChar(ucharx,uchary,uchardata)(1.ocateXY(×,y);1.cdWriteData(data);)/*函数名称:LCdReSet功能:对1602液晶模块进行复位操作参数:无返回值:无*/voidLcdReset(Void)(CtrIDir=0x38;控制线端口设为输出状态DataDir=OxFF;数据端口设为输出状态1.cdWriteCommand(0x38,0);规定的复位操作Delay5ms();1.cdWriteCommand(0x38,0);Delay5ms();1.cdWriteCommand(0x38,0);Delay5ms();1.CdWriteCOmmand(OX38,1);显示模式设置1.CdWriteCommand(OXO8,1);显示关闭1.cdWriteCommand(0×01,1);显示清屏1.cdWriteCommand(0×06,1);写字符时整体不移动1.cdWriteCommand(0×0c,1);显示开,不开游标,不闪烁)/*函数名称:LCdWriteCommand功能:向液晶模块写入命令参数:Cmd-命令,Chk是否判忙的标志,1:判忙,O:不判返回值:无*/voidLcdWriteCommand(ucharcmd,ucharchk)(if(chk)WaitForEnabIeO;检测忙信号?CLR_RS;CLR_RW;-NOP();DataPort=cmd;将命令字写入数据端口-N0P();SET-EN;产生使能脉冲信号-NOP();-NOP();CLR_EN;)/*函数名称:LCdWriteData功能:向液晶显示的当前地址写入显示数据参数:data-显示字符健返回值:无*/voidLcdWriteData(uchardata)(WaitForEnabIeO;等待液晶不忙SET_RS;CLR_RW;-NOP();DataPort=data;将显示期居写入数据端口-NOP();SET_EN;产生使能脉冲信号-NOP();-NOP();CLR_EN;)/*函数名称:WaitForEnabIe功能:等待1602液晶完成内部操作参数:无返回值:无/voidWaitForEnabIe(Void)P2DIR&=0x00;将P4口切换为输入状态CLR_RS;SET.RW;-NOP();SET_EN;-NOP();-NOP();while(P2IN&Busy)!=0);检测忙标志CLR_EN;P2DIR=OxFF;»P4口切换为输出状态)/*函数名称:Delay5ms功能:延时约5ms参数:无返回值:无voidDeIaySms(Void)(uinti=40000;while(i!=0)(i-;)/*函数名称:Delay400ms功能:延时约400ms参数:无返回值:无voidDelay400ms(void)uchari=50;uintj;while(i-)(j=7269;while(j-);)voidDispNChar(unsignedcharx,unsignedchary,unsignedcharn,unsignedchar*ptr);voidLocateXY(unsignedcharx,unsignedchary);voidDis