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

📄 time.c

📁 单片机的数字时钟
💻 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 + -