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

📄 timeshow.c

📁 这是一个基于ADI公司的ARM开发板实现的一个时钟显示程序。
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <aduc7026.h>
#define uint8    unsigned char
#define uint16   unsigned short int
#define uint32   unsigned long int
#define DS1302_CLK  0    //实时时钟时钟线引脚 
#define DS1302_IO   1    //实时时钟数据线引脚 
#define DS1302_RST  2    //实时时钟复位线引脚
#define prt_set_clk()	     GP4SET=(1<<(DS1302_CLK+16))
#define prt_clear_clk()	     GP4CLR=(1<<(DS1302_CLK+16))
#define prt_set_io()		 GP4SET=(1<<(DS1302_IO+16))
#define prt_clear_io()	     GP4CLR=(1<<(DS1302_IO+16))
#define prt_set_rst()		 GP4SET=(1<<(DS1302_RST+16))
#define prt_clear_rst() 	 GP4CLR=(1<<(DS1302_RST+16))
#define Setds1302dataIn()    GP4DAT &=~(uint32)(1<<(DS1302_IO+24))
#define Setds1302dataOut()   GP4DAT |=(uint32)(1<<(DS1302_IO+24))
char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year,hide_longitude_integer,hide_longitude_frag,hide_latitude_integer,hide_latitude_frag;  //秒,分,时到日,月,年位闪的计数
#define Set   3     //模式切换键
#define Up    4      //加法按钮
#define Down  5    //减法按钮			     
#define out   6    //立刻跳出调整模式按钮
uint8 done,count,flag,up_flag,down_flag;
signed  char   temp	  ;
uint8 longitude[6],latitude[5];
int longitude_integer=123,longitude_frag=24,latitude_integer=90,latitude_frag=23;
 /******液晶屏显示程序*****/
#define uint8    unsigned char
#define uint16   unsigned short int
#define uint32   unsigned long int
#define LCD_RS   (1<<17) //P0.1接RS
#define LCD_RW   (1<<18) //P0.2接RW
#define LCD_E    (1<<19) //P0.3接E
#define LCD_BUSY 0x00800000

void Delayms(uint32 count)
{
 uint32 i;
 for(i=0;i<count;i++);
}


void LCD_ChkBusy(void)
{

 GP0DAT=0xff000000;

 GP0CLR=LCD_RS;
 GP0SET=LCD_RW;
 GP0SET=LCD_E;
 while((GP0DAT&LCD_BUSY)!=0);
 Delayms(400);
 GP0CLR=LCD_E;

}

void LCD_WriteCommand(uint8 cmd,uint8 busyc)
{
  if(busyc) LCD_ChkBusy();
 
  GP0CLR=LCD_E;
  GP0CLR=LCD_RS;
  GP0CLR=LCD_RW;
  GP1CLR=0x00ff0000;  //清零数据位D0-D7
  GP1DAT=(cmd<<16);
  GP1DAT|=0xff000000;
  GP0SET=LCD_E;       //LCD使能
  Delayms(400);
  GP0CLR=LCD_E; 
}

void LCD_WriteData(uint8 dat)
{
  LCD_ChkBusy();
  
  GP0CLR=LCD_E;
  GP0SET=LCD_RS;
  GP0CLR=LCD_RW;
  GP1CLR=0x00ff0000;
  GP1DAT=(dat<<16);
  GP1DAT|=0xff000000;
  GP0SET=LCD_E;
  Delayms(400);
  GP0CLR=LCD_E; 
}

void LCD_Init()
{
 Delayms(1000);
 LCD_WriteCommand(0x38,0);//三次显示模式设置,不检测忙信号
 Delayms(400);
 LCD_WriteCommand(0x38,0);
 Delayms(400);
 LCD_WriteCommand(0x38,0);
 Delayms(2800);
 LCD_WriteCommand(0x38,1);//显示模式设置,开始要求检测忙信号:8位、2行、5X7点阵
 Delayms(2800);
 LCD_WriteCommand(0x08,1);//关闭显示
 Delayms(2800);
 LCD_WriteCommand(0x01,1);//清屏
 Delayms(2800);
 LCD_WriteCommand(0x06,1);//显示光标移动设置:文字不动,光标自动右移
 Delayms(2800);
 LCD_WriteCommand(0x0C,1);//显示开及光标设置:光标关、光标不闪烁
}

void LCD_SetPointion(uint8 x)
{
   LCD_WriteCommand(x|0x80,0);
}

void LCD_PrintChar(uint8 lcd_data)          //输出一个字符到LCD
{
   LCD_WriteData(lcd_data);
}

void LCD_PrintString(uint8 *lcd_string)       //输出一个字符串到LCD
{
 uint8 i=0;
 while(lcd_string[i]!=0)
  {
   LCD_WriteData(lcd_string[i]);
   i++;
  } 
}


/*
int main(void)
{ 
 uint8 Text1[]="Nice to See You!";
 uint8 Text2[]="  QQ: 52626392  ";
 
   // PINSEL0=0x00000000;
    GP1DAT =0xffff0000;
	GP0DAT =0xe0000000;
 LCD_Init();
 while(1)
 {
    LCD_SetPointion(0);
    LCD_PrintString(Text1);
    LCD_SetPointion(0x40);
    LCD_PrintString(Text2); 
 }
}
*/


