📄 main.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 + -