⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clock.c

📁 该代码利用pic单片机和时钟芯片ds1307实现了时钟的功能
💻 C
字号:
#include<pic.h>
#define uchar unsigned char
#define RS   RA0
#define RW   RA1
#define E   RA2
uchar buffer;
uchar i;
const uchar table[12]={0x30,0x31,0x32,0x33,0x34,
0x35,0x36,0x37,0x38,0x39,0x3a,0x2f};
uchar timer[7];  // 定义一数组用来存放读取的时间
//日期信息timer[0],timer[1]等分别存放秒,分等
bit flag;      //flag为1时表示LCD忙,为0时才可以对其进行读或写操作
void initialIO();
uchar bank2 date[13];
void initialI2C();
void start();    //产生起始位
void stop();     //产生停止位
void restart();  //产生重复起始位
void initialCLOCK();       //时钟DS1307初始设置
void initialLCD();    //液晶驱动器HD44780初始化
void writebyte(uchar);
void readtimer();
void delay5ms();
void readBUSY();
void display();
void count();    
void resetADDRESS(); //复位DS1307的指针,使其指向秒单元即指针的内容为0

void initialIO()
{
 TRISB=0X00;
 TRISA=0x00;
TRISD=0x07;
PORTB=0x00;
ADCON1=0x06;
       }

void initialI2C()
{
 SSPSTAT=0;
 SSPCON=0x28;
 SSPADD=90;
 SSPIF=0;
         }

void delay5ms()
{
 TMR0IF=0;
 OPTION=0x06;
 TMR0=217;
 while(TMR0IF==0);
          }

void  readBUSY()
{E=0;
 flag=1;
 TRISB=0xff;
 asm("nop");
 asm("nop");
 RS=0;
 RW=1;
asm("nop");
 E=1;
 asm("nop");
 buffer=PORTB;
 buffer&=0x80;
 if (buffer==0)
 {flag=0;}
 TRISB=0;
 asm("nop");
 asm("nop");
 RW=0;
 asm("nop");
 asm("nop");
            }

void start()
{
SSPIF=0;
 SEN=1;
 while(SSPIF==0);
 SSPIF=0;}

void stop()
 {
 SSPIF=0;
  PEN=1;
  while(SSPIF==0);
  SSPIF=0;}

void restart()
  {
   SSPIF=0;
   RSEN=1;
   while(SSPIF==0);
   SSPIF=0;}

void resetADDRESS()
 {
   restart();
   buffer=0xd0;
   writebyte(buffer);
   buffer=0;
   writebyte(buffer);
    stop();
            }

void writebyte(uchar k)
 
  {
   SSPIF=0;
  SSPBUF=k;
  while(SSPIF==0);
   SSPIF=0;}

void readtimer()
 { 
   restart();
   buffer=0xd1;
ACKSTAT=1;
   writebyte(buffer);
if(ACKSTAT==1)
  {RA3=1;
while(1);}
   RCEN=1;
  while(SSPIF==0);
  SSPIF=0;
  timer[0]=SSPBUF;
 ACKDT=0;
 ACKEN=1;
 while(SSPIF==0);
 SSPIF=0;
 RCEN=1;
 while(SSPIF==0);
  SSPIF=0;
  timer[1]=SSPBUF;
 ACKDT=0;
 ACKEN=1;
 while(SSPIF==0);
 SSPIF=0;
RCEN=1;
 while(SSPIF==0);
  SSPIF=0;
  timer[2]=SSPBUF;
 ACKDT=0;
 ACKEN=1;
 while(SSPIF==0);
 SSPIF=0;
RCEN=1;
 while(SSPIF==0);
  SSPIF=0;
  timer[3]=SSPBUF;
 ACKDT=0;
 ACKEN=1;
 while(SSPIF==0);
 SSPIF=0;
RCEN=1;
 while(SSPIF==0);
  SSPIF=0;
  timer[4]=SSPBUF;
 ACKDT=0;
 ACKEN=1;
 while(SSPIF==0);
 SSPIF=0;
 RCEN=1;
 while(SSPIF==0);
  SSPIF=0;
  timer[5]=SSPBUF;
 ACKDT=0;
 ACKEN=1;
 while(SSPIF==0);
 SSPIF=0;
 RCEN=1;
 while(SSPIF==0);
  SSPIF=0;
  timer[6]=SSPBUF;
 ACKDT=1;
 ACKEN=1;
 while(SSPIF==0);
 SSPIF=0;
 stop();
                  }

  
void initialCLOCK()
{ restart();
  buffer=0xd0;
 ACKSTAT=1;
  writebyte(buffer);
if (ACKSTAT==1)
 {RA3=1;
  while(1);}
  buffer=0x00;
  writebyte(buffer);
  
  buffer=0x00;                  //初始化时间second=0,CH=0
  writebyte(buffer);  
  buffer=0;                  
  writebyte(buffer);           //minute=0  
  buffer=0x12;                  //hour=12,时间为24小时制时间初始化为12:00:00
  writebyte(buffer);             
  buffer=0x06;                 //week=6
  writebyte(buffer);
  buffer=0x16;                  //date=16
  writebyte(buffer); 
  buffer=0x02;                  //month=2
  writebyte(buffer);
  buffer=0x07;                  //year=2007
ACKSTAT=1;
  writebyte(buffer);
if (ACKSTAT==1)
 {RA3=1;
  while(1);}
  buffer=0x10;
  writebyte(buffer);
  stop();
     }
 
void initialLCD()
  {
     delay5ms();
   delay5ms();
delay5ms();
   E=1;
   RS=0;
   RW=0;
   PORTB=0x38;
   asm("nop"); 
   E=0;
   delay5ms();
   E=1;
   PORTB=0x38;
   asm("nop");
   E=0;
   delay5ms();
   E=1;
   asm("nop");
   PORTB=0x38;
  asm("nop");
   E=0;
   asm("nop");
 flag=1;
  while(flag==1)
  {readBUSY();
           }
  PORTB=0x38;    //功能设置:8位数据接口,2行显示,5X7点阵字符 
  asm("nop");
  E=0;
  flag=1;
  while(flag==1)
   {
    readBUSY();
           }
  PORTB=0x01;    //清屏
asm("nop");
  E=0;
flag=1;
  while(flag==1)
  {
    readBUSY();
                }
  PORTB=0x02;    //光标归位
asm("nop");
  E=0;
  flag=1;
  while(flag==1)
  {
    readBUSY();
               }
  PORTB=0x06;    //输入设置:地址指针自动增1,数据读写后画面不动
 asm("nop");
 
 flag=1;
  while(flag==1)
   {
     readBUSY();
                }
  PORTB=0x0c;    // 显示开关打开,光标和闪烁开关皆关断
  asm("nop");
E=0;
flag=1;
  while(flag==1)
   {
     readBUSY();
                }
RS=0;RW=0;
E=1;
PORTB=0xc0;
E=0;E=1;
flag=1;
  while(flag==1)
   {
     readBUSY();
                }
RS=1;
PORTB=0x4d; //M
E=0;E=1;
flag=1;
 while(flag==1)
   {
     readBUSY();
                }
RS=0;RW=0;
PORTB=0xc1;
E=0;E=1;
flag=1;
  while(flag==1)
   {
     readBUSY();
                }
RS=1;RW=0;
PORTB=0x69; //i
E=0;E=1;
flag=1;
  while(flag==1)
   {
     readBUSY();
                }
RS=0;RW=0;
PORTB=0xc2;
E=0;E=1;
flag=1;
  while(flag==1)
   {
     readBUSY();
                }
RS=1;RW=0;
PORTB=0x63; //c
E=0;E=1;
flag=1;
  while(flag==1)
   {
     readBUSY();
                }
RS=0;RW=0;
PORTB=0xc3;
E=0;E=1;
flag=1;
  while(flag==1)
   {
     readBUSY();
                }
RS=1;RW=0;
PORTB=0x72; //r
E=0;E=1;
flag=1;
  while(flag==1)
   {
     readBUSY();
                }
RS=0;RW=0;
PORTB=0xc4;
E=0;E=1;
flag=1;
  while(flag==1)
   {
     readBUSY();
                }
RS=1;RW=0;
PORTB=0x6f; //o
E=0;E=1;
flag=1;
  while(flag==1)
   {
     readBUSY();
                }
RS=0;RW=0;
PORTB=0xc5;
E=0;E=1;
flag=1;
  while(flag==1)
   {
     readBUSY();
                }
RS=1;RW=0;
PORTB=0x63; //c
E=0;E=1;
flag=1;
  while(flag==1)
   {
     readBUSY();
                }
RS=0;RW=0;
PORTB=0xc6;
E=0;E=1;
flag=1;
  while(flag==1)
   {
     readBUSY();
                }
RS=1;RW=0;
PORTB=0x68; //h
E=0;E=1;
flag=1;
  while(flag==1)
   {
     readBUSY();
                }
RS=0;RW=0;
PORTB=0xc7;
E=0;E=1;
flag=1;
  while(flag==1)
   {
     readBUSY();
                }
RS=1;RW=0;
PORTB=0x69; //i
E=0;E=1;
flag=1;
  while(flag==1)
   {
     readBUSY();
                }
RS=0;RW=0;
PORTB=0xc8;
E=0;E=1;
flag=1;
  while(flag==1)
   {
     readBUSY();
                }
RS=1;RW=0;
PORTB=0x70; //p
E=0;E=1;
flag=1;
  while(flag==1)
   {
     readBUSY();
                }
RS=0;RW=0;
PORTB=0xc9;
E=0;E=1;
flag=1;
  while(flag==1)
   {
     readBUSY();
                }
RS=1;RW=0;
PORTB=0x10; //""
E=0;E=1;
flag=1;
  while(flag==1)
   {
     readBUSY();
                }
RS=0;RW=0;
PORTB=0xca;
E=0;E=1;
flag=1;
  while(flag==1)
   {
     readBUSY();
                }
RS=1;RW=0;
PORTB=0x50; //P
E=0;E=1;
flag=1;
  while(flag==1)
   {
     readBUSY();
                }
RS=0;RW=0;
PORTB=0xcb;
E=0;E=1;
flag=1;
  while(flag==1)
   {
     readBUSY();
                }
RS=1;RW=0;
PORTB=0x49; //I
E=0;E=1;
flag=1;
  while(flag==1)
   {
     readBUSY();
                }
RS=0;RW=0;
PORTB=0xcc;
E=0;E=1;
flag=1;
  while(flag==1)
   {
     readBUSY();
                }
RS=1;RW=0;
PORTB=0x43; //C
E=0;E=1;
flag=1;
  while(flag==1)
   {
     readBUSY();
                }
RS=0;RW=0;
PORTB=0xcd;
E=0;E=1;
flag=1;
  while(flag==1)
   {
     readBUSY();
                }
RS=1;RW=0;
PORTB=0x10; //""
E=0;E=1;
         }

  void count()
   {
    if (timer[0]>9)                 //second>9s
      {buffer=timer[0];
       buffer&=0xf0;
       buffer>>=4;
       date[0]=buffer;
       timer[0]&=0x0f;
       date[1]=timer[0];
       
                 }
     else 
      {date[0]=0;
     date[1]=timer[0];}
    if (timer[1]>9)               //minute>9min
      {buffer=timer[1];
      buffer&=0xf0;
       buffer>>=4;
        date[2]=buffer;
        timer[1]&=0x0f;
       date[3]=timer[1];
                 }
     else 
      {date[2]=0;
     date[3]=timer[1];}
  if (timer[2]>9)                   //hour>9hour
      {buffer=timer[2];
       buffer&=0xf0;
       buffer>>=4;
      date[4]=buffer;
      timer[2]&=0x0f;
     date[5]=timer[2];
                    }
     else 
      {date[4]=0;
     date[5]=timer[2];
                 }
    date[6]=timer[3];
   if (timer[4]>9)
      {buffer=timer[4];
      buffer&=0xf0;
      buffer>>=4;
      date[7]=buffer;
      timer[4]&=0x0f;
      date[8]=timer[4];
      
                    }
     else 
      {date[7]=0;
     date[8]=timer[4];}
if (timer[5]>9)
      {buffer=timer[5];
       buffer&=0xf0;
     buffer>>=4;
    date[9]=buffer;
   timer[5]&=0x0f;
  date[10]=timer[5];
       
                 }
     else 
      {date[9]=0;
     date[10]=timer[5];
                        }
    date[11]=0;
   date[12]=timer[6];
                             }

