📄 time.c
字号:
#include<reg52.h>
#define N 4
typedef unsigned char uchar ;
typedef unsigned int uint ;
sbit SCLK = P3^2; //实时时钟时钟线引脚
sbit IO = P1^6; //实时时钟数据线引脚
sbit RST = P3^7; //实时时钟复位线引脚
sbit clk=P0^2;
sbit Data=P0^3;
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
uchar cod[N];
uchar qq;
/****************************************
//函数群名称:cci函数群
//函数功能: 扫描4*4键盘并返回值
//函数参数: 无
//函数返回值:键盘值
//说明: 值16为无输入
******************************************/
void Delay(uchar time)
{
uchar i,j;
for(i=time;i>0;i--)
for(j=25;j>0;j--);
}
uchar Key(void)
{
uchar ucTemp1,ucTemp2;
P2 = 0xf0; //先将所有行线拉低
Delay(1);
if( (P2&0xf0)!= 0xf0 ) //如果列线有变化
{
Delay(1); //延迟10ms左右。
if( (P2&0xf0)!= 0xf0 ) //如果此时此刻列线还有变化,说明确实有按键按下
{
ucTemp1=P2;
P2=0x0f;
ucTemp2=P2;
return ucTemp1|ucTemp2; //返回识别码,识别码是根据上一条语句的算法计算好的,
//每个识别码对应一个按键,一共有16个识别码.
}
}
return 0x00; //如果没有按键按下,返回0
}
uchar cci()
{
uchar a=0;
a=Key(); //键盘返回值
switch(a)
{
case 0x7e: return 3; break; //键盘各个返回值对应的键值
case 0xbe: return 7; break;
case 0xde: return 11; break;
case 0xee: return 15; break;
case 0x7d: return 2; break;
case 0xbd: return 6; break;
case 0xdd: return 10; break;
case 0xed: return 14; break;
case 0x7b: return 1; break;
case 0xbb: return 5; break;
case 0xdb: return 9; break;
case 0xeb: return 13; break;
case 0x77: return 0; break;
case 0xb7: return 4; break;
case 0xd7: return 8; break;
case 0xe7: return 12; break;
default: return 16; break; //无键按下返回16
}
}
/******************************************
//函数群名称:xianshi(显示)函数
//函数功能: 显示一个字符串
//函数参数: 字符串头地址
//函数返回值:无
//说明: 只能输入长度为四位的字符串
********************************************/
void xsq(void) //显示器函数
{
uchar a,b,c,d;
for(d=20;d;d--)
{
c=0xe0; //c赋初值
for(a=0;a<4;a++)
{
P0 = 0x00;
qq = cod[a]; //送入寄存器的值
for(b=8;b>0;b--) //将八个数送入寄存器
{
Data=(bit) ( qq&0x80 );
clk=0; //制造一个脉冲,一共八个
clk=1;
qq=qq<<1; //qq移位
}
P0 = ~c; //控制数码管亮
Delay(1); //延时
c=(c<<1)|0x10; //移位控制数码管
}
}
}
void fz(uchar a[],uchar cod[],uchar b) //赋值函数将a的值给cod
{
uchar i,c=b-1;
for(i=0;i<b;i++,c--) //将a前几位赋給cod
{
cod[3-i]=a[c];
}
for(;i<N;i++)
{
cod[3-i]=0x00; //cod前几个值为不显示
}
xsq();
}
/******************************************
//函数群名称:xszh(显示转换)函数
//函数功能: 将一个uchar字符转换为一个可以输出无符号数
//函数参数: 字符数
//函数返回值:无符号字符数
//说明: 只能输入0到9的字符
********************************************/
uchar xszh(uchar a) //显示转换函数,将一个uchar型数组转换为显示用的uchar型数组
{
switch (a)
{
case 0: return 0xb7;break;
case 1: return 0x90;break;
case 2: return 0x3d;break;
case 3: return 0xb9;break;
case 4: return 0x9a;break;
case 5: return 0xab;break;
case 6: return 0xaf;break;
case 7: return 0xb0;break;
case 8: return 0xbf;break;
case 9: return 0xbb;break;
}
}
/******************************************
//函数群名称:xianshi(显示)函数
//函数功能: 将一个uchar字符串转换为一个可以输出无符号字符串
//函数参数: 字符串头地址,字符串有效位数
//函数返回值:无
//说明: 只能输入长度为四位的字符串
********************************************/
void xianshi(uchar a[],uchar i) //将要显示的数转换赋予cod数组,需要输入赋予数组和数的个数
{
uchar b,c[N];
for(b=0;b<i;b++)
{
c[b]=xszh(a[b]); //将a数组的值转换为可以输出的值给c函数
}
fz(c,cod,i);
}
void RTInputByte(uchar d) //向1302写入一数据
{
uchar i;
ACC = d;
for(i=8; i>0; i--)
{
IO = ACC0; //相当于汇编中的 RRC
SCLK = 0;
SCLK = 1;
ACC = ACC >> 1;
}
}
uchar RTOutputByte(void) //从1302中读出一数据
{
uchar i;
for(i=0; i<8; i++)
{ //相当于汇编中的 RRC
ACC7 = IO;
SCLK = 1;
SCLK = 0;
ACC = ACC >>1;
}
SCLK = 1;
return(ACC);
}
void W1302(uchar ucAddr, uchar ucDa) //前一字节为命令,后一字节为数据
{
RST = 0;
SCLK = 0;
RST = 1;
RTInputByte(ucAddr); // 地址,命令
RTInputByte(ucDa); //写1Byte数据
SCLK = 1;
RST = 0;
}
uchar R1302(uchar ucAddr)
{
uchar ucData;
RST = 0;
SCLK = 0;
RST = 1;
RTInputByte(ucAddr); // 地址,命令
ucData = RTOutputByte(); // 读1Byte数据
SCLK = 1;
RST = 0;
return(ucData);
}
void main(void)
{
uchar i,c=0,keys=17,da;
uchar a[N];
W1302( 0x8f, 0x00);
W1302( 0x8e, 0x00); //初始化
W1302( 0x80, 0x00);
while (1) //进入循环
{
if(cci()!=keys) //要求每次输入与前一次不一样,防止不停输入
{
keys=cci(); //将键值记录
if(keys==10) //按10显示年
{
while(1)
{
W1302( 0x8e, 0x00);
da=R1302(0x8d); //向年寄存器读出数据
a[0]=2;
a[1]=0;
a[2]=(da&0xf0)/16;
a[3]=(da&0x0f); //上四句将其十进制化并将键值记录
i=4;
xianshi(a,i); //显示
keys=cci();
if(keys==14)
{
for(i=2;i<4;)
{
if(cci()<10)
{
keys=cci();
a[i]=keys;
i++;
while(1)
{
if(cci()==16)
break;
xianshi(a,i);
}
}
xianshi(a,i);
}
W1302( 0x8e, 0x00);
W1302(0x8c,(a[2]*16)|a[3]);
}
if(keys>10&&keys<14)
break;
} //将键值的有效位数记录
}
if(keys==11) //按11显示月日
{
while(1)
{
W1302( 0x8e, 0x00);
da=R1302(0x89); //向月寄存器读出数据
a[0]=(da&0xf0)>>4;
a[1]=(da&0x0f);
W1302( 0x8e, 0x00);
da=R1302(0x87); //向日寄存器读出数据
a[2]=(da&0xf0)>>4;
a[3]=(da&0x0f); //将键值记录
i=4;
xianshi(a,i);
keys=cci();
if(keys==14)
{
for(i=0;i<4;)
{
if(cci()<10)
{
keys=cci();
a[i]=keys;
i++;
while(1)
{
if(cci()==16)
break;
xianshi(a,i);
}
}
xianshi(a,i);
}
W1302( 0x8e, 0x00);
W1302(0x88,(a[0]*16)|a[1]);
W1302(0x86,(a[2]*16)|a[3]);
}
if(keys==10||keys==12||keys==13)
break;
} //将键值的有效位数记录
}
if(keys==12) //按12显示时分
{
while(1)
{
W1302( 0x8e, 0x00);
da=R1302(0x85); //向时寄存器读出数据
a[0]=(da&0xf0)>>4;
a[1]=(da&0x0f);
W1302( 0x8e, 0x00);
da=R1302(0x83); //向分寄存器读出数据
a[2]=(da&0xf0)>>4;
a[3]=(da&0x0f); //将键值记录
i=4;
xianshi(a,i);
keys=cci();
if(keys==14)
{
for(i=0;i<4;)
{
if(cci()<10)
{
keys=cci();
a[i]=keys;
i++;
while(1)
{
if(cci()==16)
break;
xianshi(a,i);
}
}
xianshi(a,i);
}
W1302( 0x8e, 0x00);
W1302(0x84,(a[0]*16)|a[1]);
W1302(0x82,(a[2]*16)|a[3]);
}
if(keys==10||keys==11||keys==13)
break;
} //将键值的有效位数记录
}
if(keys==13) //按13显示秒
{
while(1)
{
W1302( 0x8e, 0x00);
da=R1302(0x81); //向秒寄存器读出数据
a[0]=0;
a[1]=0;
a[2]=(da&0xf0)>>4;
a[3]=(da&0x0f); //将键值记录
i=4;
xianshi(a,i);
keys=cci();
if(keys==14)
{
for(i=2;i<4;)
{
if(cci()<10)
{
keys=cci();
a[i]=keys;
i++;
while(1)
{
if(cci()==16)
break;
xianshi(a,i);
}
}
xianshi(a,i);
}
W1302( 0x8e, 0x00);
W1302(0x80,(a[2]*16)|a[3]);
}
if(keys>9&&keys<13)
break;
} //将键值的有效位数记录
}
}
xianshi(a,i); //显示a数组
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -