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

📄 main.txt

📁 ds1302时钟程序同时在数码管上显示,并且按键可调.
💻 TXT
字号:
//*************************************************************************
//功能描述:DS1302时钟显示,显示小时与分钟 
//硬件连接:RD4-RD7接数码管的A-D,RD0-RD3接数码管的位选端,
//          采用硬件译码,动态扫描。RC1-RC3分别接RST、IO、CLK
//          RB4-5接按键采用中断的方式   
//存在问题:
//程序编写: he
//设计时间:2007-10-17。
//*************************************************************************
#include <pic.h>
#define uchar unsigned char
//////////////////////////////////端口定义////////////////////////////
//#define  T_RST  RC1   
//#define  T_IO RC2    `
//#define  T_CLK  RC3    
//////////////////////////////////位变量定义/////////////////////////
//static volatile uchar acc @ 0x20; 
//static volatile bit acc0     @ (unsigned)&acc*8+0;
//static volatile bit acc7     @ (unsigned)&acc*8+7;
//////////////////////////////////变量定义///////////////////////////
unsigned char  DisCash[7]={0x12,0x50,0x17,0x17,0x10,0x03,0x07};    //初始时间缓冲区 
uchar get1302[7];
uchar R_data=0;
uchar W_data;
extern uchar data;
unsigned int j=0;
unsigned int k=0;
///////////////////////////////////////////////////////////
extern uchar second0,second1,minute0,minute1,hour0,hour1,date0;
extern uchar date1,day,month0,month1,year0,year1;
/////////////////////////函数申明/////////////////////////
void Delay(char x);   //功能:延时10us  
void v_RTInputByte(uchar ucDa) ; //功能:写入1Byte数据
uchar uc_RTOutputByte(void) ;  //功能:读取1Byte数据
void v_W1302(uchar ucAddr, uchar ucDa); //功能:先写地址,后写命令/数据
void V_W1302(uchar ucAddr, uchar ucDa);
uchar uc_R1302(uchar ucAddr);  //功能:先写地址,后读命令/数据
void v_BurstW1302T(uchar *pSecDa); //功能:先写地址,后写数据(时钟多字节方式)
void v_BurstR1302T(uchar *pSecDa); //功能:先写地址,后读命令/数据(时钟多字节方式)
void v_BurstW1302R(uchar *pReDa); //功能:先写地址,后写数据(寄存器多字节方式RAM)
void v_BurstR1302R(uchar *pReDa); //功能:先写地址,后读命令/数据(寄存器多字节方式RAM)
void v_Set1302(uchar *pSecDa) ;  //功能:设置初始时间
void v_Get1302(uchar ucCurtime[]);  //功能:读取DS1302当前时间
void  Display (uchar x,uchar y,uchar m,uchar n); //功能:显示两种时间
void read_sec();   //功能:读秒REG
void read_min();   //功能:读分REG
int Read_min(); 
void read_hour();   //功能:读时REG
int Read_hour();
void read_data();   //功能:读日REG
void read_day();   //功能:读周REG
void read_month();   //功能:读月REG
void read_year();   //功能:读年REG
void initial();   //功能:端口定义
void  PORTB_Interrupt_Initial();     //PORTB口电平变化中断初始化  
//****************************************************************
//** 函 数 名: PORTB_Interrupt_Initial()
//** 功能描述: PORTB口电平变化中断初始化
//****************************************************************
void  PORTB_Interrupt_Initial()
{
	TRISB=0xf0;	// PORTB工作在电平变化中断方式,bit7-bit4设置为输入
	INTCON=INTCON|0x08;		// RBIE=1,使能RB电平变化中断
	INTCON=INTCON&0xfe;		// RBIF=0,清RB电平变化中断标志
    OPTION=0x7F;
    RBIE=1;                 //B口变位中断允许
	PORTB=PORTB;				// 设置PORTB口电平变化初始条件	
}
//********************************************************************
//* 功能: 端口定义
//********************************************************************/
void initial()
{
 TRISB=0x00;    //端口设置    
 TRISD=0x00;
 TRISC=0x00;
 PORTB_Interrupt_Initial();
 GIE=1;                      //全局中断有效
 PEIE=1;                    //外围中断屏蔽位有效
}
//*******按键服务*********//
 void  KeyServe()
{
 if(RB5==0)
  {
   j+=1;
   }
 if(RB4==0) 
 {
  k+=1;
 }

 }
//******中断服务程序******//
void	interrupt	keyint(void)
{
    int i;
    for(i=0;i<1550;i++) {;}
	if ((RB5==0)||(RB4==0))		//该语句除了能够确认按键是否为干扰外,
						    	//还可以屏蔽一次键松开时引起的中断
    KeyServe();
	PORTB=PORTB;	
    RBIF=0;		
}
//********************************************************************
//* 功能: 主程序
//*********************************************************************
void main()
{
 long i;
 initial ();   //系统 各I/O初始化子程序
 Delay(10);
 Delay(5);
 v_W1302(0x8E, 0x00);  //设置成写入允许
 Delay(5);
 //v_Set1302(DisCash);     //设置初始时间,并打开时钟
while(1)
{
//**********分钟设置************//
  if(j!=0)
  {
   R_data=Read_min();
   W_data=R_data+1;
   if(W_data<=0x59)
   {
     if(W_data==0x0a)  W_data=0x10;
     if(W_data==0x1a)  W_data=0x20;
     if(W_data==0x2a)  W_data=0x30;
     if(W_data==0x3a)  W_data=0x40;    
     if(W_data==0x4a)  W_data=0x50;  
     v_W1302(0x82,W_data);
     }
   else
     { v_W1302(0x82, 0x00);Delay(10);}
     j=0;
   }
//**********小时设置************//
  if(k!=0)
  {
  R_data=Read_hour();
  W_data=R_data+1;
  if(W_data<=0x23)
   {
     if(W_data==0x0a)  W_data=0x10;
     if(W_data==0x1a)  W_data=0x20;
     v_W1302(0x84,W_data);
     }
   else
     v_W1302(0x84, 0x00);
     k=0;
   }
 // v_Get1302(get1302);      //用于读取DS1302当前时间
//********数码管显示*******//
  read_min();
  read_hour();
  for(i=0;i<99;i++)
 {
  PORTD=(minute0<<4)|0x01;
  Delay(1);
  PORTD=(minute1<<4)|0x02;
  Delay(1);
  PORTD=(hour0<<4)|0x04;
  Delay(1);
  PORTD=(hour1<<4)|0x08;
  Delay(1);
}
 }
}

⌨️ 快捷键说明

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