基于STC89C52单片机时钟.docx
- 文档编号:10678015
- 上传时间:2023-02-22
- 格式:DOCX
- 页数:20
- 大小:44.75KB
基于STC89C52单片机时钟.docx
《基于STC89C52单片机时钟.docx》由会员分享,可在线阅读,更多相关《基于STC89C52单片机时钟.docx(20页珍藏版)》请在冰豆网上搜索。
基于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; } } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 STC89C52 单片机 时钟