基于STC89C52单片机时钟.docx

上传人:b****3 文档编号:5325120 上传时间:2023-05-08 格式:DOCX 页数:20 大小:44.75KB
下载 相关 举报
基于STC89C52单片机时钟.docx_第1页
第1页 / 共20页
基于STC89C52单片机时钟.docx_第2页
第2页 / 共20页
基于STC89C52单片机时钟.docx_第3页
第3页 / 共20页
基于STC89C52单片机时钟.docx_第4页
第4页 / 共20页
基于STC89C52单片机时钟.docx_第5页
第5页 / 共20页
基于STC89C52单片机时钟.docx_第6页
第6页 / 共20页
基于STC89C52单片机时钟.docx_第7页
第7页 / 共20页
基于STC89C52单片机时钟.docx_第8页
第8页 / 共20页
基于STC89C52单片机时钟.docx_第9页
第9页 / 共20页
基于STC89C52单片机时钟.docx_第10页
第10页 / 共20页
基于STC89C52单片机时钟.docx_第11页
第11页 / 共20页
基于STC89C52单片机时钟.docx_第12页
第12页 / 共20页
基于STC89C52单片机时钟.docx_第13页
第13页 / 共20页
基于STC89C52单片机时钟.docx_第14页
第14页 / 共20页
基于STC89C52单片机时钟.docx_第15页
第15页 / 共20页
基于STC89C52单片机时钟.docx_第16页
第16页 / 共20页
基于STC89C52单片机时钟.docx_第17页
第17页 / 共20页
基于STC89C52单片机时钟.docx_第18页
第18页 / 共20页
基于STC89C52单片机时钟.docx_第19页
第19页 / 共20页
基于STC89C52单片机时钟.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

基于STC89C52单片机时钟.docx

《基于STC89C52单片机时钟.docx》由会员分享,可在线阅读,更多相关《基于STC89C52单片机时钟.docx(20页珍藏版)》请在冰点文库上搜索。

基于STC89C52单片机时钟.docx

基于STC89C52单片机时钟

基于STC89C52单片机时钟

 

 

————————————————————————————————作者:

————————————————————————————————日期:

 

基于STC89C52单片机时钟

1。

1602显示。

第一行显示年月日,第二行显示时分秒。

2.开机显示个性的画面,约5S后进入时间显示界面。

3。

汉字显示“年”“月”“日"。

4.时间可调。

时间调节由三按键控制。

键一控制调节位,按下键一后,时钟停止走时,出现光标,每按一次光标移向下一个调节位,按五次后,退出调节模式。

键二为家键,键三为减键。

只有在模式调节下才起作用。

5。

该时钟程序仅仅只是时钟功能的实现,走时并不精确。

或者说是参考模型,可以在此基础上进行优化和更改.按键部分可进行大优化,为了在实验板上做实验,而实验板为矩阵键盘.所以按键定义了四个端口。

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitLCD_RS=P1^0;//定义寄存器选择

sbitLCD_RW=P1^1;//定义读写信号线

sbitLCD_EN=P1^2;//定义定义使能端

sbitkey1=P0^0;

sbitkey2=P0^4;

sbitkey3=P0^5;

sbitkey4=P0^6;

voiddelay_ms(uintxms);//延时函数声明

bitlcd_busy();//忙检查函数声明

voidlcd_wcmd(ucharcmd);//写指令寄存器IR函数声明

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_();

_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;

LCD_EN=0;

_nop_();

_nop_();

P2=cmd;

_nop_();

_nop_();

_nop_();

_nop_();

LCD_EN=1;

_nop_();

_nop_();

_nop_();

_nop_();

LCD_EN=0;

//写数据

voidlcd_wdat(uchardat)

{

while(lcd_busy());

//delay_ms

(2);

LCD_RS=1;

LCD_RW=0;

LCD_EN=0;

_nop_();

_nop_();

P2=dat;

_nop_();

_nop_();

_nop_();

_nop_();

LCD_EN=1;

_nop_();

_nop_();

_nop_();

_nop_();

LCD_EN=0;

}

//显示初始化

voidlcd_init()

//delay_ms(15);

lcd_wcmd(0x38);//显示模式为16*25*7点阵8位数据

delay_ms(5);

lcd_wcmd(0x38);

delay_ms(5);

lcd_wcmd(0x01);//清屏

delay_ms(5);

lcd_wcmd(0x06);//移动光标

delay_ms(5);

lcd_wcmd(0x0c);//开光标

delay_ms(5);

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;i++)

lcd_wdat(dis_buf[i]);

//自定义字符图形

voidlcd_wCGROM()//将汉字写入CGROM

uchari,j;

for(i=1;i<4;i++)

{

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);//时

delay_ms

(1);

TR0=0;

if(flag==2)

{

lcd_wcmd(0xc0+4);//分

delay_ms

(1);

}

if(flag==3)

{

lcd_wcmd(0x80+3);//年

delay_ms

(1);

}

if(flag==4)

{

lcd_wcmd(0x80+6);//月

delay_ms

(1);

 

if(flag==5)

lcd_wcmd(0x80+9);//日

delay_ms

(1);

}

if(flag〉5)

{

flag=0;

lcd_wcmd(0x0c);//关光标

delay_ms

(1);

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();lcd_wcmd(0xc0+1);delay_ms

(1);

}break;

case2:

{

if(key_value==2)

{

fen++;if(fen>59)fen=0;lcd_dis();lcd_wcmd(0xc0+4);delay_ms

(1);

if(key_value==3)

fen——;if(fen〈0)fen=59;lcd_dis();lcd_wcmd(0xc0+4);delay_ms

(1);

}

}break;

case3:

{

if(key_value==2)

{

year++;if(year>9999)year=2000;lcd_dis();lcd_wcmd(0x80+3);delay_ms

(1);

}

if(key_value==3)

year--;if(year〈2000)year=9999;lcd_dis();lcd_wcmd(0x80+3);delay_ms

(1);

}break;

case4:

if(key_value==2)

moon++;if(moon>12)moon=1;lcd_dis();lcd_wcmd(0x80+6);delay_ms

(1);

}

if(key_value==3)

{

moon-—;if(moon<0)moon=12;lcd_dis();lcd_wcmd(0x80+6);delay_ms

(1);

}break;

case5:

{

if(key_value==2)

{

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)&&day>30)

day=1;

lcd_dis();lcd_wcmd(0x80+9);delay_ms

(1);

if(key_value==3)

{

day—-;

if(moon==2&&((year—2000)%4==0)&&day<1)day=29;

if(moon==2&&((year-2000)%4!

=0)&&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();lcd_wcmd(0x80+9);delay_ms

(1);

}

}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)

case1:

if(day>31){day=1;}break;

case2:

if(leap==1)

if(day〉29)

{

day=1;

moon++;

}

else

day=1;

moon++;

}break;

case3:

if(day〉31){day=1;moon++;}break;

case4:

if(day>30){day=1;moon++;}break;

case5:

if(day>31){day=1;moon++;}break;

case6:

if(day〉30){day=1;moon++;}break;

case7:

if(day〉31){day=1;moon++;}break;

case8:

if(day〉31){day=1;moon++;}break;

case9:

if(day>30){day=1;moon++;}break;

case10:

if(day>31){day=1;moon++;}break;

case11:

if(day〉30){day=1;moon++;}break;

case12:

if(day〉31){day=1;moon++;}break;

}

if(moon〉12)

moon=1;

year++;

if(year>9999)

year=2000;

}

voiddisplay()//开机个性化显示

uchari;

lcd_wcmd(0x00|0x80);

i=0;

while(i<14)

{

lcd_wdat(name1[i]);

i++;

lcd_wcmd(0x40|0x80);

i=0;

while(i<8)

lcd_wdat(name2[i]);

i++;

}

voidmain()

{

inti,j;

lcd_init();

lcd_clr();

delay_ms(5);

display();

for(i=0;i<5;i++)

for(j=0;j<1000;j++)

{

delay_ms

(2);

}

lcd_clr();

zoushi_inint();

lcd_wCGROM();

while

(1)

{

lcd_dis();

delay_ms(5);

keyscan();

if(flag!

=0)

while

(1)

{

keyprocess();

keyscan();

if(TR0==1)

break;

}

}

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

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2