基于STC89C52单片机时钟Word文档下载推荐.docx
- 文档编号:7198941
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:20
- 大小:44.75KB
基于STC89C52单片机时钟Word文档下载推荐.docx
《基于STC89C52单片机时钟Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于STC89C52单片机时钟Word文档下载推荐.docx(20页珍藏版)》请在冰点文库上搜索。
voidlcd_wdat(uchardat);
//写数据寄存器DR函数声明
voidlcd_clr();
//清屏函数声明
voidlcd_init();
//LCD初始化函数声明
voidkey_mode();
voidyear_moon_day();
uchardis_buf[19];
uchardis[]={'
0’,'
1'
'
2'
3’,’4'
,'
5’,'
6'
7'
’8'
9’};
ucharcodename1[]={”helpyourself!
"
};
ucharcodename2[]={”holdon!
ucharyear_month_day[3][8]=
{
{0x04,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0},//年
{0x0f,0x09,0x0f,0x09,0x0f,0x09,0x13,0x00},//月
{0x0e,0x0a,0x0a,0x0e,0x0a,0x0a,0x0e,0x02}//日
};
uchardingshi=0;
//50ms计数
ucharflag=0;
//按键控制变量
charmiao=55,fen=59,shi=23;
charmoon=12,day=31;
intyear=2012;
ucharleap;
ucharshan;
//控制时分的闪烁位
ucharkey_value;
/****************LCD显示部分******************/
//读忙
bitlcd_busy()
bitresult;
LCD_RS=0;
LCD_RW=1;
LCD_EN=1;
_nop_();
_nop_();
result=(bit)(P2&0x80);
LCD_EN=0;
returnresult;
}
//清屏
voidlcd_clr()
lcd_wcmd(0x01);
delay_ms(5);
}
//写指令
voidlcd_wcmd(ucharcmd)
while(lcd_busy());
//delay_ms
(2);
LCD_RS=0;
LCD_RW=0;
P2=cmd;
LCD_EN=1;
LCD_EN=0;
//写数据
voidlcd_wdat(uchardat)
while(lcd_busy());
LCD_RS=1;
LCD_RW=0;
P2=dat;
//显示初始化
voidlcd_init()
{
//delay_ms(15);
lcd_wcmd(0x38);
//显示模式为16*25*7点阵8位数据
delay_ms(5);
lcd_wcmd(0x38);
//清屏
lcd_wcmd(0x06);
//移动光标
lcd_wcmd(0x0c);
//开光标
voiddelay_ms(uintxms)
uchari,j;
for(i=xms;
i〉0;
i——)
for(j=110;
j〉0;
j—-);
voidlcd_conv(ucharshi,fen,miao)
dis_buf[0]=dis[shi/10];
dis_buf[1]=dis[shi%10];
dis_buf[2]=0x3a;
dis_buf[3]=dis[fen/10];
dis_buf[4]=dis[fen%10];
dis_buf[5]=0x3a;
dis_buf[6]=dis[miao/10];
dis_buf[7]=dis[miao%10];
voidlcd_conv_year(uintyear,ucharmoon,day)
dis_buf[8]=dis[year/1000];
dis_buf[9]=dis[(year%1000)/100];
dis_buf[10]=dis[(year%100)/10];
dis_buf[11]=dis[year%10];
dis_buf[12]=1;
dis_buf[13]=dis[moon/10];
dis_buf[14]=dis[moon%10];
dis_buf[15]=2;
dis_buf[16]=dis[day/10];
dis_buf[17]=dis[day%10];
dis_buf[18]=3;
voidlcd_dis()
uchari;
lcd_conv(shi,fen,miao);
lcd_conv_year(year,moon,day);
lcd_wcmd(0x00|0x80);
for(i=8;
i<
19;
i++)
lcd_wdat(dis_buf[i]);
lcd_wcmd(0x40|0x80);
for(i=0;
i〈8;
lcd_wdat(dis_buf[i]);
//自定义字符图形
voidlcd_wCGROM()//将汉字写入CGROM
for(i=1;
4;
{
for(j=0;
j<
8;
j++)
{
lcd_wcmd(0x40+i*8+j);
lcd_wdat(year_month_day[i—1][j]);
}
}
/*******************按键部分**********************/
//键盘扫描
voidkeyscan()
key1=0;
delay_ms(20);
if(key2==0||key3==0||key4==0)
{
delay_ms(20);
if(key2==0)
{
flag++;
if(flag==1)
{
lcd_wcmd(0x0e);
//有光标,但是不闪
delay_ms
(1);
lcd_wcmd(0xc0+1);
//时
TR0=0;
if(flag==2)
{
lcd_wcmd(0xc0+4);
//分
delay_ms
(1);
}
if(flag==3)
lcd_wcmd(0x80+3);
//年
if(flag==4)
lcd_wcmd(0x80+6);
//月
if(flag==5)
lcd_wcmd(0x80+9);
//日
if(flag〉5)
flag=0;
lcd_wcmd(0x0c);
//关光标
TR0=1;
}
if(key3==0)
key_value=2;
if(key4==0)
key_value=3;
while(key2==0||key3==0||key4==0);
}
voidkeyprocess()
switch(flag)
{
case1:
if(key_value==2)
{
shi++;
if(shi>
23)shi=0;
lcd_dis();
lcd_wcmd(0xc0+1);
delay_ms
(1);
}
if(key_value==3)
shi—-;
if(shi<
0)shi=23;
lcd_dis();
delay_ms
(1);
}break;
case2:
fen++;
if(fen>
59)fen=0;
lcd_wcmd(0xc0+4);
{
fen——;
if(fen〈0)fen=59;
}
case3:
year++;
if(year>
9999)year=2000;
lcd_wcmd(0x80+3);
year--;
if(year〈2000)year=9999;
lcd_wcmd(0x80+3);
}break;
case4:
moon++;
if(moon>
12)moon=1;
lcd_wcmd(0x80+6);
moon-—;
if(moon<
0)moon=12;
case5:
day++;
if(moon==2&&((year—2000)%4==0)&
&day>
29)day=1;
if(moon==2&
&((year-2000)%4!
=0)&&
day>
28)day=1;
if((moon==1||moon==3||moon==5||moon==7||moon==8||moon==10||moon==12)&
&day〉31)
day=1;
if((moon==4||moon==6||moon==9||moon==11)&&
30)
lcd_dis();
lcd_wcmd(0x80+9);
day—-;
if(moon==2&&
((year—2000)%4==0)&&day<
1)day=29;
&((year-2000)%4!
day〈1)day=28;
if((moon==1||moon==3||moon==5||moon==7||moon==8||moon==10||moon==12)&
&
day<
1)
day=31;
if((moon==4||moon==6||moon==9||moon==11)&&
day〈1)
day=30;
lcd_dis();
}break;
default:
flag=0;
key_value=0;
/*********************走时部分**********************/
voidzoushi_inint()
TMOD=0x01;
TH0=(65536—50000)/256;
TL0=(65536—50000)%256;
TR0=1;
EA=1;
ET0=1;
voidtimer0()interrupt1
TH0=(65536-50000)/256;
TL0=(65536—50000)%256;
if(++dingshi〉20)
miao++;
dingshi=0;
if(miao〉59)
miao=0;
fen++;
if(fen〉59)
fen=0;
shi++;
if(shi>
23)
shi=0;
year_moon_day();
//年月日
voidyear_moon_day()
day++;
if((year—2000)%4==0)
leap=1;
else
leap=0;
if(day>
28)
{
switch(moon)
if(day>
31){day=1;
}break;
case2:
if(leap==1)
{
if(day〉29)
{
day=1;
moon++;
}
}
else
}break;
case3:
if(day〉31){day=1;
moon++;
30){day=1;
moon++;
}break;
31){day=1;
case6:
if(day〉30){day=1;
}break;
case7:
if(day〉31){day=1;
case8:
}break;
case9:
30){day=1;
case10:
31){day=1;
case11:
if(day〉30){day=1;
case12:
if(day〉31){day=1;
if(moon〉12)
moon=1;
year++;
if(year>
9999)
year=2000;
}
voiddisplay()//开机个性化显示
i=0;
while(i<
14)
lcd_wdat(name1[i]);
i++;
lcd_wcmd(0x40|0x80);
i=0;
8)
lcd_wdat(name2[i]);
i++;
voidmain()
inti,j;
lcd_init();
lcd_clr();
display();
5;
for(j=0;
1000;
delay_ms
(2);
}
zoushi_inint();
lcd_wCGROM();
while
(1)
lcd_dis();
delay_ms(5);
keyscan();
if(flag!
=0)
while
(1)
keyprocess();
keyscan();
if(TR0==1)
break;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 STC89C52 单片机 时钟