基于Launchpad爱情万年历.docx

上传人:b****6 文档编号:8178371 上传时间:2023-01-29 格式:DOCX 页数:18 大小:80.71KB
下载 相关 举报
基于Launchpad爱情万年历.docx_第1页
第1页 / 共18页
基于Launchpad爱情万年历.docx_第2页
第2页 / 共18页
基于Launchpad爱情万年历.docx_第3页
第3页 / 共18页
基于Launchpad爱情万年历.docx_第4页
第4页 / 共18页
基于Launchpad爱情万年历.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

基于Launchpad爱情万年历.docx

《基于Launchpad爱情万年历.docx》由会员分享,可在线阅读,更多相关《基于Launchpad爱情万年历.docx(18页珍藏版)》请在冰豆网上搜索。

基于Launchpad爱情万年历.docx

基于Launchpad爱情万年历

本来是在准备重庆市TI电子设计大赛,这块launchpad的板子也是自己买的。

学习过程中越来越感觉得到launchpad的强大,一边学一边做东西,做到万年历的时候花了三天时间,终于调试成功,心里那个美啊。

后来想到女朋友在培训不在身边,就有了制作这个万年历的想法。

一、首先说一下硬件:

1、launchpad开发板一块<板载MSP430G2553)

2、LCD1602液晶屏一块<3.3V)

3、DS1302数字时钟芯片

4、32.768KHz晶振一枚

5、按键两枚

6、电位器一枚

7、电容、导线等

二、要实现的功能:

1、精确显示年月日时分秒

2、闰年、二月自动调节时间

3、两个按键控制调节时间日期等

4、显示自定义的语句

5、恋爱纪念日提醒,显示不一样的画面

三、硬件电路图

四、整体思路

//设置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(>。

//初始化LCD1602

