1602显示时钟可以调节时分秒(加减)
来源:互联网 发布:java多线程池实例 编辑:程序博客网 时间:2024/05/06 19:38
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#define uchar unsigned char#define uint unsigned intstatic uchar count,j,s1num; char shi,fen,miao;sbit RS = P2^4; //Pin4sbit RW = P2^5; //Pin5sbit E = P2^6; //Pin6sbit s1=P3^0; //矩阵键盘分离出独立键盘sbit s2=P3^1;sbit s3=P3^2;sbit rd=P3^7;uchar code table1[]=" 2013-7-30 MON ";uchar code table2[]=" 00:00:00 "; /******************************************************************//* 延时函数 *//******************************************************************/void delay(uint z){ uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--);}/******************************************************************//* 写入命令函数 *//******************************************************************/void WriteCommand(unsigned char c){ delay(5);//操作前短暂延时,保证信号稳定 E=0; RS=0; RW=0; delay(5); E=1; P0=c; E=0;}/******************************************************************//* 写入数据函数 *//******************************************************************/void WriteData(unsigned char c){ delay(5); //操作前短暂延时,保证信号稳定 E=0; RS=1; RW=0; delay(5); E=1; P0=c; E=0; RS=0;}/******************************************************************//* 初始化函数 *//******************************************************************/void InitLcd(){ //delay(15); WriteCommand(0x38); //display mode WriteCommand(0x38); //display mode WriteCommand(0x38); //display mode WriteCommand(0x06); //显示光标移动位置 WriteCommand(0x0c); //显示开及光标设置 WriteCommand(0x01); //显示清屏 // fen=59; //测试用 // miao=53; // shi=23; delay(15); WriteCommand(0x80); //显示第一行for(j=0;j<16;j++){WriteData(table1[j]); delay(5);} WriteCommand(0x80+0x40); //显示第二行for(j=0;j<16;j++) {WriteData(table2[j]); delay(5);}}/******************************************************************//* 时分秒显示 *//******************************************************************/void writesfm(uchar add,uchar date){ uchar shi,ge; shi=date/10; ge=date%10; WriteCommand(0x80+0x40+add); WriteData(0x30+shi); WriteData(0x30+ge);}/******************************************************************//* 键盘功能函数 *//******************************************************************/void keysan(){rd=0;if(s1==0) { delay(5); if(s1==0) { s1num++; while(!s1); if(s1num==1) { TR0=0; WriteCommand(0x80+0x40+10); WriteCommand(0x0f);//显示光标 } } if(s1num==2) { WriteCommand(0x80+0x40+7); } if(s1num==3) { WriteCommand(0x80+0x40+4); } if(s1num==4) { s1num=0; WriteCommand(0x0c); //光标不闪烁 TR0=1; } } if(s1num!=0) //s1抬起时完成加减操作{ if(s2==0) { delay(5); if(s2==0) { while(!s2); if(s1num==1) { miao++;if(miao==60) miao=0;writesfm(10,miao);WriteCommand(0x80+0x40+10); } if(s1num==2) { fen++; if(fen==60) fen=0; writesfm(7,fen); WriteCommand(0x80+0x40+7); } if(s1num==3) { shi++; if(shi==24) shi=0; writesfm(4,shi); WriteCommand(0x80+0x40+4); }} } if(s3==0) { delay(5); if(s3==0) { while(!s3); if(s1num==1) { miao--;if(miao==-1) miao=59;writesfm(10,miao); WriteCommand(0x80+0x40+10); } if(s1num==2) { fen--;if(fen==-1) fen=59; writesfm(7,fen); WriteCommand(0x80+0x40+7); } if(s1num==3) { shi--;if(shi==-1) shi=23; writesfm(4,shi); WriteCommand(0x80+0x40+4); } } } } } /******************************************************************//* 主函数 *//******************************************************************/void main(void){ TMOD=0x01; //定时器0 10ms in 12M crystal 用于计时TH0=(65536-50000)/256; //初值TL0=(65536-50000)%256;ET0=1;TR0=1; EA =1; InitLcd(); //初始化LCD,送初值 while(1) { keysan();if(count==10) { count=0; miao++; if(miao==60) { miao=0; fen++; if(fen==60) { fen=0; shi++; if(shi==24) { shi=0; } writesfm(4,shi) ; } writesfm(7,fen) ; }writesfm(10,miao) ;} }}void timer0() interrupt 1 //定时器中断0{ TH0=(65536-50000)/256; //初值 TL0=(65536-50000)%256; count++;}