📄 万年历.c
字号:
/************************************
*程序名:万年历.c
*功 能:万年历
*
*作 者:张小现
*单 位:湖南理工物电系
*
*
*开始时间:2009.03.10
*结束时间:2009.03.10
*版本信息:
*
*注 备:keys 10 11 12 13 14 15 0-9
* 年 月/日 时/分 秒 设置 星期 数据输入
*
*************************************/
#include<reg52.h>
#define N 4
typedef unsigned char uchar ;
typedef unsigned int uint ;
void Delay(uchar); //函数申明
uchar jpdata();
void xsq(void);
void fz(uchar a[],uchar cod[],uchar b);
void xianshi(uchar a[],uchar);
void RTInputByte(uchar);
uchar RTOutputByte(void) ;
uchar R1302(uchar);
void W1302(uchar ucAddr, uchar ucDa);
sbit SCLK = P1^6; //实时时钟时钟线引脚
sbit IO = P3^2; //实时时钟数据线引脚
sbit RST = P3^7; //实时时钟复位线引脚
sbit clk=P0^2;
sbit Data=P0^3;
sbit D6=P0^6;
sbit D7=P0^7;
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
uchar cod[N];
uchar qq;
uchar i,c=0,keys=17,da;
uchar a[N];
void nian();//显示和设置年
void yue_ri();//显示和设置月/日
void shi_fen();//显示和设置时/分
void miao();//显示和设置秒
void xingqi();//显示和设置星期
/*************************************主函数**************************************/
void main(void)
{
W1302( 0x8f, 0x00);
W1302( 0x8e, 0x00);
W1302( 0x80, 0x00);
while (1) //进入循环
{
if(jpdata()!=keys) //判断是否有按键
{
keys=jpdata(); //将键值记录
nian();//显示和设置年
yue_ri();//显示和设置月/日
shi_fen();//显示和设置时/分
miao();//显示和设置秒
xingqi();//显示和设置星期
}
xianshi(a,i); //显示a数组
}
}
/***************************************************************************************************
*函数名: void Delay(uchar time)
*功能: 延时
***************************************************************************************************/
void Delay(uchar time)
{
uchar i,j;
for(i=time;i>0;i--)
for(j=25;j>0;j--);
}
/**************************************************************************************************
*函数名: uchar jpdata()
*功能: 键盘扫描
****************************************************************************************************/
uchar jpdata()
{
uchar u1,u2,ch;
P2 = 0xf0;
Delay(1);
if( (P2&0xf0)!= 0xf0 )
{
Delay(1);
if( (P2&0xf0)!= 0xf0)
{
u1=P2;
P2=0x0f;
u2=P2;
ch=u1|u2;
}
}
switch(ch) //返回相应代码
{
case 0x77: return 3;
case 0x7b: return 2;
case 0x7d: return 1;
case 0x7e: return 0;
case 0xb7: return 7;
case 0xbb: return 6;
case 0xbd: return 5;
case 0xbe: return 4;
case 0xd7: return 11;
case 0xdb: return 10;
case 0xdd: return 9;
case 0xde: return 8;
case 0xe7: return 15;
case 0xeb: return 14;
case 0xed: return 13;
case 0xee: return 12;
default: return 16; //无键按下返回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=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; //c=3
for(i=0;i<b;i++,c--) //i<43. //将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;
case 1: return 0x90;
case 2: return 0x3d;
case 3: return 0xb9;
case 4: return 0x9a;
case 5: return 0xab;
case 6: return 0xaf;
case 7: return 0xb0;
case 8: return 0xbf;
case 9: return 0xbb;
case 10:return 0x00;//不显示
}
}
/******************************************
//函数群名称: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)
{
uchar i;
ACC = d;
for(i=8; i>0; i--)
{
IO = ACC0; /*相当于汇编中的 RRC */
SCLK = 0;
SCLK = 1;
ACC = ACC >> 1;
}
}
uchar RTOutputByte(void)
{
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);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -