单片机实训万年历程序.docx
- 文档编号:11833735
- 上传时间:2023-04-05
- 格式:DOCX
- 页数:15
- 大小:16.36KB
单片机实训万年历程序.docx
《单片机实训万年历程序.docx》由会员分享,可在线阅读,更多相关《单片机实训万年历程序.docx(15页珍藏版)》请在冰豆网上搜索。
单片机实训万年历程序
#include
typedefunsignedcharuint8;
#defineclrdp0x01
#defineenmode0x06
#definecurback0x02
#defineondp0x0f
#defineoffdp0x08
#definemovd0x14
#definefunset0x38
#definebusP1
#definecontw0x8e
#definesecw0x80
#definesecr0x81
#defineminw0x82
#defineminr0x83
#definehourw0x84
#definehourr0x85
#definedatw0x86
#definedatr0x87
#definemonthw0x88
#definemonthr0x89
#definedayw0x8a
#definedayr0x8b
#defineyearw0x8c
#defineyearr0x8d
sbitK1=P2^7;
sbitK2=P2^5;
sbitK3=P2^4;
sbitRS=P3^7;
sbitRW=P3^6;
sbitEN=P3^5;
sbitDIO=P2^1;
sbitRST=P2^2;
sbitSCK=P2^0;
bitflag=0;
uint8sel;
uint8time[7]={0};
uint8time_disp[32]={0};
voidinit_1602(void);
voidwrite_com(uint8comd);
voidwrite_dat(uint8wdata);
voiddelay(void);
voidlong_dleay(void);
voidinit_1302(void);
uint8read_1302(uint8addr);
voidwrite_1302(uint8addr,uint8wdata);
voiddisp(void);
voidread_time(void);
voidsepr_time(void);
voidchk_key(void);
uint8bcd_dec(uint8wdata);
uint8dec_bcd(uint8wdata);
voidmain(void)
{
init_1302();
init_1602();
while
(1)
{
chk_key();
read_time();
sepr_time();
disp();
}
}
//1302初始化
voidinit_1302(void)
{
write_1302(contw,0);
write_1302(secw,0);
}
//写1302寄存器
voidwrite_1302(uint8addr,uint8wdata)
{
uint8i;
SCK=0;
RST=1;
for(i=0;i<8;i++)
{
DIO=addr&0x01;
SCK=1;
SCK=0;
addr>>=1;
}
for(i=0;i<8;i++)
{
DIO=wdata&0x01;
SCK=1;
SCK=0;
wdata>>=1;
}
RST=0;
}
//读1302寄存器
uint8read_1302(uint8addr)
{
uint8i;
uint8temp;
SCK=0;
RST=1;
for(i=0;i<8;i++)
{
DIO=addr&0x01;
SCK=1;
SCK=0;
addr>>=1;
}
for(i=0;i<8;i++)
{
temp>>=1;
if(!
DIO)
{
temp&=0x7f;
}
else
{
temp|=0x80;
}
SCK=1;
SCK=0;
}
RST=0;
returntemp;
}
//读1302时间寄存器
voidread_time(void)
{
uint8i;
uint8temp;
for(i=0;i<7;i++)
{
temp=read_1302(0x81+i*2);
time[i]=temp;
}
time[0]&=0x7f;
}
//显示时间
voiddisp(void)
{
uint8i;
write_com(0x80);
for(i=0;i<16;i++)
{
write_dat(time_disp[i]);
}
write_com(0xc0);
for(i=16;i<32;i++)
{
write_dat(time_disp[i]);
}
}
//分离时间
voidsepr_time(void)
{
time_disp[0]='-';
time_disp[1]='-';
time_disp[2]='2';
time_disp[3]='0';
time_disp[4]=(time[6]>>4)+0x30;
time_disp[5]=(time[6]&0x0f)+0x30;
time_disp[6]='-';
time_disp[7]=(time[4]>>4)+0x30;
time_disp[8]=(time[4]&0x0f)+0x30;
time_disp[9]='-';
time_disp[10]=(time[3]>>4)+0x30;
time_disp[11]=(time[3]&0x0f)+0x30;
time_disp[12]='-';
time_disp[13]='-';
time_disp[14]=(time[5]>>4)+0x30;
time_disp[15]=(time[5]&0x0f)+0x30;
time_disp[16]='-';
time_disp[17]='-';
time_disp[18]='-';
time_disp[19]='-';
time_disp[20]=(time[2]>>4)+0x30;
time_disp[21]=(time[2]&0x0f)+0x30;
time_disp[22]='-';
time_disp[23]=(time[1]>>4)+0x30;
time_disp[24]=(time[1]&0x0f)+0x30;
time_disp[25]='-';
time_disp[26]=(time[0]>>4)+0x30;
time_disp[27]=(time[0]&0x0f)+0x30;
time_disp[28]='-';
time_disp[29]='-';
time_disp[30]='-';
time_disp[31]='-';
}
voidinit_1602(void)
{
write_com(offdp);
write_com(funset);
write_com(enmode);
write_com(movd);
write_com(ondp);
write_com(clrdp);
}
voidwrite_com(uint8comd)
{
RS=0;
RW=0;
bus=comd;
EN=1;
EN=0;
delay();
}
voidwrite_dat(uint8wdata)
{
RS=1;
RW=0;
bus=wdata;
EN=1;
EN=0;
delay();
}
voiddelay(void)
{
uint8t;
for(t=0;t<250;t++);
}
voidlong_delay(void)
{
uint8t;
for(t=0;t<200;t++)
{
delay();
}
}
voidchk_key(void)
{
uint8buf;
uint8temp;
if(!
K1)
{
long_delay();
if(!
K1)
{
if(flag)
{
if((sel>=0)&&(sel<8))
{
sel++;
}
elseif(sel==8)
{
temp=read_1302(secr);
temp&=0x7f;
write_1302(secw,temp);
sel=0;
flag=0;
}
else
{
sel=8;
}
}
else
{
temp=read_1302(secr);
temp|=0x80;
write_1302(secw,temp);
flag=1;
}
}
}
elseif(!
K2)
{
long_delay();
if(!
K2)
{
switch(sel)
{
case1:
temp=read_1302(yearr);
buf=bcd_dec(temp);
if(buf<99)
{
buf++;
temp=dec_bcd(buf);
write_1302(yearw,temp);
}
break;
case2:
temp=read_1302(dayr);
buf=bcd_dec(temp);
if(buf<7)
{
buf++;
temp=dec_bcd(buf);
write_1302(dayw,temp);
}
break;
case3:
temp=read_1302(monthr);
buf=bcd_dec(temp);
if(buf<12)
{
buf++;
temp=dec_bcd(buf);
write_1302(monthw,temp);
}
break;
case4:
temp=read_1302(datr);
buf=bcd_dec(temp);
if(buf<31)
{
buf++;
temp=dec_bcd(buf);
write_1302(datw,temp);
}
break;
case5:
temp=read_1302(hourr);
buf=bcd_dec(temp);
if(buf<23)
{
buf++;
temp=dec_bcd(buf);
write_1302(hourw,temp);
}
break;
case6:
temp=read_1302(minr);
buf=bcd_dec(temp);
if(buf<59)
{
buf++;
temp=dec_bcd(buf);
write_1302(minw,temp);
}
break;
case7:
temp=read_1302(secr);
temp&=0x7f;
buf=bcd_dec(temp);
if(buf<59)
{
buf++;
temp=dec_bcd(buf);
temp|=0x80;
write_1302(secw,temp);
}
break;
default:
break;
}
}
}
elseif(!
K3)
{
long_delay();
if(!
K3)
{
switch(sel)
{
case1:
temp=read_1302(yearr);
buf=bcd_dec(temp);
if(buf>0)
{
buf--;
temp=dec_bcd(buf);
write_1302(yearw,temp);
}
break;
case2:
temp=read_1302(dayr);
buf=bcd_dec(temp);
if(buf>1)
{
buf--;
temp=dec_bcd(buf);
write_1302(dayw,temp);
}
break;
case3:
temp=read_1302(monthr);
buf=bcd_dec(temp);
if(buf>1)
{
buf--;
temp=dec_bcd(buf);
write_1302(monthw,temp);
}
break;
case4:
temp=read_1302(datr);
buf=bcd_dec(temp);
if(buf>1)
{
buf--;
temp=dec_bcd(buf);
write_1302(datw,temp);
}
break;
case5:
temp=read_1302(hourr);
buf=bcd_dec(temp);
if(buf>0)
{
buf--;
temp=dec_bcd(buf);
write_1302(hourw,temp);
}
break;
case6:
temp=read_1302(minr);
buf=bcd_dec(temp);
if(buf>0)
{
buf--;
temp=dec_bcd(buf);
write_1302(minw,temp);
}
break;
case7:
temp=read_1302(secr);
temp&=0x7f;
buf=bcd_dec(temp);
if(buf>0)
{
buf--;
temp=dec_bcd(buf);
temp|=0x80;
write_1302(secw,temp);
}
break;
default:
break;
}
}
}
}
uint8dec_bcd(uint8wdata)
{
uint8temp;
uint8i;
uint8j;
i=wdata/10;
j=wdata%10;
temp=i;
temp=temp<<4;
temp=temp|j;
returntemp;
}
uint8bcd_dec(uint8wdata)
{
uint8temp;
uint8i;
uint8j;
i=wdata>>4;
j=wdata&0x0f;
temp=i*10+j;
returntemp;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 万年历 程序