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

📄 wgx_1302_lcd.c

📁 第二个万年历时钟 电路图 程序 都有!!和前面那个有点区别
💻 C
字号:
/*****************************************
程序名:wgx_1302_lcd.c
设计者:wanggguangxi11@163.com
时  间:2007-12-14
功  能:基于1302时钟芯片用LCD12864液晶显
******************************************/
#include <reg52.h>
#define uchar unsigned char 
#define uint unsigned int
#include "12864.h"		  //注意掉用子程序的次序
#include "code_12864.h"
#include "12864_declar.h"
#include "INTRINS.H"
#include "lcd_12864.h"

sbit T_CLK = P2^0; 	 	//*实时时钟时钟线引脚 
sbit T_IO =  P2^1; 		//*实时时钟数据线引脚
sbit T_RST = P2^2; 		//*实时时钟复位线引脚 

uchar data day[7]={0x00,0x59,0x23,0x14,0x12,0x04,0x07};//时钟赋初值	
uchar data g_day[7];
uchar data b[30];

//延时大约0.5S
void delay1	(uint n)		   
{
	while(--n); 
}
void delay(void)
{
	uchar i,j=8;
	while(j--) 
	delay1(6000);

}

//十进转换成BCD码
void 	BCD(void)
   {	uchar i,j=0;   
   	 	for (i=0;i<7;i++)
          {
       	 	b[j]=g_day[i]&0x0f;
	     	j++;
	     	b[j]=(g_day[i]&0xf0)>>4;
	     	j++;
          }
    }

//往1302写入1Byte数据,输入:ucDa数据   
void	 inputByte(uchar ucDa) 
   { 
		uchar i;
		ACC = ucDa;
		for	(i=8; i>0; i--)
		  {
			T_IO = ACC_0;    //*相当于汇编中的 RRC
			T_CLK = 1;
			_nop_();
			T_CLK = 0;
			ACC = ACC >> 1; 
		  } 
   }

//从1302中读取1Byte数据,返回值:ACC
uchar 	outputByte(void) 
    { 
		uchar i;
		for	(i=8; i>0; i--)
		{
			ACC = ACC >>1;   //*相当于汇编中的 RRC
			ACC_7 = T_IO;
			T_CLK = 1;
			_nop_();
			T_CLK = 0;
    } 
		return(ACC); 
	}

//往1302中写入数据
void w_adr_data(uchar ucAddr, uchar ucDa)
    {
		T_RST = 0;
		T_CLK = 0;
		T_RST = 1;
		_nop_();
		inputByte(ucAddr); //*地址、命令(写数据:0X80) 
		inputByte(ucDa);   //* 写1Byte数据
		T_CLK = 1;
		T_RST =0;
    } 

//读取1302某地址的数据
uchar 	R_1data(uchar ucAddr)	//*读1地址数据
    {
		uchar ucDa;
 		T_RST = 0;
		T_CLK = 0;
		T_RST = 1;
		_nop_();
		inputByte(ucAddr);   //* 地址,命令(读数据:0X81)
		ucDa = outputByte(); //* 读1Byte数据 
		T_CLK = 1;
		T_RST =0;
		return(ucDa);
    }

//住1302写入时钟数据
void 	W_8data(uchar *pSecDa)	   //*写8个数据*/
    {
		uchar i;
		w_adr_data(0x8e,0x00);    //* 控制命令,WP=0,写操作*/
		T_RST = 0;
		T_CLK = 0;
		T_RST = 1;
		_nop_();
		inputByte(0xbe);          //* 0xbe:时钟多字节写命令 */
		for 	(i=8;i>0;i--)     //*8Byte = 7Byte 时钟数据 + 1Byte 控制*/
		    {
				inputByte(*pSecDa);//* 写1Byte数据*/
				pSecDa++;
			}
				T_CLK = 1;
				T_RST =0;
   } 
/******************************************************************** 
* 名称: R_8_time
* 说明: 先写地址,后读命令/数据(时钟多字节方式)
* 功能: 读取DS1302时钟数据
* 调用: inputByte() , outputByte()
* 输入: pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: ucDa :读取的数据
***********************************************************************/
void	 R_8_time(uchar *pSecDa)
    {
		uchar i;
		T_RST = 0;
		T_CLK = 0;
		T_RST = 1;
		_nop_();
		inputByte(0xbf);                //* 0xbf:时钟多字节读命令 */
		for		(i=8; i>0; i--) 
		   {
				*pSecDa = outputByte(); //* 读1Byte数据 */
				pSecDa++;
		   }
		T_CLK = 1;
		T_RST =0;
    }
/******************************************************************** 
* 名称: W_ram
* 说明: 先写地址,后写数据(寄存器多字节方式)
* 功能: 往DS1302寄存器数写入数据(多字节方式)
* 调用: inputByte() 
* 输入: pReDa: 寄存器数据地址
* 返回值: 无
***********************************************************************/
void 	W_ram(uchar *pReDa)
   {
		uchar i;
		w_adr_data(0x8e,0x00);        //* 控制命令,WP=0,写操作?*/
		T_RST = 0;
		T_CLK = 0;
		T_RST = 1;
		inputByte(0xfe);              //* 0xbe:时钟多字节写命令 */
		for 	(i=31;i>0;i--)        //*31Byte 寄存器数据 */
		   {
				inputByte(*pReDa);    //* 写1Byte数据*/
				pReDa++;
		    }
				T_CLK = 1;
				T_RST =0;
    } 	
/******************************************************************** 
* 名称: R_ram
* 说明: 先写地址,后读命令/数据(寄存器多字节方式)
* 功能: 读取DS1302寄存器数据
* 调用: inputByte() , outputByte()
* 输入: pReDa: 寄存器数据地址
* 返回值: 无
***********************************************************************/
void 	R_ram(uchar *pReDa)
    {
		uchar i;
		T_RST = 0;
		T_CLK = 0;
		T_RST = 1;				    
		inputByte(0xff);              //* 0xFF 时钟多字节读命令 
		for 	(i=31; i>0; i--)      //*31Byte 寄存器数据 
		   {
				*pReDa = outputByte();//* 读1Byte数据 
				pReDa++;
			}
				T_CLK = 1;
				T_RST =0;
}
/*********************************************************************
* 名称: init
* 说明: 
* 功能: 设置初始时间
* 调用: w_adr_data() 
* 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年 
* 返回值: 无
***********************************************************************/
void 	init(uchar *pSecDa) 
    {
		uchar i;
		uchar ucAddr = 0x80; 				//写数据:0X80
		w_adr_data(0x8e,0x00);              //* 控制命令,WP=0,写操作
		for		(i =7;i>0;i--)
		    { 
				w_adr_data(ucAddr,*pSecDa); //* 秒 分 时 日 月 星期 年 */
				pSecDa++;
				ucAddr +=2;
			}
				w_adr_data(0x8e,0x80);
    }
/*********************************************************************
* 名称: get_day
* 说明: 
* 功能: 读取DS1302当前时间
* 调用: R_1data() 
* 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年 
* 返回值: 无
***********************************************************************/
void 	get_day(uchar ucCurtime[]) 
    {
	uchar i;
	uchar ucAddr = 0x81;				   // 读数据:0X81
	for 	(i=0;i<7;i++)
	   {
			ucCurtime[i] = R_1data(ucAddr);//*格式为: 秒 分 时 日 月 									星期 年 */
			ucAddr += 2;
    	}
    }

//时间显示程序
void show_time(uchar row)
    {
		uchar i;
		uchar one_time[8]={0,0,10,0,0,10,0,0};
		get_day(g_day);
	   	BCD();
		one_time[0]=b[5]; one_time[1]=b[4];			  //(时间处理程序)前为个位,后为十位
		one_time[3]=b[3]; one_time[4]=b[2];
		one_time[6]=b[1]; one_time[7]=b[0];
	   	for(i=0;i<4;i++)
	   	{	
		   	Left_Show_letter(row,32+i*8,one_time[i]); //左屏时间显示
			Right_Show_letter(row,i*8,one_time[4+i]); //右屏时间显示
	    }	
	}


void show_date(void)
    {
		get_day(g_day);
	   	BCD();					
		Left_Show_letter(0,0,2);			 //左屏"年份"显示(初始化为2007)
		Left_Show_letter(0,8,0);
		Left_Show_letter(0,16,b[13]);
		Left_Show_letter(0,24,b[12]);

		Left_Show_Word(0,32,0);				//左屏"年"显示
		Right_Show_letter(0,0,b[9]);		//右屏"月份"显示
		Right_Show_letter(0,8,b[8]);
		Right_Show_Word(0,16,1);			//右屏"月"显示
		Right_Show_letter(0,32,b[7]);		//右屏"日期"显示
		Right_Show_letter(0,40,b[6]);
		Right_Show_Word(0,48,2);
	}

//主函数 
void main (void )
	{ 	
		Show_Null();					   //清屏
		T_CLK=1;
		_nop_();
		T_CLK=0;
	 	init(day);
		T_CLK=0;
	 	w_adr_data(0x80,0x00) ;
	 	while (1)
	 	{	show_date();		    	   			   
	   		show_time(3);					 //时间从第四行开始(屏幕总8行"0~7")
			Left_Show_Word(6,32,3);			 //左屏"星"显示
			Left_Show_Word(6,48,4);			 //左屏"期"显示
			Right_Show_Word(6,16,b[10]+5);	 //右屏"五"显示(初始化)
			delay();
			Left_Show_letter(3,48,11);		 //显示秒闪 ":"
			Right_Show_letter(3,8,11);
			delay();				
	 }		
	}

⌨️ 快捷键说明

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