ds1302程序1602液晶显示程序.docx
- 文档编号:18459817
- 上传时间:2023-08-18
- 格式:DOCX
- 页数:20
- 大小:17.29KB
ds1302程序1602液晶显示程序.docx
《ds1302程序1602液晶显示程序.docx》由会员分享,可在线阅读,更多相关《ds1302程序1602液晶显示程序.docx(20页珍藏版)》请在冰点文库上搜索。
ds1302程序1602液晶显示程序
/*代做毕业设计全手工不重复安全过关写论文或者做板子电路设计单片机软件编程PLC控制扣扣9.1.4.0.7.8.0.9.9*/
#include
#include
/*********************************端口定义**********************************/
sbitsclk=P3^4;
sbitio=P3^3;
sbitrst=P3^5;
sbitrs=P1^0;
sbiten=P1^2;
sbitrw=P1^1;
sbitGND=P2^4;
sbitkey=P2^0;
sbitK1=P2^1;
sbitK2=P2^2;
#defineucharunsignedchar
#defineuintunsignedint
ucharS1num,flag,second,minute,hour,week,day,month,year;//秒、分、时、星期、日、月、年
bitkeyflag=0;
voiddelay(uintz)//延时子程序
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voiddelayus()
{
_nop_();
_nop_();
_nop_();
_nop_();
}
voidwrite_1602dat(uchardat)//定义一个带参数的写数据子程序
{
rs=1;//1602的rs为0时,接收命令,为1时接收数据
P0=dat;//把voidwrite_shu(ucharshu)中的COM中的数据给P0口
delay(5);
en=1;
delay(5);
en=0;
delay(5);
}
voidwrite_1602com(ucharcom)//定义一个带参数的写命令子程序
{
rs=0;//1602的rs为0时,接收命令,为1时接收数据
P0=com;//把voidwrite_com(ucharcom)中的COM中的数据给P0口
delay(5);
en=1;
delay(5);
en=0;
delay(5);
}
voidWrite1602(ucharadd,uchardat)
{
write_1602com(add);
write_1602dat(dat);
}
voidinit1602()//定义一个初始化子程序
{
en=0;
rw=0;
write_1602com(0x38);//调用write_com子程序并把0x38赋给P0口,显示模式打开
write_1602com(0x0e);//调用write_com子程序并把“开显示,显示光标,光标闪烁”指令码赋给P0口
write_1602com(0x06);//调用write_com子程序并把“地址指针加1,整屏不移动”指令码赋给P0口
//write_com(0x80+0x10);//数据指针初始化,让指针指向可显示的最右端
write_1602com(0x80);//数据指针初始化,让指针指向最左端,显示从第一行开始
write_1602com(0x01);//调用write_com子程序并把"清零指"令码赋给P0口
Write1602(0x80,'2');
Write1602(0x81,'0');
Write1602(0x80+4,'-');
Write1602(0x80+7,'-');
Write1602(0x80+0x40+5,':
');
Write1602(0x80+0x40+8,':
');
}
/********************写一个字节**************/
voidwrite_1302byte(dat)
{
uchari;
sclk=0;
delayus();
for(i=8;i>0;i--)
{
io=dat&0x01;//只要是从低位取数,向高位一定要和0X01与
delayus();
sclk=1;//为写数据制造上升沿。
delayus();
sclk=0;//为下一次上升沿写下一个字节做准备
dat>>=1;//将数据向左移一位,准备写入下一个数据
}
}
/********************读一个字节***************/
ucharread_1302byte()
{
uchari,dat;
delayus();
for(i=8;i>0;i--)
{
dat>>=1;
if(io==1)
{
dat|=0x80;//将1取出,写在dat的最高位。
}
sclk=1;//把sclk拉高,为读一个字节的下降沿做准备
delayus();//稍等制造一个高电平
sclk=0;//为读一个字节制造下降沿
delayus();
}
returndat;
}
/*************写入一个时间位*****************/
voidwrite_1302(ucharadd,uchardat)
{
rst=0;
delayus();
sclk=0;
delayus();
rst=1;
write_1302byte(add);
delayus();
write_1302byte(dat);
delayus();
rst=0;
}
/****************读1302的地址******************/
ucharread_1302add(ucharadd)
{
uchartimedat;
rst=0;
_nop_();
sclk=0;
_nop_();
rst=1;
write_1302byte(add);//写入要读的地址
timedat=read_1302byte();//将上面地址中的数据赋给timedat
sclk=1;
_nop_();
rst=0;
returntimedat;
}
/****************初始化1302*********************/
voidinit_1302()
{
flag=read_1302add(0x81);//读秒寄存器的最高位,读出时钟状态
if(flag&0x80)//判断时钟是否关闭,若内部关闭,则初始,若没关闭,不初始化,还在走
{
write_1302(0x8e,0x00);//去除写保护
write_1302(0x80,((55/10)<<4|(55%10)));//写秒寄存器,并写入初值55
write_1302(0x82,((59/10)<<4|(59%10)));//写分寄存器,并写入初值59
write_1302(0x84,((22/10)<<4|(22%10)));//写小时寄存器,并写入初值23
write_1302(0x86,((24/10)<<4|(24%10)));//写日寄存器,并写入初值18
write_1302(0x88,((2/10)<<4|(2%10)));//写月寄存器,并写入初值2
write_1302(0x8a,((5/10)<<4|(5%10)));//写周寄存器,并写入初值5
write_1302(0x8c,((12/10)<<4|(12%10)));//写年寄存器,并写入初值12,不能写2012年
write_1302(0x90,0xa5);//写充电方式
write_1302(0x8e,0x80);//加上写保护
}
}
/*****************读出秒的十进制数***************************/
ucharreadsecond()
{
uchardat;
dat=read_1302add(0x81);
second=((dat&0x70)>>4)*10+(dat&0x0f);
returnsecond;
}
/*****************读出分的十进制数***************************/
ucharreadminute()
{
uchardat;
dat=read_1302add(0x83);
minute=((dat&0x70)>>4)*10+(dat&0x0f);
returnminute;
}
/*****************读出小时的十进制数***************************/
ucharreadhour()
{
uchardat;
dat=read_1302add(0x85);
hour=((dat&0x70)>>4)*10+(dat&0x0f);
returnhour;
}
/*****************读出天的十进制数***************************/
ucharreadday()
{
uchardat;
dat=read_1302add(0x87);
day=((dat&0x70)>>4)*10+(dat&0x0f);
returnday;
}
/*****************读出月的十进制数***************************/
ucharreadmonth()
{
uchardat;
dat=read_1302add(0x89);
month=((dat&0x70)>>4)*10+(dat&0x0f);
returnmonth;
}
/*****************读出周的十进制数***************************/
ucharreadweek()
{
uchardat;
dat=read_1302add(0x8b);
week=((dat&0x70)>>4)*10+(dat&0x0f);
returnweek;
}
/*****************读出年的十进制数***************************/
ucharreadyear()
{
uchardat;
dat=read_1302add(0x8d);
year=((dat&0xf0)>>4)*10+(dat&0x0f);
returnyear;
}
/************************读出所有时间**********************/
readtime()
{
readsecond();
readminute();
readhour();
readday();
readmonth();
readweek();
readyear();
}
/*********************向1602写入时间****************************/
voidwrite_second()
{
ucharshi,ge;
shi=second/10;
ge=second%10;
Write1602(0x80+0x40+9,0x30+shi);
Write1602(0x80+0x40+10,0x30+ge);
}
voidwrite_minute()
{
ucharshi,ge;
shi=minute/10;
ge=minute%10;
Write1602(0x80+0x40+6,0x30+shi);
Write1602(0x80+0x40+7,0x30+ge);
}
voidwrite_hour()
{
ucharshi,ge;
shi=hour/10;
ge=hour%10;
Write1602(0x80+0x40+3,0x30+shi);
Write1602(0x80+0x40+4,0x30+ge);
}
voidwrite_day()
{
ucharshi,ge;
shi=day/10;
ge=day%10;
Write1602(0x80+8,0x30+shi);
Write1602(0x80+9,0x30+ge);
}
voidwrite_month()
{
ucharshi,ge;
shi=month/10;
ge=month%10;
Write1602(0x80+5,0x30+shi);
Write1602(0x80+6,0x30+ge);
}
voidwrite_year()
{
ucharshi,ge;
shi=year/10;
ge=year%10;
Write1602(0x80+2,0x30+shi);
Write1602(0x80+3,0x30+ge);
}
voidwrite_week()
{
Write1602(0x80+12,0x30+week);
//ucharweek;
switch(week)
{
case1:
Write1602(0x80+12,'M');
Write1602(0x80+13,'O');
Write1602(0x80+14,'N');
break;
case2:
Write1602(0x80+12,'T');
Write1602(0x80+13,'U');
Write1602(0x80+14,'E');
break;
case3:
Write1602(0x80+12,'W');
Write1602(0x80+13,'E');
Write1602(0x80+14,'N');
break;
case4:
Write1602(0x80+12,'T');
Write1602(0x80+13,'H');
Write1602(0x80+14,'U');
break;
case5:
Write1602(0x80+12,'F');
Write1602(0x80+13,'R');
Write1602(0x80+14,'I');
break;
case6:
Write1602(0x80+12,'S');
Write1602(0x80+13,'A');
Write1602(0x80+14,'T');
break;
case7:
Write1602(0x80+12,'S');
Write1602(0x80+13,'U');
Write1602(0x80+14,'N');
break;
}
}
/*********************键盘扫描****************************/
voidkeyscan()
{
if(key==0)
{
delay(5);
if(key==0);//防止误动作
{
S1num++;
while(!
key);
switch(S1num)
{
case1:
keyflag=1;
write_1302(0x8e,0x00);//去除写保护
write_1302(0x80,0x80);//时钟停下
write_1602com(0x80+0x40+10);
write_1602com(0x0f);
break;
case2:
write_1602com(0x80+0x40+7);
break;
case3:
write_1602com(0x80+0x40+4);
break;
case4:
write_1602com(0x80+9);
break;
case5:
write_1602com(0x80+6);
break;
case6:
write_1602com(0x80+3);
break;
case7:
write_1602com(0x80+12);
break;
case8:
S1num=0;
keyflag=0;
write_1602com(0x0c);//不显示光标
write_1302(0x80,0x00);//禁止写保护
write_1302(0x80,(second/10)<<4|second%10);//将调节后的秒写入DS1302
write_1302(0x82,(minute/10)<<4|minute%10);//将调节后的分写入DS1302
write_1302(0x84,(hour/10)<<4|hour%10);//将调节后的时写入DS1302
write_1302(0x8a,(week/10)<<4|week%10);//将调节后的星期写入DS1302
write_1302(0x86,(day/10)<<4|day%10);//将调节后的日写入DS1302
write_1302(0x88,(month/10)<<4|month%10);//将调节后的月写入DS1302
write_1302(0x8c,(year/10)<<4|year%10);//
//write_1302(0x80,0x00);//时钟继续走这一句不能加在这,否则每次调完时后秒会归O
write_1302(0x8e,0x80);//写保护关
//write_1602com(0x0c);
break;
}
}
}
if(S1num!
=0)
{
if(K1==0)
{
delay(5);
while(!
K1);
switch(S1num)
{
case1:
second++;
if(second==60)second=0;
//write_1302(0x8e,0x00);//去除写保护
write_second();
write_1602com(0x80+0x40+10);
break;
case2:
minute++;
if(minute==60)minute=0;
write_minute();
write_1602com(0x80+0x40+7);
break;
case3:
hour++;
if(hour==24)hour=0;
write_hour();
write_1602com(0x80+0x40+4);
break;
case4:
day++;
write_day();
write_1602com(0x80+9);
break;
case5:
month++;
write_month();
write_1602com(0x80+6);
break;
case6:
year++;
write_year();
write_1602com(0x80+3);
break;
case7:
week++;
write_week();
write_1602com(0x80+12);
break;
//default:
break;
}
}
if(K2==0)
{
delay(5);
while(!
K2);
switch(S1num)
{
case1:
second--;
if(second<0)second=59;
write_second();
write_1602com(0x80+0x40+10);
break;
case2:
minute--;
if(minute<0)minute=59;
write_minute();
write_1602com(0x80+0x40+7);
break;
case3:
hour--;
if(hour<0)hour=23;
write_hour();
write_1602com(0x80+0x40+4);
break;
case4:
day--;
write_day();
write_1602com(0x80+9);
break;
case5:
month--;
write_month();
write_1602com(0x80+6);
break;
case6:
year--;
write_year();
write_1602com(0x80+3);
break;
case7:
week--;
write_week();
write_1602com(0x80+12);
break;
//default:
break;
}
}
}
}
voidmain()
{
GND=0;
delay(100);
init1602();
init_1302();
while
(1)
{
keyscan();
if(keyflag==0)
{
readtime();
write_second();
write_minute();
write_hour();
write_day();
write_month();
write_year();
write_week();
}
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ds1302 程序 1602 液晶显示