📄 万年历.c
字号:
alm.day = HEXtoBCD ( alm.day); //将天数值转换为BCD格式
alm.day = alm.day & 0x3F; //取天字节,屏蔽无效位
}
else //如果没有月报警
{
alm.day = alm.day | 0x80; //清月报警数据
}
if( sweek ) //如果有星期报警
{
alm.weekday = HEXtoBCD (alm.weekday); //将星期数值转换为BCD格式
alm.weekday = alm.weekday & 0x07; //取星期字节,屏蔽无效位
}
else //如果没有星期报警
{
alm.hour = alm.hour | 0x80; //清星期报警数据
}
IIC_write_lendata(0xA2,9,*alm,sizeof(struct alarm));
//向PCF8563写报警时间
Delay(80);
return 0;
}
//*********LCM1602**********
#define L1602_DB P0 //定义LCM1602的数据总线
sbit L1602_RS = P2^7; //定义LCM1602的RS控制线
sbit L1602_RW = P2^6; //定义LCM1602的RW控制线
sbit L1602_E = P2^5; //定义LCM1602的E控制线
sbit L1602_BUSY = P0^7; //定义LCM1602的测忙线
//*********5ms延时****
void Delay5ms(void) // 短延时5MS
{
int i=5552;
while(i--);
}
//****LCM1602测忙程序******
void L1602_Busy()
{
do
{
L1602_DB = 0xff;
L1602_RS = 0;
L1602_RW = 1;
L1602_E = 0;
Delay5ms();
L1602_E = 1;
}while( L1602_BUSY );
}
//**********LCM1602写控制字符程序*****
void L1602_WriteCmd(unchar comm)
{
L1602_RS = 0; //指向指令寄存器
L1602_RW = 0; //写操作
L1602_DB = comm;
L1602_E = 0; //上升沿动作
_nop_();
L1602_E = 1;
}
//********** LCM1602写数据程序****
void L1602_WriteData(unchar tdata)
{
L1602_Busy (); //测忙
L1602_RS = 1; //指向数据寄存器
L1602_RW = 0; //写操作
L1602_DB = tdata;
L1602_E = 0; //上升沿动作
_nop_();
L1602_E = 1;
}
//**********LCM1602显示一个字符*********
void L1602_DisOneChar(unchar X,unchar Y,unchar onedata)
{
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
if (Y)
{
X |= 0x40; //当要显示第二行时地址码+0x40;
}
X |= 0x80; // 算出指令码 => 80H + 真实地址码
L1602_WriteCmd(X); //这里不检测忙信号,发送地址码
L1602_WriteData(onedata);
}
//*********LCM1602显示一串字符*****
void L1602_DisString(unchar x,unchar y,unchar *strdata)
{
unchar i,len=0;
while (strdata[len] >31){len++;}; //判断字符串长度
for (i=0;i<len;i++)
{
L1602_DisOneChar(x++,y,strdata[i]); //显示单个字符
if (x==16) //显示完一行后换行
{
x=0; //列起始
y^=1; //行切换
}
}
}
//******* LCM1602初始化********
void L1602_Init()
{
L1602_RS = 0; //指向指令寄存器
L1602_RW = 0; //写操作
L1602_E = 1;
Delay5ms(); //延时15ms
Delay5ms();
Delay5ms();
L1602_WriteComd( 0x38); //置显示模式,连续三次, 不检测忙信号
Delay5ms(); //延时5ms
L1602_WriteComd( 0x38);
Delay5ms();
L1602_WriteComd( 0x38);
Delay5ms();
L1602_WriteComd ( 0x08 ); //关显示
Delay5ms(); //延时5ms
L1602_Busy(); //检测忙信号
L1602_WriteComd ( 0x01); //清屏
Delay5ms();
L1602_Busy();
L1602_WriteComd ( 0x06 ); //光标移动设置:读/写一字符后,地址/光标均加一。
Delay5ms();
L1602_Busy();
L1602_WriteComd ( 0x0C); //开显示
Delay5ms();
L1602_Busy();
}
//*******蜂鸣器控制********
#define SPK_ON P2.0=1
#define SPK_OFF P2.0=0
void spk(uchar i,uchar n) //i为蜂鸣声音长短,n为蜂鸣次数
{
uint a;
for(;n;n--)
{
a=i*10; //计算每声响的长度:MS
for(;a;a--)
{
delay_us(500); //响声频率为1KHZ
SPK_ON; //蜂鸣器开
delay_us(500);
SPK_ON;
}
SPK_OFF; //响完关闭蜂鸣器
delay_ms(100); //每声响之间隔100MS
}
}
//********键盘扫描**********8
sbit System=p1.0;
sbit TimeUp=p1.1;
sbit TimeDown=p1.2;
sbit Exit=p1.3;
//*******按键扫描程序****
void keyscan()
{
if(System ==0)
{
delay5ms();
if(System==0)
{
while(!System);
delay5ms();
while(!System);
keynum++;
if(keynum==1) //按下控制键一次
{
TR0=0;
L1602_WriteCmd(0x80+0x40+10); //秒针闪动
L1602_WriteCmd(0x0f);
}
if(keynum==2) //按下控制键两次
{
L1602_WriteCmd(0x80+0x40+7); //分针闪动
L1602_WriteCmd(0x0f);
}
if(keynum==3) //按下控制键三次
{
L1602_WriteCmd(0x80+0x40+4); //时针闪动
L1602_WriteCmd(0x0f);
}
if(keynum==4) //按下控制键四次
{
L1602_WriteCmd(0x80+12); //星期闪动
L1602_WriteCmd(0x0f);
}
if(keynum==5) //按下控制键五次
{
L1602_WriteCmd(0x80+9); //日闪动
L1602_WriteCmd(0x0f);
}
if(keynum==6) //按下控制键六次
{
L1602_WriteCmd(0x80+6); //月闪动
L1602_WriteCmd(0x0f);
}
if(keynum==7) //按下控制键七次
{
L1602_WriteCmd(0x80+3); //年闪动
L1602_WriteCmd(0x0f);
}
}
if(Exit==0) //按下退出键
{
TR0=1;
keynum=0;
L1602_WriteCmd(0x0c); //停止闪动闪动,时间走
}
}
if(keynum!=0) //处于调整状态时,进行加减判断和处理
{
if(TimeUp==0) //加键控制
{
Delay5ms();
if(TimeUp==0)
{
while(!TimeUp);
delay5ms();
while(!TimeUp);
if(keynum==1) //秒加
{
ptm.second ++;
if(ptm.second ==60)
{ptm.second =0; }
PCF8563_write_time(*ptm);
}
if(keynum==2) //分加
{
ptm.minute++;
if(ptm.minute ==60)
{ptm.minute=0;}
PCF8563_write_time(*ptm);
}
if(keynum==3) //时加
{
ptm.hour++;
if(ptm.hour==24)
{ptm.hour=0;}
PCF8563_write_time(*ptm);
}
if(keynum==4) //星期加
{
ptm.weekday++;
if(ptm.weekday==8)
{ptm.weekday=1;}
PCF8563_write_time(*ptm);
}
if(keynum==5) //日加
{
ptm.day ++;
if(ptm.day ==31)
ptm.day =1;
PCF8563_write_time(*ptm);
}
if(keynum==6) //月加
{
ptm.mon ++;
if(ptm.mon ==13)
ptm.mon =1;
PCF8563_write_time(*ptm);
}
if(keynum==7) //年加
{
ptm.year++;
if(ptm.year==100)
ptm.year=0;
PCF8563_write_time(*ptm);
}
}
if(TimeDown==0) // 减控制键
{
Delay5ms();
if(TimeDown ==0)
{
while(!TimeDown);
delay5ms();
while(!TimeDown);
if(keynum==1) //秒减
{
ptm.second--;
if(ptm.second==-1)
ptm.second=59;
PCF8563_write_time(*ptm);
}
if(keynum==2) //分减
{
ptm.minute--;
if(ptm.minute==-1)
ptm.minute=59;
PCF8563_write_time(*ptm);
}
if(keynum==3) //时减
{
ptm.hour--;
if(ptm.hour==-1)
ptm.hour=23;
PCF8563_write_time(*ptm);
}
if(keynum==4) //星期减
{
ptm.weekday--;
if(ptm.weekday==0)
ptm.weekday=7;
PCF8563_write_time(*ptm);
}
if(keynum==5) //日减
{
ptm.day--;
if(ptm.day==0)
ptm.day=30;
PCF8563_write_time(*ptm);
}
if(keynum==6) //月减
{
ptm.mon--;
if(ptm.mon==0)
ptm.mon=12;
PCF8563_write_time(*ptm);
}
if(keynum==7) //年减
{
ptm.year--;
if(ptm.year==-1)
ptm.year=99;
PCF8563_write_time(*ptm);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -