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

📄 main.c

📁 改程序为基于STC单片机的实时时钟芯片8563在液晶屏上显示实时时钟的程序。 单片机型号为:STC89C52RC 用的是1602字符液晶
💻 C
字号:

#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int 

#define true 1
#define false 0 

sbit SDA=P3^7;
sbit SCL=P3^6;

sbit write=0xA2;
sbit read=0xA3;


sbit a_138=P2^2;
sbit b_138=P2^3;
sbit c_138=P2^4;
sbit cs_138=P2^6;
sbit cs_373=P2^5;


unsigned code zima1[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
                        //{0x88,0x83,0xc6,0xa1,0x86,0x8e};
unsigned char zima2[10];
unsigned code zima3[]={0xbf};//显示"-";

/*以下是显示函数的声明*/
void delay();
void xianshi();
void shuju(unsigned int i);

/*---------------以下是pcf8563的函数声明---------------------------*/
void delay_iic(void);
void I2CStart(void);                    
void I2CStop(void);	                
bit WaitAck(void);	                     
void SendAck(void);           
void SendNotAck(void);
void SendNotAck(void);
void I2CSendByte(uchar);
uchar I2CReceiveByte(void);
void GetPCF8563(uchar ,uchar ,uchar *);
void SetPCF8563(uchar ,uchar );
void SetAlarm(uchar alarmtype,uchar count);
void CleanAlarm(void);    
void I2CInit(void);


main()
{
	idata uchar rom_sed[9];            //定义保存时间初值的数组
    idata uchar rom_rec[7];            //定义保存读取时间的数组
    idata uint i;
   
	 cs_138=1;
	 cs_373=1;
     rom_sed[0]=0x00; rom_sed[1]=0x00;  //要发送的数据初始化
     rom_sed[2]=0x00; rom_sed[3]=0x05;
     rom_sed[4]=0x11; rom_sed[5]=0x15;
     rom_sed[6]=0x04; rom_sed[7]=0x03;
     rom_sed[8]=0x07;

    for (i=0;i<9;i++)
     {
       SetPCF8563(i,rom_sed[i]);        //设定时间初值,2007年03月15日11点05分0秒
     }
   

     while(1)
      {
         
		 GetPCF8563(0x02,0x07, rom_rec); //读取时间信息,并将其保存在rom_rec 中 
         //for(i=0;i<15;i++)
		 xianshi();
         zima2[6]=(rom_rec[0]&0xf0)/16;      //BCD码取各个位
         zima2[7]=rom_rec[0]&0x0f;      // rom_rec[0]中存放的是"秒"数据

		 xianshi();

		 zima2[3]=(rom_rec[1]&0xf0)/16;      //BCD码取各个位
         zima2[4]=rom_rec[1]&0x0f;      // rom_rec[1]中存放的是"分"数据
 
		 xianshi();

		 zima2[0]=(rom_rec[2]&0x30)/16;      //BCD码取各个位
         zima2[1]=rom_rec[2]&0x0f;      // rom_rec[2]中存放的是"小时"数据
		 xianshi();
	 
      }


}




void delay()
{
	unsigned char i;
	for(i=0;i<80;i++);
}


void xianshi(void)   //LED显示的数据
 {
	    
        P0=zima1[zima2[0]];//所要显示的数据
		P2=0xbf|0x60; //所要显示的数据位置
    	delay();
		P0=zima1[zima2[1]];//所要显示的数据
		P2=0xbb|0x60; //所要显示的数据位置
    	delay();
		P0=zima3[zima2[2]];//所要显示的"-";
		P2=0xb7|0x60; //所要显示的数据位置
    	delay(); 
		P0=zima1[zima2[3]];//所要显示的数据
		P2=0xb3|0x60;//所要显示的数据位置
    	delay();
		P0=zima1[zima2[4]];//所要显示的数据
		P2=0xaf|0x60;//所要显示的数据位置
    	delay();
		P0=zima3[zima2[5]];//所要显示的"-";
		P2=0xab|0x60;//所要显示的数据位置
	    delay(); 
		P0=zima1[zima2[6]];//所要显示的数据
		P2=0xa7|0x60;//所要显示的数据位置
	    delay();
		P0=zima1[zima2[7]];//所要显示的数据
		P2=0xa3|0x60;//所要显示的数据位置
	    delay();   
 }

 void shuju(unsigned int i)
  {
	unsigned int k;
	zima2[0]=i/10000;    //所要显示的数字
	xianshi();
	zima2[1]=(i/1000)%10;
	xianshi();
	zima2[2]=(i/100)%10;
	xianshi();
	zima2[3]=(i/10)%10;
	xianshi();
	zima2[4]=i%10;
	xianshi();
	for(k=0;k<1000;k++)
	xianshi();
  }



 ///////////*以下是8563的初始化*///////////////
 void delay_iic(void)              /*延时子程序*/
 { 
   _nop_();
 }


void I2CInit()
{
  SCL=0;
  I2CStop();
}

void I2CStart(void)                 /*启动I2C总线*/
{ 
  EA=0;
  SDA=1; 
  delay_iic();
  SCL=1; 
  delay_iic();
  SDA=0; 
  delay_iic(); 
  SCL=0;
  delay_iic();
}

void I2CStop(void)                  /*停止I2C总线*/
{
 SDA=0;
 delay_iic();
 SCL=1; 
 delay_iic(); 
 SDA=1; 
 delay_iic(); 
 SCL=0; 
 delay_iic(); 
 EA=1;
}

bit WaitAck(void)                 
{
  uchar errtime=255;                //因故障接收方无ACK,超时值为255。
  SDA=1;
  delay_iic();
  SCL=1;
  delay_iic();
  while(SDA) 
   { 
     errtime--; 
     if (!errtime) 
       { 
         I2CStop();
         //SystemError=0x11;
         return false;
        }
     }
   SCL=0;
  return true;
 }

void SendAck(void)             
{
  SDA=0; 
  delay_iic();
  SCL=1; 
  delay_iic();
  SCL=0;
}

void SendNotAck(void)        
{ 
  SDA=1;
  delay_iic();
  SCL=1; 
  delay_iic();
  SCL=0;
}

void I2CSendByte(uchar ch)    /*发送一个字节*/
{
  uchar i=8;
  while (i--)
  {
    SCL=0;
    delay_iic();
    SDA=(bit)(ch&0x80);
    ch<<=1; 
    delay_iic();
    SCL=1; 
    delay_iic();
   }
  SCL=0;
 }

uchar I2CReceiveByte(void)   /*接收一个字节*/
{
  uchar i=8;
  uchar ddata=0;
  SDA=1;
  while (i--)
  {
    ddata<<=1;
    SCL=0;
    delay_iic();
    SCL=1;
    delay_iic();
    ddata|=SDA;
  }
  SCL=0;
  return ddata;
 }

/*-- 以下函数的功能为:读取时钟芯片PCF8563的时间,设置要读的第一个时间类型firsttype

⌨️ 快捷键说明

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