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

📄 1302 -

📁 1302 时钟显示程序
💻
字号:
#include<reg52.h>
#include<absacc.h> 

#define uchar unsigned char 	
#define uint  unsigned int

unsigned second,minute,hour,day,month,week,year;
char cashe[4];


/*****************************************************************************************************/	 
/*sbit ds=P0^0;  //数据打入口
sbit E1=P2^4;  //74HC154-E1 为0开列输出  显示允许控制信号端口
sbit stcp=P0^2;		//74HC595-ST_CP 上升沿--移位寄存器的数据进入数据存储寄存器 输出锁存器的时钟信号端口
sbit shcp=P0^1;    //移位数据脉冲位数据脉冲位数据脉冲位数据脉冲
sbit MR=P0^3;	   	//74HC595-MR 为0将移位寄存器的数据清0
/*****************************************************************************************************/	 

//74HC595管脚定义
sbit ds=P1^0;
sbit E1=P2^4;
sbit stcp=P1^1;
sbit shcp=P1^2;
sbit MR=P1^3;

//按键管脚定义
sbit KEY_1  = P1^1;  
sbit KEY_2  = P1^2;                                                           
sbit KEY_3  = P1^0;

//DS1302管脚定义
sbit T_CLK  = P3^4;  //ds1302_clk(时钟线)
sbit T_IO   = P3^5;   //ds1302_dat(数据线)
sbit T_RST  = P3^6; 	//ds1302_Rst(复位线)

sbit ACC0   = ACC^0;
sbit ACC1   = ACC^1;
sbit ACC2   = ACC^2;
sbit ACC3   = ACC^3;
sbit ACC4   = ACC^4;
sbit ACC5   = ACC^5;
sbit ACC6   = ACC^6;
sbit ACC7   = ACC^7;

unsigned char idata Dis[4];

unsigned char code font[]={

0x00,0x00,0xE0,0x0F,0x10,0x10,0x08,0x20,0x08,0x20,0x10,0x10,0xE0,0x0F,0x00,0x00,/*"0",0*/

0x00,0x00,0x10,0x20,0x10,0x20,0xF8,0x3F,0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00,/*"1",1*/

0x00,0x00,0x70,0x30,0x08,0x28,0x08,0x24,0x08,0x22,0x88,0x21,0x70,0x30,0x00,0x00,/*"2",2*/

0x00,0x00,0x30,0x18,0x08,0x20,0x88,0x20,0x88,0x20,0x48,0x11,0x30,0x0E,0x00,0x00,/*"3",3*/

0x00,0x00,0x00,0x07,0xC0,0x04,0x20,0x24,0x10,0x24,0xF8,0x3F,0x00,0x24,0x00,0x00,/*"4",4*/

0x00,0x00,0xF8,0x19,0x08,0x21,0x88,0x20,0x88,0x20,0x08,0x11,0x08,0x0E,0x00,0x00,/*"5",5*/

0x00,0x00,0xE0,0x0F,0x10,0x11,0x88,0x20,0x88,0x20,0x18,0x11,0x00,0x0E,0x00,0x00,/*"6",6*/

0x00,0x00,0x38,0x00,0x08,0x00,0x08,0x3F,0xC8,0x00,0x38,0x00,0x08,0x00,0x00,0x00,/*"7",7*/

0x00,0x00,0x70,0x1C,0x88,0x22,0x08,0x21,0x08,0x21,0x88,0x22,0x70,0x1C,0x00,0x00,/*"8",8*/

0x00,0x00,0xE0,0x00,0x10,0x31,0x08,0x22,0x08,0x22,0x10,0x11,0xE0,0x0F,0x00,0x00,/*"9",9*/

0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x30,0xC0,0x30,0x00,0x00,0x00,0x00,0x00,0x00,/*":",10*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",11*/
};

/******************************************************************************************* 
*  函数名: Delay    
*  功能描述:  
*  入口参数:  无 
*  出口参数:  无 
*******************************************************************************************/ 
/*void Delay(unsigned int i)
{
 	unsigned int j;
	for(j=0;j<i;j++);
}
 */
/******************************************************************************************* 
*  函数名: disp_1000ms 
*  功能描述:  
*  入口参数:  无 
*  出口参数:  无 
*******************************************************************************************/ 
void disp_1000ms(void)	//精确延时1ms
{
  /* unsigned char a,b,c;	  //1ms
    for(c=2;c>0;c--)
        for(b=142;b>0;b--)
            for(a=2;a>0;a--); 
   /* unsigned char a,b;	//2ms
    for(b=4;b>0;b--)
        for(a=248;a>0;a--);	*/

	unsigned char a,b;	  //0.5m 	 
    for(b=5;b>0;b--)  //11
        for(a=2;a>0;a--); 

	
}


//时钟数据(7字节BCD码)格式为: 秒   分   时   日    月星期   年-----------------------------
unsigned char idata Time[7];

/******************************************************************************************* 
*  函数名: BCD2HEX    
*  功能描述: BCD码转换成十进制 
*  入口参数:  无 
*  出口参数:  无 
*******************************************************************************************/ 
unsigned char BCD2HEX(unsigned char BCDChar)     
{ 
    unsigned char temp; 
    temp=(BCDChar/16*10+BCDChar%16); 
    return temp; 
} 
/******************************************************************************************* 
*  函数名: HEX2BCD    
*  功能描述:  十进制转换成BCD码
*  入口参数:  无 
*  出口参数:  无 
*******************************************************************************************/  
unsigned char HEX2BCD(unsigned char HEXChar) 
{
    unsigned char temp; 
    temp=(HEXChar/10*16+HEXChar%10); 
    return temp; 
}
/******************************************************************************************* 
*  函数名: WriteByteDS1302    
*  功能描述:  
*  入口参数:  无 
*  出口参数:  无 
*******************************************************************************************/  
void WriteByteDS1302(unsigned char Data) 
{ 
    unsigned char i;
    ACC = Data;
    for(i=8; i>0; i--)
    {
        T_IO = ACC0;         
        T_CLK = 1;
        T_CLK = 0;
        ACC = ACC >> 1; 
    } 
}
/******************************************************************************************* 
*  函数名: ReadByteDS1302    
*  功能描述:  
*  入口参数:  无 
*  出口参数:  无 
*******************************************************************************************/  
unsigned char ReadByteDS1302(void) 
{ 
    unsigned char i;
    for(i=8; i>0; i--)
    {
        ACC = ACC >>1;       
        ACC7 = T_IO;
        T_CLK = 1;
        T_CLK = 0;
    } 
    return(ACC); 
}
/******************************************************************************************* 
*  函数名: WriteDS1302    
*  功能描述:  
*  入口参数:  无 
*  出口参数:  无 
*******************************************************************************************/  
void WriteDS1302(unsigned char Addr,unsigned char Data)
{
    T_RST = 0;
    T_CLK = 0;
    T_RST = 1;
    WriteByteDS1302(Addr);    
    WriteByteDS1302(Data);  
    T_CLK = 1;
    T_RST = 0;
}
/******************************************************************************************* 
*  函数名: ReadDS1302    
*  功能描述:  
*  入口参数:  无 
*  出口参数:  无 
*******************************************************************************************/  
unsigned char ReadDS1302(unsigned char Addr)
{
    unsigned char Data;
    T_RST = 0;
    T_CLK = 0;
    T_RST = 1;
    WriteByteDS1302(Addr);          
    Data = ReadByteDS1302();     
    T_CLK = 1;
    T_RST = 0;
    return(Data);
}
/******************************************************************************************* 
*  函数名: Set    
*  功能描述:  
*  入口参数:  无 
*  出口参数:  无 
*******************************************************************************************/ 
/*void Set(unsigned char sel,unsigned char selby) 
{
    unsigned char address,item;
    unsigned char max,min;

    if(sel==0)  {address=0x80; max=59;min=0;}    //秒
    if(sel==1)  {address=0x82; max=59;min=0;}    //分钟
    if(sel==2)  {address=0x84; max=23;min=0;}    //小时
    if(sel==3)  {address=0x86; max=31;min=1;}    //日
    if(sel==4)  {address=0x88; max=12;min=1;}    //月
    if(sel==5)  {address=0x8a; max=7; min=1;}    //星期
    if(sel==6)  {address=0x8c; max=99;min=0;}    //年
    if(sel==7)  {address=0xc0; max=59;min=0;}    //闹钟分钟
    if(sel==8)  {address=0xc2; max=23;min=0;}    //闹钟小时

    item=ReadDS1302(address+1)/16*10+ReadDS1302(address+1)%16;
    if (selby==0) item++;  else item--;
    if(item>max) item=min;   
    if(item<min) item=max;
           
    WriteDS1302(0x8e,0x00);
    WriteDS1302(address,item/10*16+item%10);
    WriteDS1302(0x90,0xa5); 
    WriteDS1302(0x8e,0x80);  
}
*/
/******************************************************************************************* 
*  函数名: SetTime    
*  功能描述:  
*  入口参数:  无 
*  出口参数:  无 
*******************************************************************************************/  
/*void SetTime(unsigned char  *pClock) 
{
    unsigned char  h;
    unsigned char  Addr=0x80; 
    WriteDS1302(0x8e,0x00);        
    for(h=7; h>0; h--)
    { 
        WriteDS1302(Addr,*pClock); 
        pClock++;
        Addr+=2;
    }
    WriteDS1302(0x90,0xa5); 
	WriteDS1302(0x8e,0x80);      
}*/
/******************************************************************************************* 
*  函数名: ReadTime    
*  功能描述:  
*  入口参数:  无 
*  出口参数:  无 
*******************************************************************************************/  
void ReadTime()
{
    second = BCD2HEX(Time[0]=ReadDS1302(0x81)); 
	minute = BCD2HEX(Time[1]=ReadDS1302(0x83));
	hour   = BCD2HEX(Time[2]=ReadDS1302(0x85));
	day    = BCD2HEX(Time[3]=ReadDS1302(0x87));
	month  = BCD2HEX(Time[4]=ReadDS1302(0x89));
	year   = BCD2HEX(Time[5]=ReadDS1302(0x8d));
    week   = BCD2HEX(Time[6]=ReadDS1302(0x8b));
}
/******************************************************************************************* 
*  函数名: WriteTime    
*  功能描述:  
*  入口参数:  无 
*  出口参数:  无 
*******************************************************************************************/ 
void WriteTime()
{
    WriteDS1302(0x8e,0x00); 
    WriteDS1302(0x80,HEX2BCD(second));
	WriteDS1302(0x82,0x23);//WriteDS1302(0x82,HEX2BCD(minute));
	WriteDS1302(0x84,0x12);//WriteDS1302(0x84,HEX2BCD(hour));
	WriteDS1302(0x86,HEX2BCD(day));
	WriteDS1302(0x88,HEX2BCD(month));
	WriteDS1302(0x8A,HEX2BCD(week));
    WriteDS1302(0x8C,HEX2BCD(year));
    WriteDS1302(0x90,0xa5); 
	WriteDS1302(0x8e,0x80);
}

/******************************************************************************************* 
*  函数名: shcp2
*  功能描述:  595数据传送
*  入口参数:  无 
*  出口参数:  无 
*******************************************************************************************/ 
void shcp2(uchar temp1)
{
    uchar i;
    for (i=0;i<8;i++)
			{
				shcp=0;
				temp1=temp1<<1;
				ds=CY;
 				shcp=1;
				shcp=0;
		} 
}		

/******************************************************************************************* 
*  函数名: send
*  功能描述:  
*  入口参数:  无 
*  出口参数:  无 
*******************************************************************************************/ 
void send(void)
{
  char i,ii,j,m=0,n=2,mm=0;
  char temp;
  for(i=0;i<16;i++)
  {
   	ii=i*2;
		if(i>=8)   //如果i<8则加载小时和分钟的十位数,否则加载小时和分钟的个位数
	     {m=1;n=3;mm=16;}
		if(m==1&&i==15)
		{
			if((second%10)%2)
			 {
				cashe[3-j]=font[Dis[m]*16+ii-mm];	 //小时	十位数
				j++;
				cashe[3-j]=font[Dis[m]*16+ii+1-mm];	  
				j++;
			 }
			 else
			 {
				 cashe[3-j]=0x60;	 //小时	十位数
				j++;
				cashe[3-j]=0x0C;	  
				j++;
			 }

		}
		else
		{
			cashe[3-j]=font[Dis[m]*16+ii-mm];	 //小时	十位数
			j++;
			cashe[3-j]=font[Dis[m]*16+ii+1-mm];	  
			j++;
		}
   /*************************************/
		if(i==0&&n==2)
		 {
		  	if((second%10)%2)
			{
			    cashe[3-j]=font[Dis[n]*16+ii-mm];	
				j++;
				cashe[3-j]=font[Dis[n]*16+ii+1-mm];	//分钟十位数
				j=0;
			}
			else
			{
			  	 cashe[3-j]=0x60;	
				j++;
				cashe[3-j]=0x0C;	//分钟十位数
				j=0;
			}
		 }
		 else
		 {
			cashe[3-j]=font[Dis[n]*16+ii-mm];	
			j++;
			cashe[3-j]=font[Dis[n]*16+ii+1-mm];	//分钟十位数
			j=0;
		 }
   		for(ii=0;ii<4;ii++)
	     {
	          temp =cashe[ii];				
			  shcp2(temp);
	      }  
		E1=1;	
		P2=i;
		E1=0;
		stcp=1;
		disp_1000ms();
		stcp=0;
  
   }



  }




/******************************************************************************************* 
*  函数名: init   
*  功能描述:  
*  入口参数:  无 
*  出口参数:  无 
*******************************************************************************************/ 
void init(void)
{
   //EA=1;    
   // SCON=0;//串口方式0
    ReadTime();//读取时间
	disp_1000ms();
    Dis[0]=hour/10;	//取小时的十位数
	Dis[1]=hour%10;	//取小时的个位数
    Dis[2]=minute/10;//取分钟的十位数
    Dis[3]=minute%10;//取分钟的个位数

}

void main(void)
{
   	 uint rows=sizeof(font);	//计算字模总数
	 disp_1000ms();
//	 WriteTime();	 //时间初始化...
	 disp_1000ms();
	  init();  //读取时间
	  while(1)
	  {
	    init(); //读取时间
		disp_1000ms();
		if(hour/10==0)  //如果小时的十位数是零,则不显示
		{
	   		Dis[0]=11;
			if((hour/10==0)&(hour%10==0))//如果小时十位数为零,且个位数也为零,则为零零
			Dis[0]=0;
		}
		else 
		Dis[0]=hour/10;
		Dis[1]=hour%10;
	/*	if(minute/10==0)	//如果分钟的十位数是零,则不显示
		Dis[2]=0;
		else
		Dis[2]=minute/10;*/
		send();
	  disp_1000ms();
	   }
}

⌨️ 快捷键说明

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