ds1302_init(>。

//初始化DS1302

while(1>

{

_DINT(>。

//关闭中断

data_pro(>。

//从DS1302中读取并处理数据

_EINT(>。

if(month==0x03&&date==0x07>//3月7日是我们的纪念日

jww(>。

//如果是3月7号则显示不同的画面

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代表星期几

#include

#include

//定义全局变量年月日时分秒

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输入是否忙碌

P1DIR=0xff。

e_0。

returnbusyc。

}

//向LCD1602写字节命令

voidwrite_command(charcommand>

{

while(busy(>>。

//判断LCD是否忙碌

rs_0。

rw_0。

P1OUT=command。

__delay_cycles(1>。

//时间间隔MIN=30nS

e_1。

__delay_cycles(1>。

//MIN=150nS

e_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。

s<8。

s++>

{if(temp&0x01>//从低位开始传输数据

{SDA_1。

}

else

SDA_0。

SCLK_1。

//上升沿锁存数据

temp=temp>>1。

//数据右移一位为下次输出做准备

SCLK_0。

//为下一次做准备

}

}

//从DS1302读取8位数据

chards1302_Rbyte(>

{

charu,temp。

P2DIR&=~BIT4。

for(u=8。

u>0。

u-->

{

temp=temp>>1。

temp+=(P2IN&BIT4><<3。

SCLK_1。

SCLK_0。

}

P2DIR|=BIT4。

return(temp>。

}

//向DS1302写入地址然后读取数据

chards1302_Read(charcmd>

{

chardat。

RST_0。

//初始化RST为低

SCLK_0。

//SLK=0

RST_1。

//开始传输数据

ds1302_Wbyte(cmd>。

//传输命令字,写入要读取的时间、日期地址

dat=ds1302_Rbyte(>。

//读取八位数据

RST_0。

//结束数据传输

SCLK_0。

//拉高时钟线

return(dat>。

}

//向DS1302写入地址后写入数据

voidds1302_Write(charcmd,chardat>

{

RST_0。

SCLK_0。

//在RST的上升沿,SCLK必须为0

RST_1。

//开始传输数据

ds1302_Wbyte(cmd>。

//写入要修改的地址

ds1302_Wbyte(dat>。

//写入数据

SCLK_1。

//拉高时钟线

RST_0。

//拉低RST

}

//初始化DS1302的程序

voidds1302_init(void>

{

ds1302_Write(write_protect,0x00>。

//关闭写保护

ds1302_Write(write_second,0x00>。

//初始化秒为00,不暂停时钟(BIT7>

ds1302_Write(write_minute,0x59>。

//初始化分为00

ds1302_Write(write_hour,0x23>。

//初始化时为23,设置为24小时制(BIT7>

ds1302_Write(write_date,0x01>。

//初始化日期为01

ds1302_Write(write_month,0x01>。

//初始化月为01

ds1302_Write(write_year,0x12>。

//初始化年为(20>12

ds1302_Write(write_day,0x07>。

//周日

ds1302_Write(write_power,0x0a5>。

//一个二极管压降,电阻4K

ds1302_Write(write_protect,0x80>。

//打开写保护

}

//DS1302数据处理函数,此函数将个位、十位分别用char表示,方便用数码管显示

voiddata_pro(void>

{

ds1302_Write(write_protect,0x00>。

//关闭写保护

date=ds1302_Read(read_date>。

//读取日

if(date>0x29&&month==0x02>//如果调时时2月超过29

{ds1302_Write(write_date,0x01>。

date=ds1302_Read(read_date>。

ds1302_Write(write_month,month+1>。

}

month=ds1302_Read(read_month>。

//读取月

year=ds1302_Read(read_year>。

//读取年

hour=ds1302_Read(read_hour>。

//读取时

hour=hour&0x3f。

//屏蔽掉前两位

minute=ds1302_Read(read_minute>。

//读取分

second=ds1302_Read(read_second>。

//读取秒

n=ds1302_Read(read_day>。

//读取星期

ds1302_Write(write_protect,0x80>。

//打开写保护

}

//按键中断处理程序(使用grace配置>

voidkey_pro(void>

{

charj。

//用于复制自定义的显示计数<16个)

__delay_cycles(8000>。

//延时去抖动

if(!

(P2IN&BIT6>>//判断是否有按键按下

{

i++。

switch(i>

{

case1:

write_command(0x83>。

//显示光标到年

write_command(0x0f>。

break。

case2:

write_command(0x86>。

//显示光标到月

write_command(0x0f>。

break。

case3:

write_command(0x89>。

//显示光标到日

write_command(0x0f>。

break。

case4:

write_command(0x8f>。

//显示光标到周

write_command(0x0f>。

break。

case5:

write_command(0xc9>。

//显示光标到时

write_command(0x0f>。

break。

case6:

write_command(0xcc>。

//显示光标到分

write_command(0x0f>。

break。

case7:

write_command(0xcf>。

//显示光标到秒

write_command(0x0f>。

break。

default:

break。

}

}

if(i>7>

{

i=0。

write_command(0x0c>。

//关闭光标显示

}

P2IFG=0。

//软件复位标志

while(!

(P2IN&BIT6>>

{

ds1302_Write(write_protect,0x00>。

//关闭写保护

while(!

(P2IN&BIT7>>//如果按键2被按下

{

switch(i>//根据i的值来确定某变量进行加1

{case0:

//显示自定义的语句

for(j=0。

j<16。

j++>

{

dis_buf1[j]=weiwei1[j]。

dis_buf2[j]=weiwei2[j]。

display(>。

}

break。

case1:

//此事处理全局变量year

year++。

//year加1

if(year>0x99>//如果year大于99则置0

year=0。

if((year&0x0f>>0x09>//如果year低四位大于9<第四位BCD码表示个位),十位加1,个位置0

{year+=0x10。

year&=0xf0。

}

ds1302_Write(write_year,year>。

//将变化后的year写入DS1302

year=ds1302_Read(read_year>。

//读出来year显示<使调节year时同步变化,为了人性化)

update_disbuf(>。

//更新显示字符

while(!

(P2IN&BIT7>>

display(>。

break。

case2:

//此时处理全局变量month

month++。

if(month>0x12>

month=1。

if((month&0x0f>>0x09>

{month+=0x10。

month&=0xf0。

}

ds1302_Write(write_month,month>。

month=ds1302_Read(read_month>。

update_disbuf(>。

//更新显示字符

while(!

(P2IN&BIT7>>

display(>。

break。

case3:

//此时处理全局变量date

date++。

if((date>0x29&&month==0x02>

||(month==0x04||month==0x06||month==0x09||month==0x11>&&date>0x30

||date>0x31>

date=0x01。

if((date&0x0f>>0x09>

{date+=0x10。

date&=0xf0。

}

ds1302_Write(write_date,date>。

date=ds1302_Read(read_date>。

update_disbuf(>。

//更新显示字符

while(!

(P2IN&BIT7>>

display(>。

break。

case4:

//此时处理全局变量day

n++。

if(n>0x07>

n=1。

ds1302_Write(write_day,n>。

n=ds1302_Read(read_day>。

update_disbuf(>。

//更新显示字符

while(!

(P2IN&BIT7>>

display(>。

break。

case5:

//此时处理全局变量hour

hour++。

if(hour>0x23>

hour=0。

if((hour&0x0f>>0x09>

{hour+=0x10。

hour&=0xf0。

}

ds1302_Write(write_hour,hour>。

hour=ds1302_Read(read_hour>。

update_disbuf(>。

//更新显示字符

while(!

(P2IN&BIT7>>

display(>。

break。

case6:

//此时处理全局变量minute

minute++。

if(minute>0x59>

minute=0。

if((minute&0x0f>>0x09>

{minute+=0x10。

minute&=0xf0。

}

ds1302_Write(write_minute,minute>。

minute=ds1302_Read(read_minute>。

update_disbuf(>。

//更新显示字符

while(!

(P2IN&BIT7>>

display(>。

break。

case7:

//此时处理全局变量second

second++。

if(second>0x59>

second=0。

if((second&0x0f>>0x09>

{second+=0x10。

second&=0xf0。

}

ds1302_Write(write_second,second>。

second=ds1302_Read(read_second>。

update_disbuf(>。

//更新显示字符

while(!

(P2IN&BIT7>>

display(>。

break。

default:

break。

}

}

ds1302_Write(write_protect,0x80>。

//打开写保护

}

}

//纪念日处理程序

voidjww(void>

{charww_xx。

for(ww_xx=0。

ww_xx<16。

ww_xx++>

{

dis_buf1[ww_xx]=love1[ww_xx]。

dis_buf2[ww_xx]=love2[ww_xx]。

}

love_years=year-0x11。

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

当前位置:首页 > 工程科技 > 城乡园林规划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1