📄 lcd128x64.c
字号:
/////////////////////////////////////////////////////////////////////////////////
///// 函数名称: SetTime ///// /////
///// 功能: 设置初始时间 /////
///// 调用: WriteTo1302() /////
///// 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年 /////
///// 返回值: 无 /////
/////////////////////////////////////////////////////////////////////////////////
void SetTime(unsigned char *pSecDa)
{
unsigned char i;
unsigned char Addr = 0x80;
WriteTo1302(0x8e,0x00); // 控制命令,WP=0,写操作 //
for(i =7;i>0;i--)
{
WriteTo1302(Addr,*pSecDa); // 秒 分 时 日 月 星期 年 //
pSecDa++;
Addr +=2;
}
WriteTo1302(0x8e,0x80); // 控制命令,WP=1,写保护 //
}
/**************************************************************************************************/
//////////////////////////////////////////////////////////////////////////////////////
///// 名称: GetTime /////
///// 说明: /////
///// 功能: 读取DS1302当前时间 /////
///// 调用: uc_R1302() /////
///// 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年 /////
///// 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B /////
///// 返回值: 无 /////
//////////////////////////////////////////////////////////////////////////////////////
void GetTime(void)
{
unsigned char i;
unsigned char Addr = 0x81;
for (i=0;i<7;i++)
{
Curtime[i] = ReadFrom1302(Addr); // 格式为: 秒 分 时 日 月 星期 年 //
Addr += 2;
}
sec = Curtime[0];
min = Curtime[1];
hour = Curtime[2];
day = Curtime[5];
date = Curtime[3];
month = Curtime[4];
year = Curtime[6];
}
/**************************************************************************************************/
////////////////////////////////////////////////////
///// 函数名: 定时器T0初始化子函数 //////
///// 函数功能: 初始化T0定时50ms //////
///// 调用: 无 //////
///// 函数参数: 无 //////
///// 返回值: 无 //////
////////////////////////////////////////////////////
void Init_T0(void)
{
TMOD=0x01; //定时器T0,工作模式1//
TH0=0x3c; //50ms//
TL0=0xb0;
EA=1;
ET0=1;
TR0=1;
}
/**************************************************************************************************/
////////////////////////////////////////////////////
///// 函数名: 闪烁信号产生子函数 //////
///// 函数功能: 用定时中断方式产生闪烁信号 //////
///// 调用: 无 //////
///// 函数参数: 无 //////
///// 返回值: 无 //////
////////////////////////////////////////////////////
void T0_flash(void) interrupt 1 // 中断程序,产生时钟秒信号 //
{
TR0=0;
fla_cou++;
if(fla_cou==3) //闪烁间隔为50ms*5次=250ms//
{
flash=!flash;
fla_cou=0;
}
TH0=0x3c; //50ms//
TL0=0xb0;
TR0=1;
}
/**************************************************************************************************/
////////////////////////////////////////////////////
///// 函数名: 时间闪烁子函数 //////
///// 函数功能: 选择确定闪烁位等待调整 //////
///// 调用: Add(); //////
///// 函数参数: 无 //////
///// 返回值: 无 //////
////////////////////////////////////////////////////
void FlashKey(void) //闪烁子函数//
{
if(P1_0==0)
{
while(P1_0==0)
Refresh();
n++;
}
if(n==8) n=0;
if(n!=1) K1=1;
if(n!=2) K2=1;
if(n!=3) K3=1;
if(n!=4) K4=1;
if(n!=5) K5=1;
if(n!=6) K6=1;
if(n!=7) K7=1;
switch(n)
{
case 0:KT=0;break;
case 1:K1=flash;hms=year;KT=1;break; //hms为调时临时变量,需要调整某位时则先把其初始值放到hms中//
case 2:K2=flash;hms=month;KT=1;break;
case 3:K3=flash;hms=date;KT=1;break;
case 4:K4=flash;hms=hour;KT=1;break;
case 5:K5=flash;hms=min;KT=1;break;
case 6:K6=flash;hms=sec;KT=1;break;
case 7:K7=flash;hms=day;KT=1;break;
}
Add();
}
/*********************************************************************************************************/
////////////////////////////////////////////////////
///// 函数名: 时间调整子函数 //////
///// 函数功能: 对闪烁位进行调整(加一) //////
///// 调用: SetTime(); //////
///// 函数参数: 无 //////
///// 返回值: 无 //////
////////////////////////////////////////////////////
void Add(void) //调时子函数//
{
if(P1_2==0) //按P0_2键进行时间调整//
{
while(P1_2==0)
Refresh();
if(KT==1) //检验可调标志位KT//
{
hms++;
switch(n)
{
case 1:year=hms;break; //根据n不同,返回给不同的位: n=1 -> 返回给小时位//
case 2:month=hms;break; // n=2 -> 返回给分钟位//
case 3:date=hms;break; // n=3 -> 返回给秒位 //
case 4:hour=hms;break; // n=4 -> 返回给星期位//
case 5:min=hms;break; // 依次类推 //
case 6:sec=hms;break;
case 7:day=hms;break;
}
if((sec&0x0f)==0x0a) {sec&=0xf0; sec+=0x10;} // 如果秒位满十,向十秒位进一 //
if((min&0x0f)==0x0a) {min&=0xf0; min+=0x10;} // 如果分位满十,向十分位进一 //
if((hour&0x0f)==0x0a) {hour&=0xf0; hour+=0x10;} // 如果时位满十,向十时位进一 //
if(day==8) {day=1;} // 如果星期满七,重新从星期一开始计 //
if((sec&0xf0)==0x60) {sec&=0x0f;} // 如果十秒位满六,清零 //
if((min&0xf0)==0x60) {min&=0x0f;} // 如果十分位满六,清零 //
if(((hour&0xf0)==0x20)&((hour&0x0f)==0x04)) {hour&=0x00;} //如果小时满24,清零//
if((date&0x0f)==0x0a) {date&=0xf0; date+=0x10;} // 如果日期位满十,向十号位进一 //
if((month&0x0f)==0x0a) {month&=0xf0; month+=0x10;} // 如果月份位满十,向十月位进一 //
if((year&0x0f)==0x0a) {year&=0xf0; year+=0x10;} // 如果年位满十,向十年位进一 //
if(((date&0xf0)==0x30)&((date&0x0f)==0x02)) {date&=0x00;}
if(((month&0xf0)==0x10)&((month&0x0f)==0x03)) {month&=0x00;}
if((year&0xf0)==0xa0) {year&=0x0f;}
Curtime[0] = sec;
Curtime[1] = min;
Curtime[2] = hour;
Curtime[3] = date;
Curtime[4] = month;
Curtime[5] = day;
Curtime[6] = year;
SetTime(&Curtime[0]); // 将调整过后的时间值写入DS1302 //
}
}
}
/********************************************************************************************************/
/*******************************************************************************************************/
////////////////////////////////////////////////////
///// 函数名: 时钟初始化子函数 //////
///// 函数功能: 对所有时钟程序变量初始化 //////
///// 调用: Init_T0(); //////
///// 函数参数: 无 //////
///// 返回值: 无 //////
////////////////////////////////////////////////////
void Init_Clock(void)
{
K1=1; K2=1; K3=1; K4=1; K5=1;
K6=1; K7=1; KT=0; n=0;
Init_T0();
}
/*******************************************************************************************///时钟部分// ↑
////////////////////////////////////////////////////
///// 函数名: 刷新显示子函数 //////
///// 函数功能: 即时刷新时钟数据进行显示 //////
///// 调用: InputCommand();DisplayChar(); //////
///// 函数参数: 无 //////
///// 返回值: 无 //////
////////////////////////////////////////////////////
void Refresh(void)
{
GetTime();
CS1=1;CS2=0;
if(K6)
{ sz_disp16(5,40,shuzi[sec&0x0f]); // 秒位 //
sz_disp16(5,32,shuzi[sec>>4]); } // 十秒位 //
else
{ hz_disp16(5,32,kongbai2); } // 秒位 十秒位 //
if(K5)
{ sz_disp16(5,8,shuzi[min&0x0f]); // 分钟位 //
sz_disp16(5,0,shuzi[min>>4]); } // 十分位 //
else
{ hz_disp16(5,0,kongbai2); }
if(K7)
{ sz_disp16(1,0,shuzi[day&0x0f]); }
else
{ sz_disp16(1,0,kongbai1); }
if(K3)
{ sz_disp16(3,24,shuzi[date&0x0f]); // 日期位 //
sz_disp16(3,16,shuzi[date>>4]); }
else
{ hz_disp16(3,16,kongbai2); }
CS1=0;CS2=1;
if(K4)
{ sz_disp16(5,40,shuzi[hour&0x0f]); // 小时位 //
sz_disp16(5,32,shuzi[hour>>4]); } // 十时位 //
else
{ hz_disp16(5,32,kongbai2); }
if(K2)
{ sz_disp16(3,56,shuzi[month&0x0f]); // 月份位 //
sz_disp16(3,48,shuzi[month>>4]); }
else
{ hz_disp16(3,48,kongbai2); }
if(K1)
{ sz_disp16(3,24,shuzi[year&0x0f]); // 年份位 //
sz_disp16(3,16,shuzi[year>>4]); }
else
{ hz_disp16(3,16,kongbai2); }
}
/*-----------------------------状态判断于提示------------------------*/
void State(void)
{
CS1=1;CS2=0;
if(KT==1)
{ hz_disp16(1,32,tiao);
hz_disp16(1,48,shi2);}
else
{ hz_disp16(1,32,kongbai2);
hz_disp16(1,48,kongbai2); }
}
/*------------------------------主函数---------------------------------*/
main()
{
Init_Clock();
init_lcd();
Disp_Img(FirstPage);
delay(10000);
StartMsg();
delay(10000);
ClockMsg();
while(1)
{
Refresh();
FlashKey();
State();
delay(250); // 适当延时防止因为不断查忙而耗费大量CUP资源 //
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -