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