LETS GO DIY设计+ 基于Launchpad的爱情万年历Word文档下载推荐.docx

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

LETS GO DIY设计+ 基于Launchpad的爱情万年历Word文档下载推荐.docx

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

LETS GO DIY设计+ 基于Launchpad的爱情万年历Word文档下载推荐.docx

jww();

//如果是3月7号则显示不同的画面(jww是处理函数)

update_disbuf();

//更新LCD1602显示空间(在2553中开辟)

display();

//控制LCD1602显示时间

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

数据线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);

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);

//读取星期

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

break;

if(i>

7)

i=0;

write_command(0x0c);

//关闭光标显示

P2IFG=0;

//软件复位标志

while(!

BIT6))

BIT7))//如果按键2被按下

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

{case0:

//显示自定义的语句

for(j=0;

j<

16;

j++)

{

dis_buf1[j]=weiwei1[j];

dis_buf2[j]=weiwei2[j];

display();

}

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

BIT7))

//此时处理全局变量month

month++;

if(month>

0x12)

month=1;

if((month&

0x09)

{month+=0x10;

month&

ds1302_Write(write_month,month);

month=ds1302_Read(read_month);

//更新显示字符

//此时处理全局变量date

date++;

if((date>

month==0x02)

||(month==0x04||month==0x06||month==0x09||month==0x11)&

date>

0x30

||date>

0x31)

date=0x01;

if((date&

{date+=0x10;

date&

ds1302_Write(write_date,date);

date=ds1302_Read(read_date);

//此时处理全局变量day

n++;

if(n>

0x07)

n=1;

ds1302_Write(write_day,n);

n=ds1302_Read(read_day);

//此时处理全局变量hour

hour++;

if(hour>

0x23)

hour=0;

if((hour&

{hour+=0x10;

hour&

ds1302_Write(write_hour,hour);

hour=ds1302_R

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

当前位置:首页 > 高中教育 > 其它课程

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

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