万年历文档格式.docx

上传人:b****5 文档编号:17647562 上传时间:2022-12-07 格式:DOCX 页数:22 大小:118.34KB
下载 相关 举报
万年历文档格式.docx_第1页
第1页 / 共22页
万年历文档格式.docx_第2页
第2页 / 共22页
万年历文档格式.docx_第3页
第3页 / 共22页
万年历文档格式.docx_第4页
第4页 / 共22页
万年历文档格式.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

万年历文档格式.docx

《万年历文档格式.docx》由会员分享,可在线阅读,更多相关《万年历文档格式.docx(22页珍藏版)》请在冰豆网上搜索。

万年历文档格式.docx

7

3.7定时器以及判断进位信号中断函数:

8

4程序运行界面9

4.1初始化程序9

4.2按键“控制更改”界面:

9

4.3晶振信号10

5小结与体会10

6参考文献10

7.源程序:

11

摘要

本课程设计是利用LCD以及51单片机仿真设计万年历。

利用简单的调用定时器,将时间程序通过LCD输出;

以及调用扫描信号更改时间日期。

此万年历显示程序设计利用inti0中断进行定时器扫描,在调用一个m计数器进行累加,在达到1秒后,进行miao显示,然后利用if语句判断60秒后分,以及时,日期的情况。

初始化程序显示一个table数组,进行LCD初始化,然后调用扫描信号,并且利用扫描计数器keynum进行判断是更改时分秒还是日期。

在计数器达到7次之后,返回正常显示。

关键字:

LCD显示,扫描信号,定时器。

1问题定义

1.1设计思想

程序设计目的即显示万年历,并且可以通过人工的进行控制,调节显示的时间,日期。

为了使得程序更加简便,便进行循环调用扫描信号,进行调节时间,以及多次调用if语句进行“进位”判断。

1.2运行环境

1、硬件环境:

微型计算机一台。

2、软件环境:

WindowsXP操作系统,keilC,Proteus仿真

3、序设计语言:

C语言

2需求分析

2.1文本编辑程序要实现的基本功能

设计一个万年历显示程序,并且可以进行人为调节显示时间。

通过调用循环扫描信号,判断是否按键按下,然后再利用计数器,判断按键按下的次数对应的是更改哪一位数据,比如:

keynum=1即更改miao信号,keynum=2即更改fen信号;

然后再利用if语句判断是按下K2还是K3键,进行增加或者减少。

在增加或减少的时候还得进行范围的判,比如miao信号不能增加超过59,也不能减少超过0。

.

2.2算法以及仿真描述

利用C语言设计,先进行初始化定义,定义P1.0口为“选择”信号,P1.1口作为“增加”;

P1.2口作为“减少”信号。

用51的P0口作为连接LCD信号,连接一排上拉电阻,实现数据传输。

RST接复位键,1819口接晶振。

2.3设计框图

LCD显示

晶振以及复位

89C51

控制扫描按键

3程序模块设计

sbitrs=P2^0;

sbitrw=P2^1;

sbitlcden=P2^2;

sbitk1=P1^0;

sbitk2=P1^1;

sbitk3=P1^2;

ucharcodetable[]={"

2011-04-21"

};

