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

📄 万年历.c

📁 基于AT89S52的万年历C51程序 开发平台:Keil uVision2 日历芯片:DS1302
💻 C
📖 第 1 页 / 共 2 页
字号:
/************************************
*程序名:万年历.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 + -