📄 lcd128x64_2.c
字号:
/*-------------------------------------------*/
//写入字节完整子函数
void WriteTo1302(unsigned char Addr,unsigned char Date)
{
RST2=0;
CLK=0;
RST2=1;
InputByte(Addr);
InputByte(Date);
CLK=1;
RST2=0;
}
/*-------------------------------------------*/
/*-------------------------------------------*/
//读出一个完整的字节
unsigned char ReadFrom1302(unsigned char Add)
{
unsigned char Date;
RST2=0;
CLK=0;
RST2=1;
InputByte(Add);
Date=OutputByte();
CLK=1;
RST2=0;
return (Date);
}
/*-------------------------------------------*/
/*-------------------------------------------*/
//设置初始时间
void SetTime(unsigned char *pSecDa)
{
unsigned char i;
unsigned char Addr=0x80;
WriteTo1302(0x8e,0x00);
for(i=7;i>0;i--)
{
WriteTo1302(Addr,*pSecDa);
pSecDa++;
Addr+=2;
}
WriteTo1302(0x8e,0x80);
}
/*-------------------------------------------*/
/*-------------------------------------------*/
//读出当前时间
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 延迟时间50ms
void Init_T0(void)
{
TMOD=0x01;
TH0=0x3c;//TH0=-50000>>8;
TL0=0xb0;//TL0=-50000&0xff;
EA=1;
ET0=1;
TR0=1;
}
/*-------------------------------------------*/
/*-------------------------------------------*/
//用定时中断产生闪烁信号
void To_flash(void) interrupt 1 using 0 //中断程序,产生时钟秒信号
{
TR0=0;
fla_cou++;
if(fla_cou==10)
{
flash=!flash;
fla_cou=0;
}
TH0=0x3c;//TH0=-50000>>8;
TL0=0xb0;//TL0=-50000&0xff;
TR0=1;
}
/*-------------------------------------------*/
/*-------------------------------------------*/
//选择确定闪烁位置等待调节
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;
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();
}
/*-------------------------------------------*/
/*-------------------------------------------*/
//对闪烁位置进行调整
void Add(void)
{
if(P1_2==0)
{
while(P1_2==0)
Refresh();
if(KT==1)
{
hms++;
switch(n)
{
case 1: year=hms; break;
case 2: month=hms; break;
case 3: date=hms; break;
case 4: hour=hms; break;
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]);
}
}
}
/*-------------------------------------------*/
/*-------------------------------------------*/
//时钟初始化函数
void Init_Clock(void)
{
K1=1;
K2=1;
K3=1;
K4=1;
K5=1;
K6=1;
K7=1;
KT=0;
n =0;
Init_T0();
}
/*-------------------------------------------*/
/*-------------------------------------------*/
//刷新显示子函数
void Refresh(void)
{
GetTime();
CS1=1; //右半屏
CS2=0;
if(K6)
{
sz_disp16(5,24,shuzi[sec&0x0f]);
sz_disp16(5,16,shuzi[sec>>4]);
}
else
{
hz_disp16(5,16,kongbai2);
}
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(K5)
{
sz_disp16(5,56,shuzi[min&0x0f]);
sz_disp16(5,48,shuzi[min>>4]);
}
else
{
hz_disp16(5,48,kongbai2);
}
if(K4)
{
sz_disp16(5,24,shuzi[hour&0x0f]);
sz_disp16(5,16,shuzi[hour>>4]);
}
else
{
hz_disp16(5,16,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);
}
if(K7)
{
sz_disp16(1,32,shuzi[day&0x0f]);
}
else
{
hz_disp16(1,32,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);
}
}
/*-------------------------------------------*/
/*-------------------------------------------*/
//主函数
void main(void)
{
Init_Clock();
init_lcd();
Disp_Img(FirstPage);
delay(10000);
StartMsg();
delay(10000);
ClockMsg();
while(1)
{
Refresh();
FlashKey();
State();
delay(250);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -