基于Launchpad爱情万年历Word文档下载推荐.docx

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

基于Launchpad爱情万年历Word文档下载推荐.docx

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

基于Launchpad爱情万年历Word文档下载推荐.docx

_EINT(>

if(month==0x03&

&

date==0x07>

//3月7日是我们的纪念日

jww(>

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

jww是处理函数)

update_disbuf(>

//更新LCD1602显示空间<

在2553中开辟)

display(>

//控制LCD1602显示时间

//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显示

数据线RST。

SCLK、SDA一定上拉电阻,晶振添加负载电容,连接线尽量短

//date代表日,day代表星期几

#include<

msp430.h>

ti/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是否忙碌

rw_0。

P1OUT=command。

__delay_cycles(1>

//时间间隔MIN=30nS

//MIN=150nS

//向LCD1602写数据命令

voidwrite_data(chardata>

rs_1。

P1OUT=data。

//LCD1602初始化函数

voidlsd1602_init(>

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]='

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>

{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>

temp+=(P2IN&

BIT4>

3。

P2DIR|=BIT4。

return(temp>

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

chards1302_Read(charcmd>

chardat。

RST_0。

//初始化RST为低

//SLK=0

RST_1。

//开始传输数据

ds1302_Wbyte(cmd>

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

dat=ds1302_Rbyte(>

//读取八位数据

//结束数据传输

//拉高时钟线

return(dat>

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

voidds1302_Write(charcmd,chardat>

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

//写入要修改的地址

ds1302_Wbyte(dat>

//写入数据

//拉低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>

date=ds1302_Read(read_date>

//读取日

if(date>

0x29&

month==0x02>

//如果调时时2月超过29

{ds1302_Write(write_date,0x01>

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>

//读取星期

//按键中断处理程序(使用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>

//显示光标到月

case3:

write_command(0x89>

//显示光标到日

case4:

write_command(0x8f>

//显示光标到周

case5:

write_command(0xc9>

//显示光标到时

case6:

write_command(0xcc>

//显示光标到分

case7:

write_command(0xcf>

//显示光标到秒

default:

if(i>

7>

i=0。

//关闭光标显示

P2IFG=0。

//软件复位标志

while(!

BIT7>

//如果按键2被按下

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

{case0:

//显示自定义的语句

for(j=0。

j<

16。

j++>

dis_buf1[j]=weiwei1[j]。

dis_buf2[j]=weiwei2[j]。

//此事处理全局变量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显示<

使调节year时同步变化,为了人性化)

//更新显示字符

//此时处理全局变量month

month++。

if(month>

0x12>

month=1。

if((month&

{month+=0x10。

month&

ds1302_Write(write_month,month>

//此时处理全局变量date

date++。

if((date>

||(month==0x04||month==0x06||month==0x09||month==0x11>

date>

0x30

||date>

0x31>

date=0x01。

if((date&

{date+=0x10。

date&

ds1302_Write(write_date,date>

//此时处理全局变量day

n++。

if(n>

0x07>

n=1。

ds1302_Write(write_day,n>

//此时处理全局变量hour

hour++。

if(hour>

0x23>

hour=0。

if((hour&

{hour+=0x10。

hour&

ds1302_Write(write_hour,hour>

//此时处理全局变量minute

minute++。

if(minute>

0x59>

minute=0。

if((minute&

{minute+=0x10。

minute&

ds1302_Write(write_minute,minute>

//此时处理全局变量second

second++。

if(second>

second=0。

if((second&

{second+=0x10。

second&

ds1302_Write(write_second,second>

//纪念日处理程序

voidjww(void>

{charww_xx。

for(ww_xx=0。

ww_xx<

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