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

📄 main.c

📁 PIC16f886单片机操作DS1302的程序+proteus仿真文件!实物通过的代码!
💻 C
字号:
#include<pic.h>
#define uchar unsigned char
#define uint unsigned int
#define rst RC4
#define clk RC6
#define data RC5
#define dataI TRISC5=1
#define dataO TRISC5=0
#define  rs RB0
#define rw RB1
#define en RB2
#define busy RC7
#define DATA PORTC
#define sec 0x80
#define min 0x82
#define hour 0x84
#define date 0x86
#define mon 0x88
#define day 0x8a
#define year 0x8c
uchar tab[8],t1,flag;
uchar dd[21]="sunmontuewenthufrisat";
const uchar tab1[]={0x59,0x05,0x21,0x27,0x11,0x05,0x08,0x00};

void delay(uchar i)
{
	uchar j;
	for(;i>0;i--)
		for(j=10;j>0;j++);
}

void write_com(uchar com)
{
	delay(1);
	DATA=com;
	rs=0;
	rw=0;
	en=1;
	delay(1);
	en=0;
}

void write_dat(uchar dat)
{
	delay(1);
	DATA=dat;
	rs=1;
	rw=0;
	en=1;
	delay(1);
	en=0;
}

void lcd_init()
{
	uchar n;
	TRISC=0x00;
	PORTC=0x00;
	TRISB&=0xf8;
	ANSELH=0x00;
	en=0;
	write_com(0x38);
	write_com(0x0c);
	write_com(0x06);
	write_com(0x01);
	write_com(0x80);
}


void io_init()
{
	TRISC=0x00;
	PORTC=0xff;
}

void write_byte(uchar x)
{
	uchar i;			//写一个字节
	for(i=0;i<8;i++)
	{
		if(x&0x01==1)
		{
			data=1;
		}
		else
		{
			data=0;
		}
		clk=1;
		clk=0;
		x=x>>1;
	}
}

uchar read_byte()
{
	uchar y=0x00,j;	//读一个字节
	dataI;
	for(j=0;j<8;j++)
	{
		y=y>>1;
		if(data==1)
		{
			y|=0x80;
		}
		else
		{
			y=y;
		}
		clk=1;
		clk=0;
	}
	dataO;
	return y;
}

unsigned char read1302(uchar add)
{						//读1302某地址数据
	unsigned char dat;
	rst=0;
	clk=0;
	rst=1;
	write_byte(add|1);
	dat=read_byte();
	rst=0;
	clk=1;
	return dat;
}

unsigned char write1302(uchar add,uchar dat)
{						//写1302某地址数据
	rst=0;
	clk=0;
	rst=1;
	write_byte(add);
	write_byte(dat);
	clk=1;
	rst=0;
}

void read_time()//单次读取1302
{
	tab[0]=read1302(sec);
	tab[1]=read1302(min);
	tab[2]=read1302(hour);
	tab[3]=read1302(date	);
	tab[4]=read1302(mon);
	tab[5]=read1302(day);
	tab[6]=read1302(year);
}

void num_change()//BCD转10进制
{
	uchar i,x;
	for(i=0;i<7;i++)
	{
		x=tab[i]/16;
		tab[i]=tab[i]-6*x;
	}
}



void show_time()//在1602上显示时间
{
	uchar y2,y1,m2,m1,d2,d1,i,h2,h1,mm2,mm1,s2,s1;
	write_com(0x80);
	y2=tab[6]/10;
	y1=tab[6]%10;
	write_dat(0x32);
	write_dat(0x30);
	write_dat(y2+0x30);
	write_dat(y1+0x30);
	write_dat(0x2e);
	
	m2=tab[4]/10;
	m1=tab[4]%10;
	write_dat(m2+0x30);
	write_dat(m1+0x30);
	write_dat(0x2e);
	
	d2=tab[3]/10;
	d1=tab[3]%10;
	write_dat(d2+0x30);
	write_dat(d1+0x30);
	
	write_com(0x8d);
	switch(tab[5])
	{
		case 0x01:	for(i=0;i<3;i++)
					{
						write_dat(dd[i]);	
					}
					break;
		case 0x02: 	for(i=0;i<3;i++)
					{
						write_dat(dd[i+3]);	
					}
					break;
		case 0x03:	for(i=0;i<3;i++)
					{
						write_dat(dd[i+6]);	
					}
					break;
		case 0x04:	for(i=0;i<3;i++)
					{
						write_dat(dd[i+9]);	
					}
					break;
		case 0x05:	for(i=0;i<3;i++)
					{
						write_dat(dd[i+12]);	
					}
					break;
		case 0x06:	for(i=0;i<3;i++)
					{
						write_dat(dd[i+15]);	
					}
					break;
		case 0x07:	for(i=0;i<3;i++)
					{
						write_dat(dd[i+18]);	
					}
					break;
	}
	
	write_com(0xc0);
	
	h2=tab[2]/10;
	h1=tab[2]%10;
	write_dat(h2+0x30);
	write_dat(h1+0x30);
	write_dat(0x3a);

	mm2=tab[1]/10;
	mm1=tab[1]%10;
	write_dat(mm2+0x30);
	write_dat(mm1+0x30);
	write_dat(0x3a);

	s2=tab[0]/10;
	s1=tab[0]%10;
	write_dat(s2+0x30);
	write_dat(s1+0x30);
	
}

void show_realtime()//一次读取一个字节读取7个字节
{
	read_time();
	num_change();
	show_time();
}

void tmr1_init()//定时器1初始化
{
	GIE=1;
	PEIE=1;
	TMR1IE=1;
	TMR1IF=0;
	T1CON=0x30;
	TMR1L=0xd5;//定时0.5s
	TMR1H=0x0b;
	TMR1ON=1;
	
}

void interrupt tmr1()//定时器中断函数
{
	if(TMR1IF==1)
	{
		TMR1L=0xd5;
		TMR1H=0x0b;
		TMR1IF=0;
		t1++;
		if(t1==2)
		{
			t1=0;
			flag=1;
		}
	}
}

void protect_change()//读取开启定时器和写使能
{
	uchar xx,yy;
	xx=read1302(0x80);
	yy=read1302(0x8e);
	if(xx&0x80==1)
	{
		write1302(0x80,0x00);
	}
	if(yy&0x80==1)
	{
		write1302(0x8e,0x00);
	}
}

void time_init()//给1302赋初值
{
	uchar i;
	rst=0;
	clk=0;
	rst=1;
	write_byte(0xbe);
	for(i=0;i<8;i++)
	{
		write_byte(tab1[i]);		
	}
	clk=1;
	rst=0;
}

void read_times()//一次读取8个字节
{
	uchar i;
	rst=0;
	clk=0;
	rst=1;
	write_byte(0xbf);
	for(i=0;i<8;i++)
	{
		tab[i]=read_byte();
	}
	clk=1;
	rst=0;	
}

void show_realtimes()//一次读取8个字节显示
{
	read_times();
	num_change();
	show_time();
}

void main()
{	
	tmr1_init();
	io_init();
//	time_init();
	protect_change();
	lcd_init();
	show_realtime();
	
	while(1)
	{
		if(flag==1)
		{
			NOP();
			flag=0;
			show_realtimes();
			NOP();
		}
	}
}

⌨️ 快捷键说明

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