📄 1302 -
字号:
#include<reg52.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
unsigned second,minute,hour,day,month,week,year;
char cashe[4];
/*****************************************************************************************************/
/*sbit ds=P0^0; //数据打入口
sbit E1=P2^4; //74HC154-E1 为0开列输出 显示允许控制信号端口
sbit stcp=P0^2; //74HC595-ST_CP 上升沿--移位寄存器的数据进入数据存储寄存器 输出锁存器的时钟信号端口
sbit shcp=P0^1; //移位数据脉冲位数据脉冲位数据脉冲位数据脉冲
sbit MR=P0^3; //74HC595-MR 为0将移位寄存器的数据清0
/*****************************************************************************************************/
//74HC595管脚定义
sbit ds=P1^0;
sbit E1=P2^4;
sbit stcp=P1^1;
sbit shcp=P1^2;
sbit MR=P1^3;
//按键管脚定义
sbit KEY_1 = P1^1;
sbit KEY_2 = P1^2;
sbit KEY_3 = P1^0;
//DS1302管脚定义
sbit T_CLK = P3^4; //ds1302_clk(时钟线)
sbit T_IO = P3^5; //ds1302_dat(数据线)
sbit T_RST = P3^6; //ds1302_Rst(复位线)
sbit ACC0 = ACC^0;
sbit ACC1 = ACC^1;
sbit ACC2 = ACC^2;
sbit ACC3 = ACC^3;
sbit ACC4 = ACC^4;
sbit ACC5 = ACC^5;
sbit ACC6 = ACC^6;
sbit ACC7 = ACC^7;
unsigned char idata Dis[4];
unsigned char code font[]={
0x00,0x00,0xE0,0x0F,0x10,0x10,0x08,0x20,0x08,0x20,0x10,0x10,0xE0,0x0F,0x00,0x00,/*"0",0*/
0x00,0x00,0x10,0x20,0x10,0x20,0xF8,0x3F,0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00,/*"1",1*/
0x00,0x00,0x70,0x30,0x08,0x28,0x08,0x24,0x08,0x22,0x88,0x21,0x70,0x30,0x00,0x00,/*"2",2*/
0x00,0x00,0x30,0x18,0x08,0x20,0x88,0x20,0x88,0x20,0x48,0x11,0x30,0x0E,0x00,0x00,/*"3",3*/
0x00,0x00,0x00,0x07,0xC0,0x04,0x20,0x24,0x10,0x24,0xF8,0x3F,0x00,0x24,0x00,0x00,/*"4",4*/
0x00,0x00,0xF8,0x19,0x08,0x21,0x88,0x20,0x88,0x20,0x08,0x11,0x08,0x0E,0x00,0x00,/*"5",5*/
0x00,0x00,0xE0,0x0F,0x10,0x11,0x88,0x20,0x88,0x20,0x18,0x11,0x00,0x0E,0x00,0x00,/*"6",6*/
0x00,0x00,0x38,0x00,0x08,0x00,0x08,0x3F,0xC8,0x00,0x38,0x00,0x08,0x00,0x00,0x00,/*"7",7*/
0x00,0x00,0x70,0x1C,0x88,0x22,0x08,0x21,0x08,0x21,0x88,0x22,0x70,0x1C,0x00,0x00,/*"8",8*/
0x00,0x00,0xE0,0x00,0x10,0x31,0x08,0x22,0x08,0x22,0x10,0x11,0xE0,0x0F,0x00,0x00,/*"9",9*/
0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x30,0xC0,0x30,0x00,0x00,0x00,0x00,0x00,0x00,/*":",10*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",11*/
};
/*******************************************************************************************
* 函数名: Delay
* 功能描述:
* 入口参数: 无
* 出口参数: 无
*******************************************************************************************/
/*void Delay(unsigned int i)
{
unsigned int j;
for(j=0;j<i;j++);
}
*/
/*******************************************************************************************
* 函数名: disp_1000ms
* 功能描述:
* 入口参数: 无
* 出口参数: 无
*******************************************************************************************/
void disp_1000ms(void) //精确延时1ms
{
/* unsigned char a,b,c; //1ms
for(c=2;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
/* unsigned char a,b; //2ms
for(b=4;b>0;b--)
for(a=248;a>0;a--); */
unsigned char a,b; //0.5m
for(b=5;b>0;b--) //11
for(a=2;a>0;a--);
}
//时钟数据(7字节BCD码)格式为: 秒 分 时 日 月星期 年-----------------------------
unsigned char idata Time[7];
/*******************************************************************************************
* 函数名: BCD2HEX
* 功能描述: BCD码转换成十进制
* 入口参数: 无
* 出口参数: 无
*******************************************************************************************/
unsigned char BCD2HEX(unsigned char BCDChar)
{
unsigned char temp;
temp=(BCDChar/16*10+BCDChar%16);
return temp;
}
/*******************************************************************************************
* 函数名: HEX2BCD
* 功能描述: 十进制转换成BCD码
* 入口参数: 无
* 出口参数: 无
*******************************************************************************************/
unsigned char HEX2BCD(unsigned char HEXChar)
{
unsigned char temp;
temp=(HEXChar/10*16+HEXChar%10);
return temp;
}
/*******************************************************************************************
* 函数名: WriteByteDS1302
* 功能描述:
* 入口参数: 无
* 出口参数: 无
*******************************************************************************************/
void WriteByteDS1302(unsigned char Data)
{
unsigned char i;
ACC = Data;
for(i=8; i>0; i--)
{
T_IO = ACC0;
T_CLK = 1;
T_CLK = 0;
ACC = ACC >> 1;
}
}
/*******************************************************************************************
* 函数名: ReadByteDS1302
* 功能描述:
* 入口参数: 无
* 出口参数: 无
*******************************************************************************************/
unsigned char ReadByteDS1302(void)
{
unsigned char i;
for(i=8; i>0; i--)
{
ACC = ACC >>1;
ACC7 = T_IO;
T_CLK = 1;
T_CLK = 0;
}
return(ACC);
}
/*******************************************************************************************
* 函数名: WriteDS1302
* 功能描述:
* 入口参数: 无
* 出口参数: 无
*******************************************************************************************/
void WriteDS1302(unsigned char Addr,unsigned char Data)
{
T_RST = 0;
T_CLK = 0;
T_RST = 1;
WriteByteDS1302(Addr);
WriteByteDS1302(Data);
T_CLK = 1;
T_RST = 0;
}
/*******************************************************************************************
* 函数名: ReadDS1302
* 功能描述:
* 入口参数: 无
* 出口参数: 无
*******************************************************************************************/
unsigned char ReadDS1302(unsigned char Addr)
{
unsigned char Data;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
WriteByteDS1302(Addr);
Data = ReadByteDS1302();
T_CLK = 1;
T_RST = 0;
return(Data);
}
/*******************************************************************************************
* 函数名: Set
* 功能描述:
* 入口参数: 无
* 出口参数: 无
*******************************************************************************************/
/*void Set(unsigned char sel,unsigned char selby)
{
unsigned char address,item;
unsigned char max,min;
if(sel==0) {address=0x80; max=59;min=0;} //秒
if(sel==1) {address=0x82; max=59;min=0;} //分钟
if(sel==2) {address=0x84; max=23;min=0;} //小时
if(sel==3) {address=0x86; max=31;min=1;} //日
if(sel==4) {address=0x88; max=12;min=1;} //月
if(sel==5) {address=0x8a; max=7; min=1;} //星期
if(sel==6) {address=0x8c; max=99;min=0;} //年
if(sel==7) {address=0xc0; max=59;min=0;} //闹钟分钟
if(sel==8) {address=0xc2; max=23;min=0;} //闹钟小时
item=ReadDS1302(address+1)/16*10+ReadDS1302(address+1)%16;
if (selby==0) item++; else item--;
if(item>max) item=min;
if(item<min) item=max;
WriteDS1302(0x8e,0x00);
WriteDS1302(address,item/10*16+item%10);
WriteDS1302(0x90,0xa5);
WriteDS1302(0x8e,0x80);
}
*/
/*******************************************************************************************
* 函数名: SetTime
* 功能描述:
* 入口参数: 无
* 出口参数: 无
*******************************************************************************************/
/*void SetTime(unsigned char *pClock)
{
unsigned char h;
unsigned char Addr=0x80;
WriteDS1302(0x8e,0x00);
for(h=7; h>0; h--)
{
WriteDS1302(Addr,*pClock);
pClock++;
Addr+=2;
}
WriteDS1302(0x90,0xa5);
WriteDS1302(0x8e,0x80);
}*/
/*******************************************************************************************
* 函数名: ReadTime
* 功能描述:
* 入口参数: 无
* 出口参数: 无
*******************************************************************************************/
void ReadTime()
{
second = BCD2HEX(Time[0]=ReadDS1302(0x81));
minute = BCD2HEX(Time[1]=ReadDS1302(0x83));
hour = BCD2HEX(Time[2]=ReadDS1302(0x85));
day = BCD2HEX(Time[3]=ReadDS1302(0x87));
month = BCD2HEX(Time[4]=ReadDS1302(0x89));
year = BCD2HEX(Time[5]=ReadDS1302(0x8d));
week = BCD2HEX(Time[6]=ReadDS1302(0x8b));
}
/*******************************************************************************************
* 函数名: WriteTime
* 功能描述:
* 入口参数: 无
* 出口参数: 无
*******************************************************************************************/
void WriteTime()
{
WriteDS1302(0x8e,0x00);
WriteDS1302(0x80,HEX2BCD(second));
WriteDS1302(0x82,0x23);//WriteDS1302(0x82,HEX2BCD(minute));
WriteDS1302(0x84,0x12);//WriteDS1302(0x84,HEX2BCD(hour));
WriteDS1302(0x86,HEX2BCD(day));
WriteDS1302(0x88,HEX2BCD(month));
WriteDS1302(0x8A,HEX2BCD(week));
WriteDS1302(0x8C,HEX2BCD(year));
WriteDS1302(0x90,0xa5);
WriteDS1302(0x8e,0x80);
}
/*******************************************************************************************
* 函数名: shcp2
* 功能描述: 595数据传送
* 入口参数: 无
* 出口参数: 无
*******************************************************************************************/
void shcp2(uchar temp1)
{
uchar i;
for (i=0;i<8;i++)
{
shcp=0;
temp1=temp1<<1;
ds=CY;
shcp=1;
shcp=0;
}
}
/*******************************************************************************************
* 函数名: send
* 功能描述:
* 入口参数: 无
* 出口参数: 无
*******************************************************************************************/
void send(void)
{
char i,ii,j,m=0,n=2,mm=0;
char temp;
for(i=0;i<16;i++)
{
ii=i*2;
if(i>=8) //如果i<8则加载小时和分钟的十位数,否则加载小时和分钟的个位数
{m=1;n=3;mm=16;}
if(m==1&&i==15)
{
if((second%10)%2)
{
cashe[3-j]=font[Dis[m]*16+ii-mm]; //小时 十位数
j++;
cashe[3-j]=font[Dis[m]*16+ii+1-mm];
j++;
}
else
{
cashe[3-j]=0x60; //小时 十位数
j++;
cashe[3-j]=0x0C;
j++;
}
}
else
{
cashe[3-j]=font[Dis[m]*16+ii-mm]; //小时 十位数
j++;
cashe[3-j]=font[Dis[m]*16+ii+1-mm];
j++;
}
/*************************************/
if(i==0&&n==2)
{
if((second%10)%2)
{
cashe[3-j]=font[Dis[n]*16+ii-mm];
j++;
cashe[3-j]=font[Dis[n]*16+ii+1-mm]; //分钟十位数
j=0;
}
else
{
cashe[3-j]=0x60;
j++;
cashe[3-j]=0x0C; //分钟十位数
j=0;
}
}
else
{
cashe[3-j]=font[Dis[n]*16+ii-mm];
j++;
cashe[3-j]=font[Dis[n]*16+ii+1-mm]; //分钟十位数
j=0;
}
for(ii=0;ii<4;ii++)
{
temp =cashe[ii];
shcp2(temp);
}
E1=1;
P2=i;
E1=0;
stcp=1;
disp_1000ms();
stcp=0;
}
}
/*******************************************************************************************
* 函数名: init
* 功能描述:
* 入口参数: 无
* 出口参数: 无
*******************************************************************************************/
void init(void)
{
//EA=1;
// SCON=0;//串口方式0
ReadTime();//读取时间
disp_1000ms();
Dis[0]=hour/10; //取小时的十位数
Dis[1]=hour%10; //取小时的个位数
Dis[2]=minute/10;//取分钟的十位数
Dis[3]=minute%10;//取分钟的个位数
}
void main(void)
{
uint rows=sizeof(font); //计算字模总数
disp_1000ms();
// WriteTime(); //时间初始化...
disp_1000ms();
init(); //读取时间
while(1)
{
init(); //读取时间
disp_1000ms();
if(hour/10==0) //如果小时的十位数是零,则不显示
{
Dis[0]=11;
if((hour/10==0)&(hour%10==0))//如果小时十位数为零,且个位数也为零,则为零零
Dis[0]=0;
}
else
Dis[0]=hour/10;
Dis[1]=hour%10;
/* if(minute/10==0) //如果分钟的十位数是零,则不显示
Dis[2]=0;
else
Dis[2]=minute/10;*/
send();
disp_1000ms();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -