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

📄 1302.c

📁 52单片机开发板的实例程序
💻 C
字号:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P1^0;
sbit rw=P1^1;
sbit en=P1^2;
sbit clk=P1^7;
sbit dat=P1^4;
sbit cs=P1^3;
uchar code a[]="  2010-11-30   1";
uchar code b[]="   00:00:00     ";
uchar read_date[]={0x00,0x59,0x23,0x30,0x11,0x06,0x10};
                            //秒、分、小时、日、月、星期、年
code uchar write_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; 
code uchar read_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
void delay(uint z)
{
	uint x,y;
	for(x=z;x>0;x--)
	for(y=110;y>0;y--);
}
void delayus(uint k)
{
   for(;k>0;k--);
}
void check_1602()
{
  P2=0xff;
  rs=0;
  rw=1;
  en=1;
  delayus(3);
  while(P2&0x80);
  en=0;
  
}
void write1602_command(uchar d,uchar command)//写指令子函数
{
   if(d)
   check_1602();
   rs=0;
   rw=0;
   P2=command;
   delayus(100);
   en=1;
   delay(4);
   en=0;
}
void write1602_data(uchar date)//写数据子函数
{
   rs=1;
   rw=0;
   P2=date;
   delayus(100);
   en=1;
   delay(4);
   en=0;
}
void init()
{	
	en=0;
	rw=0;
	write1602_command(1,0x38);
	write1602_command(1,0x01);
	write1602_command(1,0x0c);
	write1602_command(1,0x06);
	write1602_command(1,0x80);
}
void write_1302_byte(uchar temp) 
{
 uchar i;
 for (i=0;i<8;i++)     	//循环8次 写入数据
  { 
     clk=0;
     dat=temp&0x01;     	//每次传输低字节 
     temp>>=1;  		//右移一位
     clk=1;
   }
}   
void write_1302( uchar add,uchar date )     
{
 	cs=0;
	_nop_();
 	clk=0;
	_nop_();
 	cs=1;	
   	_nop_();   //启动
 	write_1302_byte(add);	//发送地址
 	write_1302_byte(date);		//发送数据
 	cs=0;  		//恢复
}	
uchar Read_Ds1302 (uchar addr )
{
 	uchar i,temp=0x00;
 	cs=0;
	_nop_();
 	clk=0;
	_nop_();
 	cs=1;
	_nop_();
 	write_1302_byte(addr);
 	for (i=0;i<8;i++) 		//循环8次 读取数据
 	{
		clk=1;	
		_nop_();	
 		if(dat)
 		temp|=0x80;			//每次传输低字节
		clk=0;
		temp>>=1;			//右移一位
	} 
 	cs=0;
	_nop_();		
	cs=1;
	dat=0;

	return (temp);			//返回
}
void Read_RTC(void)		//读取 日历
{
 unsigned char i,*p;
 p=read_address; 	//地址传递
 for(i=0;i<7;i++)		//分7次读取 年月日时分秒星期
 {
  read_date[i]=Read_Ds1302(*p);
  p++;
 }
}
void Set_RTC(void)		//设定 日历
{
	unsigned char i,*p,tmp;
	/*for(i=0;i<7;i++){
		tmp=l_tmpdate[i]/10;
		l_tmpdate[i]=l_tmpdate[i]%10;
		l_tmpdate[i]=l_tmpdate[i]+tmp*16;
	}*/
 	write_1302(0x8E,0X00);
	
 	p=write_address;	//传地址	
 	for(i=0;i<7;i++)		//7次写入 年月日时分秒星期
 	{
		  write_1302(*p,read_date[i]);
 		 p++;  
	 }
	 write_1302(0x8E,0x80);
}
void display(uchar num)
{
   write1602_data(num/16+0x30);
   write1602_data(num%16+0x30);  
}
void main()
{		uchar i;
		init();
    write1602_command(1,0x80);
	for(i=0;i<16;i++)
			{
				write1602_data(a[i]);
				delay(1);
			}
     write1602_command(1,0x80+0x40);
	for(i=0;i<16;i++)
			{
				write1602_data(b[i]);
				delay(1);
			}
    //cs=0;
	//Set_RTC();
	    while(1)   
		{
           Read_RTC();
          write1602_command(1,0x80+0x40+9);
           display(read_date[0]);
          write1602_command(1,0x80+0x40+6);
           display(read_date[1]);
         write1602_command(1,0x80+0x40+3);
           display(read_date[2]);
         write1602_command(1,0x80+10);
           display(read_date[3]);
        write1602_command(1,0x80+7);
           display(read_date[4]);
         write1602_command(1,0x80+15);
           write1602_data(0x30+read_date[5]);
          write1602_command(1,0x80+4);
           display(read_date[6]);
		}
	
}

⌨️ 快捷键说明

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