基于Launchpad的爱情万年历

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

本来是在准备重庆市TI电子设计大赛,这块launchpad的板子也是自己买的。学习过程中越来越感觉得到launchpad的强大,一边学一边做东西,做到万年历的时候花了三天时间,终于调试成功,心里那个美啊。后来想到女朋友在培训不在身边,就有了制作这个万年历的想法。一、首先说一下硬件:1、launchpad开发板一块(板载MSP430G2553)2、LCD1602液晶屏一块(3.3V)3、DS1302数字时钟芯片4、32.768KHz晶振一枚5、按键两枚6、电位器一枚7、电容、导线等二、要实现的功能:1、精确显示年月日时分秒2、闰年、二月自动调节时间3、两个按键控制调节时间日期等4、显示自定义的语句5、恋爱纪念日提醒,显示不一样的画面(We’vebeentogetherforXXyears!)三、硬件电路图四、整体思路//设置P1口作为输出连接LCD1602的数据端D0-D7,P2.0为rs,P2.1为rw,P2.2为e(都配置为输出)作为LCD1602的控制端口。//配置P2.3为SCLK,P2.4为SDA,P2.5为RST(都配置为输出)作为DS1302的控制端//P2.6、P2.7接两个按键,配置为输入,下降沿中断,中断处理函数voidkey_pro(),P2、6接key1(控制光标),P2.7接key2,控制调节//grace配置中设置P2.0---P2.5为输出,MCLK=1MHz,关闭看门狗//在做DS1302的硬件时应该特别注意:数据线RST、SCLK、SDA一定上拉电阻,晶振添加负载电容,连接线尽量短先列写出主函数,是思路清晰点:voidmain(void){CSL_init();//初始化单片机lsd1602_init();//初始化LCD1602ds1302_init();//初始化DS1302while(1){_DINT();//关闭中断data_pro();//从DS1302中读取并处理数据_EINT();if(month==0x03&&date==0x07)//3月7日是我们的纪念日jww();//如果是3月7号则显示不同的画面(jww是处理函数)update_disbuf();//更新LCD1602显示空间(在2553中开辟)display();//控制LCD1602显示时间if(month==0x03&&date==0x07)//3月7日纪念日__delay_cycles(1000000);}}就这样很简单的思路,全部使用了子程序调用,所以看起来清晰点,下面贴出来整个函数。注释的挺多了,有什么建议或者交流的直接回复帖子。五、程序说一下阅读方法,先看懂了上边的主函数,然后对应主函数调用的子函数,一个一个来看,逐个看懂,就很简单。(有一个难点,就是按键处理。因为只用了两个按键,key1每按一次会有全局变量i增加一,控制LCD1602光标的显示位置,另外一个按键调节时间)//设置P0作为输出连接LCD1602的数据端D0-D7,P2.3为SCLK,P2.4为SDA,P2.5为RST(都配置为输出)//P2.0为rs,P2.1为rw,P2.2为e(都配置为输出)//P2.67配置为输入,下降沿中断,中断处理函数voidkey_pro(),P2。6接key1(控制光标),P2.7接key2,控制调节(增加)//grace配置中设置P2.345为输出,MCLK=1MHz,//本程序将数据用ASCII表示,方便LCD1602显示//在做DS1302的硬件时应该特别注意:数据线RST。SCLK、SDA一定上拉电阻,晶振添加负载电容,连接线尽量短//date代表日,day代表星期几#includemsp430.h#includeti/mcu/msp430/csl/CSL.h//定义全局变量年月日时分秒charyear,month,date,hour,minute,second,n;//n代表周几charlove_years;//恋爱纪念年charday[7][3]={MON,TUE,WED,THI,FRI,SAT,SUN};chari=0;//用来记录key1按下的次数chardis_buf1[16];//lcd上排显示缓冲区chardis_buf2[16];//lcd下排显示缓冲区charweiwei1[16]={weiwei:Iloveu};charweiwei2[16]={somuch!byxuxu};charlove1[16]={We'vebeentoget};charlove2[16]={herforyears};//LCD1602控制位#definers_0(P2OUT&=~BIT0)#definers_1(P2OUT|=BIT0)#definerw_0(P2OUT&=~BIT1)#definerw_1(P2OUT|=BIT1)#definee_0(P2OUT&=~BIT2)#definee_1(P2OUT|=BIT2)//DS1302控制位#defineSCLK_0(P2OUT&=~BIT3)#defineSCLK_1(P2OUT|=BIT3)#defineSDA_0(P2OUT&=~BIT4)#defineSDA_1(P2OUT|=BIT4)#defineRST_0(P2OUT&=~BIT5)#defineRST_1(P2OUT|=BIT5)#defineSDA(P2IN&=BIT4)//宏定义DS1302数据地址#definewrite_second0x80#defineread_second0x81#definewrite_minute0x82#defineread_minute0x83#definewrite_hour0x84#defineread_hour0x85#definewrite_date0x86#defineread_date0x87#definewrite_month0x88#defineread_month0x89#definewrite_year0x8c#defineread_year0x8d#definewrite_day0x8a#defineread_day0x8b#definewrite_protect0x8e#definewrite_power0x90//*******************以下为LCD1602的子函数************************////***********************************************************////查询是否忙碌(每次输入指令前都要判断液晶模块是否处于忙的状态)charbusy(void){charbusyc;rs_0;rw_1;e_1;__delay_cycles(1000);P1DIR=0x00;//P1口置为输入,读取LCD状态busyc=P1IN&BIT7;//从P1输入是否忙碌(D7高电平表示忙碌)P1DIR=0xff;e_0;returnbusyc;}//向LCD1602写字节命令voidwrite_command(charcommand){while(busy());//判断LCD是否忙碌rs_0;rw_0;P1OUT=command;__delay_cycles(1);//时间间隔MIN=30nSe_1;__delay_cycles(1);//MIN=150nSe_0;}//向LCD1602写数据命令voidwrite_data(chardata){while(busy());//判断LCD是否忙碌rs_1;rw_0;__delay_cycles(1);e_1;P1OUT=data;__delay_cycles(1);e_0;}//LCD1602初始化函数voidlsd1602_init(){e_0;write_command(0x38);__delay_cycles(15000);write_command(0x0c);write_command(0x06);write_command(0x01);}voidupdate_disbuf(){dis_buf1[0]='2';dis_buf1[1]='0';dis_buf1[2]=year/16+0x30;dis_buf1[3]=year%16+0x30;dis_buf1[4]='-';dis_buf1[5]=month/16+0x30;dis_buf1[6]=month%16+0x30;dis_buf1[7]='-';dis_buf1[8]=date/16+0x30;dis_buf1[9]=date%16+0x30;dis_buf1[10]='';dis_buf1[11]='';dis_buf1[12]='';dis_buf1[13]=day[n-1][0];dis_buf1[14]=day[n-1][1];dis_buf1[15]=day[n-1][2];dis_buf2[0]='';dis_buf2[1]='j';dis_buf2[2]='w';dis_buf2[3]='w';dis_buf2[4]='&';dis_buf2[5]='z';dis_buf2[6]='x';dis_buf2[7]='';dis_buf2[8]=hour/16+0x30;dis_buf2[9]=hour%16+0x30;dis_buf2[10]=':';dis_buf2[11]=minute/16+0x30;dis_buf2[12]=minute%16+0x30;dis_buf2[13]=':';dis_buf2[14]=second/16+0x30;dis_buf2[15]=second%16+0x30;}voiddisplay(){chart;write_command(0x80);for(t=0;t=15;t++){write_data(dis_buf1[t]);}write_command(0xc0);for(t=0;t=15;t++){write_data(dis_buf2[t]);}}//********************以下为DS1302的子函数************************////***********************************************************////向DS1302写一个字节的数据voidds1302_Wbyte(chardat){chars,temp;temp=dat;for(s=0;s8;s++){if(temp&0x01)//从低位开始传输数据{SDA_1;}elseSDA_0;SCLK_1;//上升沿锁存数据temp=temp1;//数据右移一位为下次输出做准备SCLK_0;//为下一次做准备}}//从DS1302读取8位数据chards1302_Rbyte(){charu,temp;P2DIR&=~BIT4;for(u=8;u0;u--){temp=temp1;temp+=(P2IN&BIT4)3;SCLK_1;SCLK_0;}P2DIR|=BIT4;return(temp);}//向DS1302写入地址然后读取数据chards1302_Read(charcmd){chardat;RST_0;//初始化RST为低SCLK_0;//SLK=0RST_1;//开始传输数据ds1302_Wbyte(cmd);//传输命令字,写入要读取的时间、日期地址dat=ds1302_Rbyte();//读取八位数据RST_0;//结束数据传输SCLK_0;//拉高时钟线return(dat);}//向DS1302写入地址后写入数据voidds1302_Write(charcmd,chardat){RST_0;SCLK_0;//在RST的上升沿,SCLK必须为0RST_1;//开始传输数据ds1302_Wbyte(cmd);//写入要修改的地址ds1302_Wbyte(dat);//写入数据SCLK

1 / 13
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功