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

📄 64x64led.c

📁 LED板显示程序 LED板显示程序
💻 C
字号:
/*****************************************************
       16字 LED点阵屏+DS1302电子钟 C 程序
******************************************************
声明:
     本程序中DS1302读写部分是直接引用网上网友提供的共享程序,
	 本程序供大家学习之用,用勿用于商业用途。尊重作者版权。
	 
	 编写:邓椿薪
	 时间:2006年1月20日 晚
	 邮箱:love2151@xinhuanet.com
*******************************************************

 DS1302 接线图

         Vcc2  CLK I/O  /RST 
           
            |   |   |   |
           -------------------
          | 8   7   6   5  |
          |   DS1302       |
          |                |
          | 1   2   3   4  |
           -------------------
            |   |   |   |
         VCC1           GND

1 脚接+5V    2,3脚32768HZ晶振  4脚接地  5脚接S51的P02 6脚接S51的P01 7接S51的P00
8脚接后备电源,可以接老计算机主板上的3.6V电池,也可以通过二级管隔离接一个大容量电解电容
电压在2.5V以上即可维持


595连级输出数据,138行驱动 P1_0为时钟模式转换键、P2_1为时钟加键、P1_2为时钟减键、P2_3为时钟复位键。在对时钟调整时未对调整
项做闪烁处理*/


#include <AT89x51.H>
#define uchar unsigned char
#define uint unsigned int

uchar code timer[12][16]={ 	   /*0~9字符*/
/*--  文字:  0  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0xFF,0xFF,0xFF,0xE7,0xDB,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xDB,0xE7,0xFF,0xFF,

/*--  文字:  1  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0xFF,0xFF,0xFF,0xF7,0xF1,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xC1,0xFF,0xFF,

/*--  文字:  2  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0xFF,0xFF,0xFF,0xC3,0xBD,0xBD,0xBD,0xDF,0xDF,0xEF,0xF7,0xFB,0xBD,0x81,0xFF,0xFF,

/*--  文字:  3  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0xFF,0xFF,0xFF,0xC3,0xBD,0xBD,0xDF,0xE7,0xDF,0xBF,0xBF,0xBD,0xDD,0xE3,0xFF,0xFF,

/*--  文字:  4  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0xFF,0xFF,0xFF,0xDF,0xCF,0xD7,0xDB,0xDB,0xDD,0xDD,0x81,0xDF,0xDF,0x87,0xFF,0xFF,

/*--  文字:  5  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0xFF,0xFF,0xFF,0x81,0xFD,0xFD,0xFD,0xE5,0xD9,0xBF,0xBF,0xBD,0xDD,0xE3,0xFF,0xFF,

/*--  文字:  6  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0xFF,0xFF,0xFF,0xC7,0xDB,0xFD,0xFD,0xE5,0xD9,0xBD,0xBD,0xBD,0xDB,0xE7,0xFF,0xFF,

/*--  文字:  7  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0xFF,0xFF,0xFF,0x81,0xDD,0xDD,0xEF,0xEF,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xFF,0xFF,

/*--  文字:  8  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0xFF,0xFF,0xFF,0xC3,0xBD,0xBD,0xBD,0xDB,0xE7,0xDB,0xBD,0xBD,0xBD,0xC3,0xFF,0xFF,

/*--  文字:  9  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0xFF,0xFF,0xFF,0xE7,0xDB,0xBD,0xBD,0xBD,0x9B,0xA7,0xBF,0xBF,0xDB,0xE3,0xFF,0xFF,

/*--  文字:  :  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0xFF,0xFF,0xFF,0xFF,0xFF,0xE7,0xE7,0xFF,0xFF,0xFF,0xE7,0xE7,0xFF,0xFF,0xFF,0xFF,

/*黑屏字符*/
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF

};