ucharcodetable1[]={"

***11:

45:

05***"

ucharm,keynum=0;

charmiao=0;

charshi=11;

charfen=45;

charri=21;

charyue=4;

charnian=11;

voidini()//初始化函数

{uchari;

k1=k2=k3=1;

rw=0;

lcden=0;

write_com(0x38);

write_com(0x0c);

write_com(0x06);

write_com(0x80);

for(i=0;

i<

10;

i++)

{

write_dat(table[i]);

delay(5);

}

write_com(0x80+0x40);

15;

write_dat(table1[i]);

//读入寄存器数据

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

IE=0x82;

TCON=0x10;

}

voiddisplay_sj(uchardat,ucharpos)//时间显示函数

{ucharge,shi;

shi=dat/10;

ge=dat%10;

write_com(0x80+0x40+pos);

write_dat(0x30+shi);

write_dat(0x30+ge);

}

voidwrite_com(ucharcom)//写指令程序找到光标地址

{rs=0;

P0=com;

lcden=1;

voidwrite_dat(uchardat)//写数据指令,将更改数据写入寄存器

{rs=1;

P0=dat;

voidkeyscan()//扫描信号

{if(k1==0)

{delay(5);

//防抖动

if(k1==0)

{while(!

k1);

TR0=0;

keynum++;

if(keynum==1)

{//第一次为找到miao位置

write_com(0x80+0x40+7);

write_com(0x0f);

}

if(keynum==2)//第二次找到fen分支

{

write_com(0x80+0x40+4);

if(keynum==3)//第三次找到shi位置

write_com(0x80+0x40+1);

if(keynum==4)//第四次找到ri位置

{

write_com(0x80+9);

}

if(keynum==5)//第五次找到yue位置

write_com(0x80+6);

if(keynum==6)//第六次找到nian位置

write_com(0x80+3);

if(keynum==7)//第七次返回正常显示

{keynum=0;

TR0=1;

write_com(0x0c);

}}

voidt0()interrupt1

{//定时器秒十分年月是

m++;

if(m==17)

{m=0;

miao=miao+1;

if(miao==60)

{miao=0;

fen++;

if(fen==60)

{fen=0;

shi++;

if(shi==24)

{shi=0;

ri++;

if(ri==30)

{ri=0;

yue++;

if(yue==12)

{yue=0;

nian++;

display_rq(nian,4);

}

display_rq(yue,7);

display_rq(ri,10);

display_sj(shi,3);

}

display_sj(fen,6);

}

display_sj(miao,9);

//write_com(0x0c);

4程序运行界面

4.1初始化程序

4.3晶振信号

5小结与体会

通过这2周时间的课程设计,首先是从整体上重新认识了LCD的设计过程,比如它相对于数码管的优越性,比如它不需要驱动信号,可以直接从处理芯片中将数据显示出,中间只需要找好正确的对应位置。

其次就是它的容易实现,在程序控制过程中,只需选择需要的模式即可将数据从LCD上显示。

自己在设计过程所遇到的问题:

在初始化显示过程中不能够将初始化定义的二个数组table表与定时器的秒增加信号进行同步,在多次与王老师的请教过程中,利用变量进行值得传输,单独定义了miaofen...变量,这样就可以将定时器增加的值与初始化的值进行同步。

6参考文献

[1]《例说51单片机C语言版》,张义和,人民邮电出版社,2002

[2]《单片机C语言编程与实例》,赵亮,人民邮电出版社,2005

#include<

reg52.h>

#defineucharunsignedchar

#defineuintunsignedint

voiddelay(ucharx)//延时程序

{uchary;

while(x--)

for(y=110;

y>

0;

y--);

{

rs=0;

}

rs=1;

{

uchari;

voiddisplay_rq(uchardat,ucharpos)//日期显示函数

write_com(0x80+pos);

if(k1==0)

delay(5);

{//第一次为找到miao位置

if(keynum==2)//第二次找到fen分支

if(keynum==3)//第三次找到shi位置

if(keynum==4)//第四次找到ri位置

if(keynum==5)//第五次找到yue位置

{write_com(0x80+6);

}

if(keynum!

=0)

{

if(keynum==1)//更改miao

{

if(k2==0)

{delay(5);

if(k2==0)

{while(!

k2);

miao++;

if(miao==60)

miao=0;

display_sj(miao,6);

write_com(0x80+0x40+7);

write_com(0x0f);

if(k3==0)

{

delay(5);

if(k3==0)

k3);

miao--;

if(miao==-1)

miao=59;

if(keynum==2)//更改fen

if(k2==0)

fen++;

if(fen==60)

fen=0;

display_sj(fen,3);

write_com(0x80+0x40+4);

}}

fen--;

if(fen==-1)

fen=59;

}}}

if(keynum==3)//更改shi

shi++;

if(shi==60)

shi=0;

display_sj(shi,0);

write_com(0x80+0x40+1);

}}

shi--;

if(shi==-1)

shi=23;

if(keynum==4)//更改ri

ri++;

if(ri==30)

ri=0;

display_rq(ri,8);

ri--;

if(ri==-1)

ri=29;

if(keynum==5)//更改yue

yue++;

if(yue==12)

yue=0;

display_rq(yue,5);

yue--;

if(yue==-1)

yue=11;

if(keynum==6)

{//更改nian

nian++;

if(nian==9999)

nian=0;

display_rq(nian,2);

nian--;

if(nian==-1)

}}}}

voidmain()//主函数

ini();

while

(1)

keyscan();

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

当前位置:首页 > 外语学习 > 英语考试

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

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