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++;}


原创粉丝点击