MSP430F149IPM单片机液晶显示时间的程序.docx

上传人:夺命阿水 文档编号:929280 上传时间:2024-01-18 格式:DOCX 页数:67 大小:125.31KB
返回 下载 相关 举报
MSP430F149IPM单片机液晶显示时间的程序.docx_第1页
第1页 / 共67页
MSP430F149IPM单片机液晶显示时间的程序.docx_第2页
第2页 / 共67页
MSP430F149IPM单片机液晶显示时间的程序.docx_第3页
第3页 / 共67页
MSP430F149IPM单片机液晶显示时间的程序.docx_第4页
第4页 / 共67页
MSP430F149IPM单片机液晶显示时间的程序.docx_第5页
第5页 / 共67页
点击查看更多>>
资源描述

《MSP430F149IPM单片机液晶显示时间的程序.docx》由会员分享,可在线阅读,更多相关《MSP430F149IPM单片机液晶显示时间的程序.docx(67页珍藏版)》请在课桌文档上搜索。

1、通过232串口设置MSP430F149IPM单片机液晶显下时间的程序下面介绍一段通过232串口设置MSP430F149IPM单片机液晶显示时间的程序。用户通过串口发送OXOLOXO2,0X03,0X04可以改变单片机液晶显示时间,当到达一定设置时间时,单片机P2端口输出7路高电平,1路低电平,第二段程序,可以从单片机按键像计算机232串口发送OXOO,同时单片机液晶屏显示时间。MSP430单片机电路如下,程序通过IAR430V5.3软件编译通过,生成文件,使用BSL下载软件-MSP430BSL通过USB端口把.TXT文件烧写到单片机中。程序和电路可以在下面的网址下载:链接:https:/pan

2、.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#incl

3、udecryl602.h#includeclock.h#includecryl602.c#includeclock.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;P1

4、0UT=OXFF;P2DIR=0XFF;P2OUT=OXFF;P3DIR=0XFF;P3OUT=OXFF;P4DIR=0XFF;P4OUT=OXFF;P5DIR=0XFF;P5OUT=OXFF;P6DIR=0XFF;P6OUT=OXFF;WDTCTL=WDTPWWDTHOLD;关闭看门狗/P6DIR=BIT2;P6OUTI=BlT2;关闭电平转换/P6DIR=BIT6;P6OUT&=BIT6;关闭电平转换P3SEL=0x30;MEl=UTXEO+URXEO;UCTLO=CHAR;UTCTLO=SSELO;UBROO=003;UBRlO=0x00;UMCTLO=04A;UCTLO&二-SWRST

5、;正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,

6、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);等待以前的字符发送完

7、毕/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(RBUF0=0x03)如果是第T按键被按下(second=34;minute=ll;hour=

8、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=080;SetTime(33,33,11);if(keyin=Oxbf)如果是第一个按键被按下(delay();if(keyin

9、=Obf)(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;tmp0;tmp);)/*函数名称:UARTO_RXISR功能:UARTO的接收中断服务函数,在这里唤醒CPU,使它退出低功耗模式参数:无返回值:

10、无*/#pragmavector=UARTORX.VECTOR_interruptvoidUARTO_RXISR(void)(1.PM1_EXIT;退出低功耗模式)/#include#includecryl602.h/全局变量*/ucharsecond,minute,hour,hourO;/!s分、时变量ucharpmin,phour,psl;辅助计算变量函数名称:Clock功能:计算当前时间参数:无返回值:无说明:本函数对本文件开头定义的second,minute,hour,hourO四个全局变量进行操作I*:*/voidCIock(Void)second-=1;/second=O;/min

11、ute=0;/hour=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=0;/minute=0;/hour=0;/if(second=60)/second=0;/minute-=1;/if(minute=60)/minute=0;/hour-=1;hourO-=1;/if(hour=24)hour=0;/)/)/)/*函数名称:Display功能:在1602液晶上显示时间参数:无返回值:

12、无说明:本函数对本文件开头定义的全局变量进行操作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);)i

13、f(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#includecryl602.htypedefunsignedcharuchar;typedefunsignedintuint;/宏定义*I#defineDataDirP2DIR#defineDataPortP20UT#defineBusy080#defineCtrIDirP6DIR#defineCLR_RSP6

14、OUT&=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

15、;in;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=040;如果在第2行temp=0x80;1.cdWriteCommand(temp,l);)/*函数名称:DisplChar功能:在某个位置显示一个字符参数:X-位置的列坐标y-位置的行坐标data-显示的字符球返回值:无*/voidDisplChar(

16、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

17、(OX38,1);显示模式设置1.CdWriteCOmmand(OXO8,1);显示关闭1.cdWriteCommand(001,1);显示清屏1.cdWriteCommand(0x06,1);写字符时整体不移动1.cdWriteCommand(00c,1);显示开,不开游标,不闪烁)/*函数名称:LCdWriteCommand功能:向液晶模块写入命令参数:Cmd-命令,Chk是否判忙的标志,1:判忙,0:不判返回值:无*/voidLcdWriteCommand(ucharcmd,ucharchk)if(chk)WaitForEnabIeQ;检测忙信号?CLR_RS;CLR_RW;-NOP()

