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

📄 万年历.c

📁 单片机数据通讯典型应用(光盘内容)
💻 C
📖 第 1 页 / 共 2 页
字号:
  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 + -