/***********DS1302时钟部分子程序******************/
typedef struct __SYSTEMTIME__
{
	unsigned char Second;
	unsigned char Minute;
	unsigned char Hour;
	unsigned char Week;
	unsigned char Day;
	unsigned char Month;
	unsigned char  Year;
	unsigned char DateString[11];
	unsigned char TimeString[9];
}SYSTEMTIME;	//定义的时间类型
SYSTEMTIME CurrentTime;


#define AM(X)	X
#define PM(X)	(X+12)            	  // 转成24小时制
#define DS1302_SECOND	0x80          //时钟芯片的寄存器位置,存放时间
#define DS1302_MINUTE	0x82
#define DS1302_HOUR		0x84 
#define DS1302_WEEK		0x8A
#define DS1302_DAY		0x86
#define DS1302_MONTH	0x88
#define DS1302_YEAR		0x8C 

void DS1302InputByte(unsigned char d) 	//实时时钟写入一字节(内部函数)
{ 
    unsigned char i;
	 Setds1302dataOut() ; 
    for(i=8; i>0; i--)
    {  if(d&0x01)
	   	prt_set_io();
		else 
		prt_clear_io();
	    prt_set_clk();	     					  
        prt_clear_clk();
		d=d>>1;
        
    } 
}

unsigned char DS1302OutputByte() 	//实时时钟读取一字节(内部函数)
{ 
    uint8 i;
	uint8  R_Byte,mid;
	 Setds1302dataIn()  ;	 
    for(i=8; i>0; i--)
    { R_Byte= R_Byte>>1;
	 mid=(GP4DAT>>DS1302_IO)&0x01 ;
	 mid=(mid<<7)&0x80 ;
	 R_Byte=mid|R_Byte ;
	 
	 prt_set_clk();	     
     prt_clear_clk(); 
    } 
    return(R_Byte) ;
}

void Write1302(uint8 ucAddr, uint8 ucDa)	//ucAddr: DS1302地址, ucData: 要写的数据
{
     prt_clear_rst();
     prt_clear_clk();
     prt_set_rst();
     DS1302InputByte(ucAddr);       	// 地址,命令	   
     DS1302InputByte(ucDa);       	// 写1Byte数据
     prt_set_clk();	  
     prt_clear_rst();
} 

unsigned char Read1302(uint8 ucAddr)	//读取DS1302某地址的数据
{
      uint8 ucData;
      prt_clear_rst();
	  prt_clear_clk();
  	  prt_set_rst();
      DS1302InputByte(ucAddr|0x01);        // 地址,命令 
      ucData = DS1302OutputByte();         // 读1Byte数据
	  prt_set_clk();	 
   	  prt_clear_rst();
     return(ucData);
}



void DS1302_GetTime(SYSTEMTIME *Time)  //获取时钟芯片的时钟数据到自定义的结构型数组
{
	unsigned char ReadValue;

	ReadValue = Read1302(DS1302_SECOND);
	Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
	ReadValue = Read1302(DS1302_MINUTE);
	Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
	ReadValue = Read1302(DS1302_HOUR);
	Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
	ReadValue = Read1302(DS1302_DAY);
	Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);	
	ReadValue = Read1302(DS1302_MONTH);
	Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
	ReadValue = Read1302(DS1302_YEAR);
	Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);	
}

void DateToStr(SYSTEMTIME *Time)    //将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里DateString[]
{   if(hide_year<2)                 //这里的if,else语句都是判断位闪烁,<2显示数据,>2就不显示,输出字符串为 2007/07/22
    {                               
	  Time->DateString[0] = '2';
	  Time->DateString[1] = '0';	 
	  Time->DateString[2] = Time->Year/10 + '0';
	  Time->DateString[3] = Time->Year%10 + '0';
	}
	  else
	    { 
	      Time->DateString[0] = ' ';
	      Time->DateString[1] = ' ';		 
	      Time->DateString[2] = ' ';
	      Time->DateString[3] = ' ';
		}
	if(hide_month<2)
	{
	  Time->DateString[4] = Time->Month/10 + '0';
	  Time->DateString[5] = Time->Month%10 + '0';
	}
	  else
	  {
	    Time->DateString[4] = ' ';
	    Time->DateString[5] = ' ';
	  }
	if(hide_day<2)
	{
	  Time->DateString[6] = Time->Day/10 + '0';
	  Time->DateString[7] = Time->Day%10 + '0';
	}
	  else
	  {
	    Time->DateString[6] = ' ';
	    Time->DateString[7] = ' ';	    
	  }

	Time->DateString[8] = '\0'; //字符串末尾加 '\0' ,判断结束字符
}

void TimeToStr(SYSTEMTIME *Time)  //将时,分,秒数据转换成液晶显示字符放到数组 TimeString[];
{   if(hide_hour<2)
    {
	  Time->TimeString[0] = Time->Hour/10 + '0';
	  Time->TimeString[1] = Time->Hour%10 + '0';
	}
	  else
	    {
	      Time->TimeString[0] = ' ';
	      Time->TimeString[1] = ' ';
		}
	Time->TimeString[2] = ':';
    if(hide_min<2)
	{
	  Time->TimeString[3] = Time->Minute/10 + '0';
	  Time->TimeString[4] = Time->Minute%10 + '0';
	}
	  else
	    {
	      Time->TimeString[3] = ' ';
	      Time->TimeString[4] = ' ';
   	    }
	Time->TimeString[5] = ':';
    if(hide_sec<2)
    {
	  Time->TimeString[6] = Time->Second/10 + '0';
	  Time->TimeString[7] = Time->Second%10 + '0';
    }
      else
       {
         Time->TimeString[6] = ' ';
	     Time->TimeString[7] = ' ';
       }
	Time->DateString[8] = '\0';
}
void longitudeTostr(void)
   {
   if(hide_longitude_integer<2)
  { longitude[0]=longitude_integer/100+'0';
   longitude[1]=(longitude_integer/10)%10+'0';
   longitude[2]=longitude_integer%10+'0';}
   else
   {
     longitude[0]= ' ';
     longitude[1]= ' ';
     longitude[2]= ' ';
   }
   longitude[3]='.';
   if(hide_longitude_frag<2)
   {
   longitude[4]=longitude_frag/10+'0';
   longitude[5]=longitude_frag%10+'0';
   }
   else
   {
    longitude[4]=' ';
    longitude[5]=' ';  
   }
   } 
void latitudeTostr(void)
 {
    if(hide_latitude_integer<2)
  { latitude[0]=latitude_integer/10+'0';
    latitude[1]=latitude_integer%10+'0';}
   else
   {
     latitude[0]= ' ';
     latitude[1]= ' ';
   }
  latitude[2]='.';
   if(hide_latitude_frag<2)
   {
   latitude[3]=latitude_frag/10+'0';
   latitude[4]=latitude_frag%10+'0';
   }
   else
   {
    latitude[3]=' ';
    latitude[4]=' ';  
   } 
 }

void Initial_DS1302()   //时钟芯片初始化
 {   
	 uint32 Second=Read1302(DS1302_SECOND);
	 
    
	Write1302(0x8e,0x00); //写入允许
	Write1302(0x8c,0x08); //以下写入初始化时间 日期:07/07/25.星期: 3. 时间: 23:59:55
	Write1302(0x88,0x08);
	Write1302(0x86,0x14);
	Write1302(0x8a,0x02);
	Write1302(0x84,0x15);
	Write1302(0x82,0x00);
	Write1302(0x80,0x01);
	Write1302(0x8e,0x80); //禁止写入

	

}
void Delay1ms(uint16 count)
{
	uint16 i,j;
	for(i=0;i<count;i++)
	for(j=0;j<120;j++);
}

/*延时子程序*/ 
void mdelay(uint16 delay)
{	uint16 i;
 	for(;delay>0;delay--)
   		{for(i=0;i<62;i++) //1ms延时.
       		{;}
   		}
}
void  show_time(void);

void outkey()                    //跳出调整模式,返回默认显示
{ uint8 Second;
int i;
GP4DAT=0xbd000000;
Delayms(20);
i=(GP4DAT>>out)&0x01;
  if(i==0)         
  { mdelay(20);
   i=(GP4DAT>>out)&0x01;
	    if(i==0)
    { mdelay(8);
	count=0;
	hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hide_month=0,hide_year=0;hide_latitude_integer=0; hide_latitude_frag=0;hide_longitude_integer=0;hide_longitude_frag=0;
	Second=Read1302(DS1302_SECOND);
    Write1302(0x8e,0x00); //写入允许
	Write1302(0x80,Second&0x7f);
	Write1302(0x8E,0x80);          //禁止写入
	done=0;           
	while(i!=0);
	GP4DAT=0xff000000;
//	while(wireless_1==1);
  }
  }
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
void Upkey()//升序按键
{	   int i;
//		Up=1;
		//if(Up==0||wireless_2==1)
		GP4DAT=0xed000000;
		 Delayms(20);
		i=(GP4DAT>>Up)&0x01;
		if(i==0)
		          {
				   mdelay(8000);
				       switch(count)		  
				          {case 1:
                                  temp=Read1302(DS1302_SECOND);  //读取秒数
								  temp=temp+1;  //秒数加1
                                  up_flag=1;    //数据调整后更新标志
								  if((temp&0x7f)>0x59)   //超过59秒,清零
                                  temp=0;								  
								  break;
				           case 2:
                                  temp=Read1302(DS1302_MINUTE);  //读取分数
								  temp=temp+1;  //分数加1
                                  up_flag=1;
								  if(temp>0x59)          //超过59分,清零
								  temp=0;
								  break;
				           case 3:
                                  temp=Read1302(DS1302_HOUR);  //读取小时数
								  temp=temp+1;  //小时数加1

⌨️ 快捷键说明

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