18、;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

19、*:*/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

20、-)(j=7269;while(j-);)voidDispNChar(unsignedcharx,unsignedchary,unsignedcharn,unsignedchar*ptr);voidLocateXY(unsignedcharx,unsignedchary);voidDisplChar(unsignedchar,unsignedchary,unsignedchardata);voidLcdReset(void);voidLcdWriteCommand(unsignedcharcmd,unsignedcharchk);voidLcdWriteData(unsignedchardat

21、a);voidWaitForEnabIe(Void);voidDelay5ms(void);voidDelay400ms(void);第二段程序#includetypedefunsignedcharuchar;typedefunsignedintuint;/unsignedcharuchar;/unsignedintuint;/*全局变量*/ucharkey_Pressed;按键是否被按下:1-是,O-否ucharkey,val;/得放键值ucharkey.Flag;按键是否已放开:1-是,O-否设置键盘逻辑键值与程序计算键值的映射ucharkey_Map=l,2f3A5,6,7,8,9,10

22、,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;t

23、mpl=0x80;for(row=0;row=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;col4;col+)if(PUN&tmp2)=OxOO)是否是该列,等于。为是key_val=key_Maprow*4+col;/获取键值return;退出循环)tmp20;tmp);)/*函数名称:Key-Event功能:检测按键,并获取键值参数:无返回值:无*/voidKey_Event(void)(uchartmp;

24、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#includecryl

25、602.h/全局变量*/ucharsecond,minute,hour,hourO;/!分、时变量ucharpmin,phour,psl;辅助计算变量/*函数名称:Clock功能:计算当前时间参数:无返回值:无说明:本函数对本文件开头定义的second,minute,hour,hourO四个全局变量进行操作*/voidClock(void)(second-=1;/second=0;/minute=0;/hour=0;if(second=0)second=60;minute-=1;if(minute=0)(minute=60;hour-=1;hourO-=1;if(hour=0)hour=24;

26、)/voidClock(void)/second-=1;/second=0;/minute=0;/hour=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);个

27、位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);)vo

28、idClock(void);voidDispIay(Void);#include#includecryl602.htypedefunsignedcharuchar;typedefunsignedintuint;*宏定义*#defineDataDirP2DIR#defineDataPortP20UT#defineBusy080# defineCtrIDirP6DIRP3.0P3.1# defineCLR_RSP60UT&=BIT3;/RS# defineSET_RSP6OT=BIT3;# defineCLR_RWP6OUT&=-BIT4;/RW#defineSET_RWP6OT=B4;#defi

29、neCLR_ENP60UT&二BIT5;EN=P3.2#defineSET_ENP6OT=BIT5;/*函数名称:DispNchar功能:让液晶从某个位置起连续显示N个字符参数:X-位置的列坐标y-位置的行坐标n-字符个数ptr-指向字符存放位置的指针返回值:无*/voidDispNChar(ucharx,uchary,ucharn,uchar*ptr)(uchari;for(i=0;in;i+)(DisplChar(x+,y,ptri);if(=OxOf)x=0;y=1;)/*函数名称:LOCateXY功能:向液晶输入显示字符位置的坐标信息参数:X-位置的列坐标y-位置的行坐标返回值:无vo

30、idLocateXY(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液晶模块进行复位操作参数:无返回值:无*/vo

31、idLcdReset(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(001,1);显示清屏1.cdWriteCommand(006,1);写字符时整体不移动

32、1.cdWriteCommand(00c,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功能:向液晶显示的当前地址写入显示数

33、据参数: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

34、(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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 在线阅读 > 生活休闲


备案号:宁ICP备20000045号-1

经营许可证:宁B2-20210002

宁公网安备 64010402000986号