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

📄 main.c

📁 LCD1602.rar
💻 C
字号:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P3^3;
sbit rw=P3^4;
sbit en=P3^5;
sbit bflag=P2^7;
sbit reset=P3^0;
sbit sclk=P3^1;
sbit io=P3^2;
uchar str1[]="date of today is:";
//uchar str2[]="i will kill you lj";
uchar init[]={0x00,0x00,0x21,0x21,0x10,0x01,0x04};//秒,分,时,日,月,星期,年
//
void delay()
{
	uchar j;
 	for(j=250;j>0;j--);
}

//-------------------液晶模块-----------------//
void en_toggle()
{
  	en=0;
  //_nop_();
 	delay();
  	en=1;
 	delay();
 // _nop_();
  	en=0;
}   
          //注意必须加延时,否则会出问题的
void is_ready()
{
   P2=0x00;//设置为输入口
   rs=0;
   rw=1;
   en=1;
   while(bflag);
   en=0;
}

void write_cmd(uchar cmd)
{
  	is_ready();
  	rs=0;
  	rw=0;
  	P2=cmd;
  	en_toggle();
}

void write_data(uchar indata)
{
  	is_ready();
  	rs=1;
  	rw=0;
  	P2=indata;
  	en_toggle();
  	_nop_();
}

void write_str(uchar addr,uchar *p)
{
 	uchar i; 
 	write_cmd(addr);
 	while(p[i]!='\0')
 	{
		write_data(p[i]);
  		i++;
 	}
}

void write_position(uchar row,uchar col)
{
	uchar p;
	 if(row==1)
	 {
	 	p=0x80+col-1;
 		write_cmd(p);
	}
 	else
 	{
		p=0xc0+col-1;
  		write_cmd(p);
    }
}
void init_lcd()
{
 	write_cmd(0x38);
 	write_cmd(0x0c);
 	write_cmd(0x06);
 	write_cmd(0x01);//清屏幕
 	delay();
}
//------------液晶模块结束---------------------

//-----------ds1302模块开始-------------------
//注意点:sclk的上升沿输入数据,sclk的下跳沿输出数据
//读写时都是从第0位开始
void write_byte(uchar inbyte)
{
 	uchar i;
 	for(i=8;i>0;i--)
 	{
  		sclk=0;
 		if(inbyte&0x01)
  			io=1;
  		else
  			io=0; 
  		sclk=1;
  		_nop_();
  		inbyte=inbyte>>1;
 	}
}

uchar read_byte() //sclk的下跳沿读数据
{
 	uchar i,temp=0; 
 	io=1;          //设置为输入口
 	for(i=7;i>0;i--)
 	{
		sclk=0;
		if(io==1)
   			temp=temp|0x80;
   		else
   			temp=temp&0x7f;
   		sclk=1;
   		temp=temp>>1;
 	}
	 //sclk=0;
	 return (temp);
}

//----------往ds1302的某个地址写入数据-------------
void write_ds1302(uchar cmd,uchar indata)
{
  	reset=1;
  	write_byte(cmd);
  	write_byte(indata);
  	reset=0;
  	sclk=0;
}

//----------读ds1302某地址的的数据-----------------
uchar read_ds1302(uchar addr)
{
 	uchar backdata;
 	reset=1;
 	write_byte(addr);
 	backdata=read_byte();//先写地址,然后读数据
 	reset=0;
 	//sclk=0;
 	return (backdata);
}

//------------设置初始时间-------------------
void set_ds1302(uchar addr,uchar *p,uchar n)//写入n个数据
{
  	write_ds1302(0x8e,0x00);//写控制字,允许写操作
  	for(;n>0;n--)
  	{
		write_ds1302(addr,*p);
   		p++;
   		addr=addr+2;
  	}
  	write_ds1302(0x8e,0x80);//写保护,不允许写
}

//----------- 读取当前时间-------------------
void read_nowtime(uchar addr,uchar *p,uchar n)
{
	for(;n>0;n--)
	{
   		*p=read_ds1302(addr);
   		p++;
   		addr=addr+2;
 	} 		   
}
void init_ds1302()
{
	reset=0;
  	sclk=0;
  	write_ds1302(0x80,0x00);//写控制字,允许写
  	write_ds1302(0x90,0x00);//禁止涡流充电 
}

//-----------ds1302模块结束-------------------
void main()
{
 	init_lcd();             //初始化LCD
	write_str(0x80,str1);	  //液晶显示提示信息
 	init_ds1302();          //初始化ds1302
 	set_ds1302(0x80,init,7);//设置初始时间,日期,年月
  	while(1)
  	{
		read_nowtime(0x81,init,7); //读出当前时间
	    write_position(2,1);
   		write_data('0'+((init[2]&0xf0)>>4));
		write_position(2,2);
   		write_data('0'+(init[2]&0x0f));	//读小时

   		write_position(2,3);
   		write_data(':');

   		write_position(2,4);
   		write_data('0'+((init[1]&0xf0)>>4));
  
   		write_position(2,5);
   		write_data('0'+(init[1]&0x0f));    //读分钟
  
   		write_position(2,6);
   		write_data(':');

   		write_position(2,7);
   		write_data('0'+((init[0]&0xf0)>>4));
  
   		write_position(2,8);
   		write_data('0'+(init[0]&0x0f));	//读秒
	}
}

⌨️ 快捷键说明

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