void display()
 {
  flag=1;
  while(flag==1)
  {readBUSY();
     }
 
  PORTB=0x85;     //设置显示的字符的首地址在第1行第5列
 asm("nop"); 
 E=0;
  flag=1;
 asm("nop");
   while(flag==1)
   {readBUSY();}
   RS=1;
  RW=0;
   asm("nop");
   PORTB=table[date[4]];
  asm("nop");
   E=0;
   flag=1;
   while(flag==1)
   {readBUSY();}
   RS=1;
  RW=0;
   asm("nop");
   PORTB=table[date[5]];
  asm("nop");
   E=0;
flag=1;
 while(flag==1)
 {readBUSY();}
   
   RS=1;
  RW=0;
   asm("nop");
   PORTB=table[10];
  asm("nop");
   E=0;
  flag=1;
 while(flag==1)
 {readBUSY();}
  
   RS=1;
  RW=0;
   asm("nop");
   PORTB=table[date[2]];
  asm("nop");
   E=0;

  flag=1;
  asm("nop");
   while(flag==1)
   {readBUSY();}
   RS=1;
   RW=0;
   asm("nop");
   PORTB=table[date[3]];
   asm("nop");
   E=0;
flag=1;
 asm("nop");
   while(flag==1)
   {readBUSY();}
   RS=1;
  RW=0;
   asm("nop");
   PORTB=table[10];
  asm("nop");
   E=0;

 flag=1;
asm("nop");
   while(flag==1)
   {readBUSY();}
   RS=1;
  RW=0;
   asm("nop");
   PORTB=table[date[0]];
  asm("nop");
   E=0;
    flag=1;
 asm("nop");
   while(flag==1)
   {readBUSY();}
   RS=1;
  RW=0;
   asm("nop");
   PORTB=table[date[1]];
  asm("nop");
   E=0;         

                 }
 /*******************/
void  main()
{ flag=1;
 initialIO();
 initialI2C();
 resetADDRESS();
 initialCLOCK();
 initialLCD();
 //while(1);
 while(1)
{ 
 resetADDRESS();
  readtimer();
  count();
  display();}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -