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

📄 rtc.c

📁 lyd-sy-5100单片机开发板的示例程序 分为C语言版本和ASM汇编版本。其他牌子的板子也可以使用其C语言版本。
💻 C
📖 第 1 页 / 共 2 页
字号:
	
}
/********************************************************************
函 数 名:ch451_write()
功    能:把12位的指令或数据写入ch451
说    明:12位数据或指令的写入顺序是低位
调    用:
入口参数:command
返 回 值:
设    计:蓝海微芯           
***********************************************************************/
void ch451_write(unsigned int command)
{
  unsigned char i;
  #ifdef USE_KEY
    EX1=0;			                   /*禁止键盘中断*/
  #endif	
  ch451_load=0;                 	   /*命令开始*/    
  for(i=0;i<12;i++)
  {                             	   /*送入12位数据,低位在前*/
    ch451_din=command&1;				
    ch451_clk=0;
    command>>=1;
    ch451_clk=1;              	 	   /*上升沿有效*/
  }
  ch451_load=1;                		   /*加载数据*/
  #ifdef USE_KEY
    EX1=1;
  #endif
}
/********************************************************************
函 数 名:ds1302主程序
功    能:读取ds1302的时间值并通过数码管进行显示
说    明:
调    用:
入口参数:
返 回 值:
设    计:蓝海微芯           
***********************************************************************/
void SET_RTC(void)
{
  Get1302(&SClock);			/*把当前的时间值读取到数组SClock[3]中去*/
  SClock[0]|=0x80;			/*使ds1302的时间停止运行*/
  Set1302(SClock);			

  ch451_key = 0xff;
  key_flag++;
  if(key_flag==4)
  {
    key_flag = 0;
    ch451_write(0x600);
    SClock[0]&=0x7f;
    Set1302(SClock);
  }
  switch(key_flag)
  {
    case 1: 
    ch451_write(0x6C0);		/*让秒显示位进行闪烁*/
    break;
    case 2:	
    ch451_write(0x618);		/*让分显示位进行闪烁*/
    break;
    case 3: 
    ch451_write(0x603);		/*让小时显示位进行闪烁*/
    break;
    default:break;
  }
}
/********************************************************************
函 数 名:SET_TIME()
功    能:根据按键值&按键被按下的次数作相应的处理
说    明:
调    用:
入口参数:
返 回 值:
设    计:蓝海微芯           
***********************************************************************/
void SET_TIME(void)
{
  switch(key_flag)
  {	
    case 1:				
    SClock[0]&=0x7f;
    ch451_bcd(SClock[0]);	/*将秒显示位的十位和个位进行分离*/
    N++;			        /*秒值加一*/
    if(N==10)
    {
      N = 0;
      M++;
      if(M==6)
      {
        M = 0;
      }
    }
    M<<=4;
    SClock[0] = M|N|0x80;
    W1302(0x8e,0x00);		/*控制命令,wp=0,可以进行写操作*/
    W1302(0x80, SClock[0]);	/*将修改过的秒值写到ds1302中*/
    ch451_key=0xff;
    break;
    case 2:			
    ch451_bcd(SClock[1]);	/*将分显示位的十位和个位进行分离*/
    N++;			        /*分值加一*/
    if(N==10)
    {
      N = 0;
      M++;
      if(M==6)
	  {
        M = 0;
      }
    }
    M<<=4;
    SClock[1] = M|N;
    W1302(0x8e,0x00);		/*控制命令,wp=0,可以进行写操作*/
    W1302(0x82, SClock[1]);	/*将修改过的分值写到ds1302中*/
    ch451_key=0xff;
    break;
    case 3: 
    ch451_bcd(SClock[2]);	/*将小时显示位的十位和个位进行分离*/
    N++;					/*小时值加一*/
    if(N==4)
    {
      if(M==2)		 	    /*小时十位为2时个位最大值不能超过3*/
      {
        M = 0;
        N = 0;
      }
    }
    if(N==10)
    {
      N = 0;
      M++;
    }
    M<<=4;
    SClock[2] = M|N;
    W1302(0x8e,0x00);		/*控制命令,wp=0,可以进行写操作*/	
    W1302(0x84,SClock[2]);	/*将修改过的分值写到ds1302中*/
    ch451_key=0xff;
    break;
    default:break;
  }
  ch451_key = 0xff;
}
/********************************************************************
函 数 名:ch451中断服务程序
功    能:获取键值
说    明:
调    用:
入口参数:
返 回 值:ch451_key
设    计:蓝海微芯           
***********************************************************************/
void ch451_inter() interrupt 2 using 1
{
  unsigned char i;			      		/*定义循环变量*/
  unsigned char command,keycode;	    /*定义控制字寄存器,和中间变量定时器*/
  command=0x07;				      		/*读取键值命令的高4位0111B*/
  EX1 = 0;
  ch451_load=0;				      		/*命令开始*/
  for(i=0;i<4;i++)
  {
    ch451_din=command&1;		        /*低位在前,高位在后*/
    ch451_clk=0;
    command>>=1;			      		/*右移一位*/
    ch451_clk=1;			      		/*产生时钟上升沿锁通知CH451输入位数据*/
  }
  ch451_load=1;				      		/*产生加载上升沿通知CH451处理命令数据*/
  keycode=0;				      		/*清除keycode*/
  for(i=0;i<7;i++)
  {
    keycode<<=1;			      		/*数据作移一位,高位在前,低位在后*/
    keycode|=ch451_dout;		       		 /*从高到低读入451的数据*/
    ch451_clk=0;			      		/*产生时钟下升沿通知CH451输出下一位*/
    ch451_clk=1;	
  }
  ch451_key=keycode;			        /*保存上次的键值*/
  		
  EX1 = 1;
  IE1=0;				      	 	    /*清中断标志*/
}
/********************************************************************
函 数 名:ds1302主程序
功    能:读取ds1302的时间值并通过数码管进行显示
说    明:
调    用:
设    计:蓝海微芯           
***********************************************************************/					
main()
{
  uchar WClock[3]={0x00,0x01,0x02};
  uchar RClock[3];
  uchar ds_hour;
  uchar ds_min;
  uchar ds_sec;

  P1_3 = 1;
  P1_5 = 1;
  Set1302(WClock);			            /*对ds1302显示的时间初值进行设定*/
  ch451_init();				            /*对ch451进行初始化*/
  ch451_write(0x403);		 	        /*关看门狗开键盘显示*/
  ch451_write(0x580);			        /*以译码方式进行显示*/
  ch451_write(CH451_DIG5|0x12);		    /*数码管的第2位显示"-"*/
  ch451_write(CH451_DIG2|0x12);		    /*数码管的第7位显示"-"*/
  ch451_key = 0xff;
  key_flag  = 0;
  EA  = 1;
  EX1  =1;
			
  while(1)
  {
    if(ch451_key==0x5A)			         /*判断设置按键是否按下*/
    {
      SET_RTC();
    }
    if((key_flag!=0)&&(ch451_key==0x59))/*判断修改时间键是否被按下*/
    {
      SET_TIME();
    }
    Get1302(&RClock);			        /*获取当前时间值*/
    ds_sec  = RClock[0]&0x7f;	        /*得到当前时间秒值*/
    ds_min  = RClock[1];		        /*得到当前时间分值*/
    ds_hour = RClock[2];		        /*得到当前时间小时值*/
		
    ch451_bcd(ds_hour);			        /*对小时值进行转化*/
    ch451_write(CH451_DIG0|M);		    /*写小时高位*/
    ch451_write(CH451_DIG1|N);		    /*写小时低位*/

    ch451_bcd(ds_min);			        /*对分钟值进行转化*/
    ch451_write(CH451_DIG3|M);		    /*写分钟高位*/
    ch451_write(CH451_DIG4|N);		    /*写分钟低位*/

    ch451_bcd(ds_sec);	                /*对秒值进行转化*/
    ch451_write(CH451_DIG6|M);          /*写秒值高位*/
    ch451_write(CH451_DIG7|N);          /*写秒值低位*/
  }
}
/*********************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -