📄 timeshow.c
字号:
#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 + -