uchar code hanzi[4][128]={	   /*汉字字模*/

/*--  文字:  武  --*/
/*--  宋体48;  此字体下对应的点阵为:宽x高=64x64   --*/
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x3F,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xF0,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x3F,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0x08,0x3F,0xBF,0xFF,0xFF,0xFF,0xFF,0xF8,0x1C,0x3F,0x1F,0xFF,0xFF,0xFF,
0xFF,0xE0,0x7C,0x3E,0x0F,0xFF,0xFF,0xFF,0xFF,0xC0,0xFC,0x3C,0x00,0x00,0x01,0xFF,
0xFF,0x81,0xFC,0x38,0x00,0x00,0x03,0xFF,0xFF,0x03,0xFC,0x3F,0xFF,0xFF,0xE7,0xFF,
0xFF,0x07,0xFC,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0xFC,0x3F,0xFF,0xFF,0xFF,0xFF,
0xFF,0x87,0xFC,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0x8F,0xFC,0x3F,0xFF,0xFF,0xFF,0xFF,
0xFE,0xDF,0xFC,0x3F,0xFF,0xFF,0xFF,0xFF,0xFC,0x7F,0xFC,0x3F,0xFF,0xFF,0xFF,0xFF,
0xF8,0x3F,0xFC,0x3F,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x07,
0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFF,0x1F,
0xFF,0xFF,0xFC,0x3F,0xFF,0xDF,0xFF,0xFF,0xFF,0xFF,0xFC,0x3F,0xFF,0x1F,0xFF,0xFF,
0xFF,0xFF,0xFC,0x3F,0xFC,0x1F,0xFF,0xFF,0xFF,0xFF,0xFC,0x3F,0xF8,0x1F,0xFF,0xFF,
0xFF,0xFF,0xF8,0x3F,0xFC,0x1F,0xFF,0xFF,0xFF,0xFF,0xF8,0x3F,0xFE,0x1F,0xFF,0xFF,
0xFF,0xFF,0xF8,0x3F,0xFE,0x1F,0xFF,0xFF,0xFF,0xFF,0xF8,0x7F,0xFE,0x1F,0xFF,0xFF,
0xFF,0xFF,0xF8,0x7F,0xFE,0x1F,0xF9,0xFF,0xFF,0xFF,0xF8,0x7F,0xFE,0x1F,0xE1,0xFF,
0xFF,0xFF,0xF8,0x7F,0xFE,0x1F,0x81,0xFF,0xFF,0xFF,0xF8,0x79,0xFE,0x1F,0x81,0xFF,
0xFF,0xFF,0xF8,0x70,0xFE,0x1F,0xC1,0xFF,0xFF,0xFF,0xF0,0x60,0x7E,0x1F,0xE1,0xFF,
0xFF,0xFF,0xF0,0xC0,0x00,0x1F,0xE1,0xFF,0xFF,0xFF,0xF0,0xC0,0x00,0x1F,0xE1,0xFF,
0xFF,0xFF,0xF0,0xFF,0xFE,0x1F,0xE1,0xFF,0xFF,0xFF,0xE0,0xFF,0xFE,0x1F,0xE1,0xFF,
0xFF,0xFF,0xE0,0xFF,0xFE,0x1F,0xE1,0xFF,0xFF,0xFF,0xE1,0xFF,0xFE,0x1F,0xE1,0xFF,
0xF7,0xFF,0xE1,0xFF,0xFE,0x1F,0xE1,0xFF,0xE3,0xFF,0xC1,0xFF,0xFE,0x1F,0xE1,0xFF,
0xF3,0xFF,0xC1,0xFF,0xFE,0x1F,0xE1,0xFF,0xF3,0xFF,0x83,0xFF,0xFE,0x1F,0xE1,0xFF,
0xF3,0xFF,0x83,0xFF,0xFE,0x1F,0xE1,0xFF,0xF1,0xFF,0x07,0xFF,0xFE,0x1F,0xE1,0xFF,
0xF1,0xFF,0x07,0xFF,0xFE,0x1F,0xE1,0xFF,0xF1,0xFE,0x0F,0x03,0xFE,0x1F,0xE1,0xFF,
0xF1,0xFC,0x0F,0xC0,0x3E,0x1F,0xE1,0xFF,0xF1,0xF8,0x1F,0xF8,0x00,0x1F,0xE1,0xFF,
0xF0,0xF0,0x1F,0xFF,0x80,0x1F,0xE1,0xFF,0xF0,0xE0,0x3F,0xFF,0xF0,0x00,0xE1,0xFF,
0xF0,0x00,0x7F,0xFF,0xFF,0x00,0x01,0xFF,0xF0,0x00,0xFF,0xFF,0xFF,0xE0,0x00,0x1F,
0xF0,0x01,0xFF,0xFF,0xFF,0xFC,0x00,0x03,0xF0,0x03,0xFF,0xFF,0xFF,0xFF,0xC0,0x07,
0xF0,0x07,0xFF,0xFF,0xFF,0xFF,0xF8,0x0F,0xF0,0x1F,0xFF,0xFF,0xFF,0xFF,0xFE,0x1F,
0xE0,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0xF1,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF






};
uchar code sw[16]={0x60,0x62,0x64,0x66,0x68,0x6a,0x6c,0x6e,
                   0x70,0x72,0x74,0x76,0x78,0x7a,0x7c,0x7e}; /*16行段码*/


