閱讀797 返回首頁    go 阿裏雲 go 技術社區[雲棲]


1602顯示時鍾可以調節時分秒(加減)

#include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
#define uchar unsigned char
#define uint  unsigned int
static  uchar count,j,s1num;
  char shi,fen,miao;
sbit RS = P2^4; //Pin4
sbit RW = P2^5; //Pin5
sbit E  = P2^6; //Pin6


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


最後更新:2017-04-03 18:52:14

  上一篇:go HDU 4569 長沙E題 枚舉
  下一篇:go jQuery打印插件JQPRINT