void xs_out();                     /*输出显示*/
void out_rxd(unsigned char *d);    /*串口发送一行*/



/******************************************/
sbit resget=P1^3;			//时钟复位
sbit key_moda=P1^0;			//模式转换
sbit key_up=P1^1;			//时钟加
sbit key_Down=P1^2;			//时钟减

sbit T_CLK=P1^7;		//DS1302引脚连接
sbit T_IO =P1^6;
sbit T_RST=P1^5;

sbit ACC0=ACC^0;       //1bit数据存储位
sbit ACC7=ACC^7;

uchar inittime[7]={0x00,0x10,0x22,0x13,0x01,0x05,0x06};	 //初始化后设置为:06年1月12日星期4 21点0分0秒
uchar i,e,yid,zimuo,id,miao,fen,shi,nian,yue,ri,xinqi;  //时间变量

void   RTInputByte(uchar);         /* 输入 1Byte */
uchar  RTOutputByte(void);         /* 输出 1Byte */
void   W1302(uchar, uchar);        // 向DS1302写入一个字节
uchar  R1302(uchar);               // 从DS1302读出一个字节
void   Set1302(uchar *);           // 写DS1302时间
void   du1302();                   // 读时间  
void   DelayMs(void);              // 延时
void   id_case1_key();			   // 加减选取
void   Set(uchar,uchar );          // 变量调整


/*主函数*/
void main()
{
   yid=0;
   zimuo=0;
  SCON=0;             //初始化串口为工作方式0(同步通信方式,TxD输出同步脉冲)
   while(1)            //重复循环显示
   {
  
	  if(resget==0)
	  {DelayMs();
       if(resget==0)
	   Set1302(inittime);           //初始化 
	   W1302(0x8e,0x00);           /* 控制命令,WP=0,写操作?*/                 
	   W1302(0x90,0xa5);           //打开充电二级管  一个二级管串联一个2K电阻 
	  }  
	 	  	
 	if (key_moda==0)	           // 设置和选择项目键
     {DelayMs();
	  if(key_moda==0)
	    {
	      id++;if(id==8) id=0;
		  while(key_moda==0){ xs_out();}    
         }
	   }
	  
    id_case1_key();
	du1302();           //读取 秒 分 时 日 月 星期 年
	xs_out();		        /******调用显示****/
		
   }
 }

/************************************************/
void xs_out()		   //串行输出显示
{
    unsigned char x,h;  
     
   P2=0x7f;
  for(h=0;h<16;h++)
   { 
    for(x=0;x<4;x++)
     { out_rxd(&hanzi[x][7+h*8]);        
	    out_rxd(&hanzi[x][6+h*8]);
		 out_rxd(&hanzi[x][5+h*8]);        
	    out_rxd(&hanzi[x][4+h*8]);

		 out_rxd(&hanzi[x][3+h*8]);        
	    out_rxd(&hanzi[x][2+h*8]);
	  	 out_rxd(&hanzi[x][1+h*8]);        
	    out_rxd(&hanzi[x][0+h*8]);






       }
	 /*****************************************************************/
	  
	   P2_7=1;					  //锁存为高,595锁存信号
	   P2=sw[h];				  //输出行信号
      DelayMs();	 //延时,等待一段时间,让这列显示的内容在人眼内产生“视觉暂留”现象/
	 
	  }
	
 }


/*******************************************************/ 
 void out_rxd(unsigned char *d)	  /*从串口发送数据*/
{
     SBUF=*d;
	  while(TI==0);       //等待发送完毕
      TI=0;
	 
 } 
  

/********************************ds1302时间调整*****************/
void id_case1_key()
{
 

  if (key_up==0) //增加
      {
       DelayMs();
       if(key_up==0)
	   {
	   	while(key_up==0)
		 {xs_out();}
		 Set(id,0);
		 
		}  
             
      }
   
   if (key_Down==0)  //减少
      {
       DelayMs();
       if(key_Down==0)
	    {
	     while(key_Down==0)
		{xs_out();}
		Set(id,1);
		
		}         
            
      }
  
}
//根据选择调整相应项目
void Set(uchar sel,uchar sel_1) 
{
  uchar address,item;
  uchar max,mini;
  if(sel==0)  {address=0x80; max=0;mini=0;}     //秒
  if(sel==1)  {address=0x82; max=59;mini=0;}    //分钟
  if(sel==2)  {address=0x84; max=23;mini=0;}    //小时
  if(sel==3)  {address=0x8a; max=7; mini=1;}    //星期
  if(sel==4)  {address=0x86; max=31;mini=1;}    //日
  if(sel==5)  {address=0x88; max=12;mini=1;}    //月
  if(sel==6)  {address=0x8c; max=99;mini=0;}    //年
  
  
  item=R1302(address+1)/16*10+R1302(address+1)%16;
  if (sel_1==0) item++;  else item--;
  if(item>max) item=mini;   
  if(item<mini) item=max;
           
  W1302(0x8e,0x00);
  W1302(address,item/10*16+item%10);
  W1302(0x8e,0x80);  
}

/**************************延时***********************/

void DelayMs(void)
 {
  uchar TempCyc;
  for(TempCyc=150;TempCyc>1;TempCyc--)
     {;}
 }

//********DS1302读写程序***************//
/******************************************************************** 
函 数 名:RTInputByte()
功    能:实时时钟写入一字节
说    明:往DS1302写入1Byte数据 (内部函数)
入口参数:d 写入的数据 
返 回 值:无  
***********************************************************************/
void RTInputByte(uchar d) 
{ 
    uchar h;
    ACC = d;
    for(h=8; h>0; h--)
    {
        T_IO = ACC0;           /*相当于汇编中的 RRC */
        T_CLK = 1;
        T_CLK = 0;
        ACC = ACC >> 1; 
    } 
}
/******************************************************************** 
函 数 名:RTOutputByte()
功    能:实时时钟读取一字节
说    明:从DS1302读取1Byte数据 (内部函数)
入口参数:无  
返 回 值:ACC
设    计:zhaojunjie           日    期:2002-03-19
修    改:                     日    期: 
***********************************************************************/
uchar RTOutputByte(void) 
{ 
    uchar h;
    for(h=8; h>0; h--)
    {
        ACC = ACC >>1;         /*相当于汇编中的 RRC */
        ACC7 = T_IO;
        T_CLK = 1;
        T_CLK = 0;
    } 
    return(ACC); 
}
/******************************************************************** 
函 数 名:W1302()
功    能:往DS1302写入数据
说    明:先写地址,后写命令/数据 (内部函数)
调    用:RTInputByte() , RTOutputByte()
入口参数:ucAddr: DS1302地址, ucData: 要写的数据
返 回 值:无
***********************************************************************/
void W1302(uchar ucAddr, uchar ucDa)
{
    T_RST = 0;
    T_CLK = 0;
    T_RST = 1;
    RTInputByte(ucAddr);       /* 地址,命令 */
    RTInputByte(ucDa);       /* 写1Byte数据*/
    T_CLK = 1;
    T_RST = 0;
}
/******************************************************************** 
函 数 名:R1302()
功    能:读取DS1302某地址的数据
说    明:先写地址,后读命令/数据 (内部函数)
调    用:RTInputByte() , RTOutputByte()
入口参数:ucAddr: DS1302地址
返 回 值:ucData :读取的数据
***********************************************************************/
uchar R1302(uchar ucAddr)
{
    uchar ucData;
    T_RST = 0;
    T_CLK = 0;
    T_RST = 1;
    RTInputByte(ucAddr);             /* 地址,命令 */
    ucData = RTOutputByte();         /* 读1Byte数据 */
    T_CLK = 1;
    T_RST = 0;
    return(ucData);
}

/******************************************************************** 
函 数 名:Set1302()
功    能:设置初始时间
说    明:先写地址,后读命令/数据(寄存器多字节方式)
调    用:W1302()
入口参数:pClock: 设置时钟数据地址 格式为: 秒 分 时 日 月 星期 年
                               7Byte (BCD码)1B 1B 1B 1B 1B  1B  1B
返 回 值:无
***********************************************************************/
void Set1302(uchar *pClock) 
{
    uchar h;
    uchar ucAddr = 0x80; 
    W1302(0x8e,0x00);           /* 控制命令,WP=0,写操作?*/
    for(h =7; h>0; h--)
    { 
        W1302(ucAddr,*pClock);  /* 秒 分 时 日 月 星期 年 */ 
        pClock++;
        ucAddr +=2;
    }
    W1302(0x8e,0x80);           /* 控制命令,WP=1,写保护?*/

}
/******************读取DS1302中的时间****************/
void du1302()
{
      miao=R1302(0x81);   //对取 秒 分 时 日 月 星期 年
	  fen=R1302(0x83);
	  shi=R1302(0x85);
	  ri=R1302(0x87);
	  yue=R1302(0x89);
	  xinqi=R1302(0x8b);
	  nian=R1302(0x8d);
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -