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

📄 text1.c

📁 lcd 12864+pcf8563
💻 C
字号:
#include<reg51.h>
#include"zifuku.h"
//#include "delay11us().c"
//#include "PCF8563().C"

#define uchar unsigned char
#define uint unsigned int
sbit CS1=P2^0;			//LCD右屏幕
sbit CS2=P2^1;			//LCD左屏幕
sbit RS=P2^2;			//LCD数据、指令寄存器
sbit RW=P2^3;			//LCD读、写操作
sbit E=P2^4;			//LCD使能信号,下降沿有效



void delay11us(unsigned char t)
{
  for (;t>0;t--);
}


#define uchar unsigned char
#define uint unsigned int

uchar	lcd16_1[16];
uchar	lcd16_2[16] = {"welcome"};
struct time
{
	uchar  second;
	uchar	minute;
	uchar	hour;
	uchar	day;
	uchar	weekday;
	uchar	month;
	uint	year;
} time;

sbit tim_sda=P1^7;
sbit tim_scl=P1^6;



bit	 tim_ack;		// i2c slave ack.
bit	 tim_err;
uchar tim_rd_buffer[16];
uchar tim_wr_buffer[16];


// i2c start.
void PCF8563_start()	//start flag is when tim_scl 1, tim_sdafrom 1 to 0.
{
	tim_sda = 1;
	delay11us(1);
	tim_scl = 1;
	delay11us(1);
	tim_sda = 0;
	delay11us(1);
}

// i2c stop.
void PCF8563_stop()	 		//start flag is when tim_scl 1, tim_sdafrom 0 to 1.
{
	tim_sda = 0;
	delay11us(1);
	tim_scl = 1;
	delay11us(1);
	tim_sda = 0;
}

//i2c slave respons.
void PCF8563_respons()
{
	uchar i;
	tim_scl = 1;
	delay11us(1);
	while((tim_sda)&&(i<250))  i++;
	if(!tim_sda)
		tim_ack = 1;
	else
		tim_ack = 0;
	tim_scl = 0;
	delay11us(1);
}

// i2c master respons.
void PCF8563_master_respons(bit master_ack)
{
	tim_scl = 0;
	delay11us(1);
	tim_sda = ~master_ack;
	delay11us(1);
	tim_scl = 1;
	delay11us(1);
	tim_scl = 0;
	delay11us(1);
}

//i2c init.
void PCF8563_init()
{
	tim_sda = 1;
	delay11us(1);
	tim_scl = 1;
	delay11us(1);
}

// i2c write n byte.
void PCF8563_wr_byte(uchar dat)
{
	uchar i , temp;
	temp = dat;
	for(i=0;i<8;i++)
	{
//		temp = temp<<1;		 //send high to low,
		tim_scl = 0;
		delay11us(1);
//		tim_sda = CY;
		
		if(temp&0x80)
			tim_sda = 1;
		else
			tim_sda = 0;
		temp = temp<<1;
		
		delay11us(1);
		tim_scl = 1;
		delay11us(1);
//		tim_scl = 0;
//		delay11us(1);
	}
	tim_scl = 0;
	delay11us(1);
	tim_sda = 1;			//set tim_sda to 1 to wait respons.
	delay11us(1);
}

uchar PCF8563_rd_byte()
{
	uchar i,k;
	tim_scl = 0;
	delay11us(1);
	tim_sda = 1;
	delay11us(1);
	for(i=0;i<8;i++)
	{
		tim_scl = 1;
		delay11us(1);
		k = (k<<1)|tim_sda;
		tim_scl = 0;
		delay11us(1);
	}
	return k;
}

void PCF8563_write_n_byte(uchar add,uchar com,uchar *dat,uchar n_byte)   //
{
	uchar i = 0;
	uchar temp;

	temp = *dat;			  	// send to begin address to 'temp'.

	add = add<<1;
	add = 0xa0+add+0x00;			

	PCF8563_start();
	PCF8563_wr_byte(add); 		//send EEPROM address, bit 0 = 0 is write.
	PCF8563_respons();
	if(!tim_ack)				//if i2c respons.
	{
		tim_err = 1;
		return;
	}
	
	PCF8563_wr_byte(com);			//send EEPROM beginning address.
	PCF8563_respons();
	if(!tim_ack)				//if i2c respons.
	{
		tim_err = 1;
		return;
	}
	
	while(n_byte)			   //write n byte.
	{
		PCF8563_wr_byte(temp);
		PCF8563_respons();
		if(!tim_ack)				
		{
			tim_err = 1;
			PCF8563_stop();	
			return;
		}
		temp++;
		n_byte--;
	}
	
	PCF8563_stop();	
}

void PCF8563_read_n_byte(uchar add,uchar com,uchar n_byte)
{
	uchar *temp;

	temp = tim_rd_buffer;

	add = add<<1;
	add = 0xa0+add+0x00;
	
//	com = com - 1;			

	PCF8563_start();

	PCF8563_wr_byte(add);	 			//send address + wr.
	PCF8563_respons();

	PCF8563_wr_byte(com);				// first byte address.
	PCF8563_respons();

	add = add+0x01;			

	PCF8563_start();
	PCF8563_wr_byte(add);			   //send address + rd.
	PCF8563_respons();

	while(n_byte)				   // rd n byte . 
	{
		*temp = PCF8563_rd_byte();
		if(n_byte != 1)				//if i2c respons.
		{
			PCF8563_master_respons(1);	//if the number is not the last one, master send a ack bit.
//			return;
		}
		temp++;
		n_byte--;
	}
	PCF8563_stop();
}

void PCF8563_wr_time()
{
	tim_wr_buffer[0] = 0x00;	//second
	tim_wr_buffer[1] = 0x11;	//minute
	tim_wr_buffer[2] = 0x22;	//hour

	tim_wr_buffer[3] = 0x15;	//day
	tim_wr_buffer[4] = 0x03;	//weekday
	tim_wr_buffer[5] = 0x06;	//month
	tim_wr_buffer[6] = 0x10;	//year

	
	PCF8563_write_n_byte(1,2,tim_wr_buffer,8);
}

void PCF8563_rd_time()
{
	uchar	temp;

	PCF8563_read_n_byte(1,2,9);

	time.second = ((tim_rd_buffer[1]&0x70)>>4)*10 + (tim_rd_buffer[1]&0x0f);	//second	 		
	time.minute = ((tim_rd_buffer[2]&0x70)>>4)*10 + (tim_rd_buffer[2]&0x0f);	//minute
	time.hour = ((tim_rd_buffer[3]&0x30)>>4)*10 + (tim_rd_buffer[3]&0x0f);		//hour
	time.day = ((tim_rd_buffer[4]&0x30)>>4)*10 + (tim_rd_buffer[4]&0x0f);		//day
	time.weekday = tim_rd_buffer[5]&0x07;										//weekday
	time.month = ((tim_rd_buffer[6]&0x10)>>4)*10 + (tim_rd_buffer[6]&0x0f);		//month

	temp = (tim_rd_buffer[4]&0x80)>>7;
	time.year = (temp+19)*100+((tim_rd_buffer[7]&0x70)>>4)*10 + (tim_rd_buffer[7]&0x0f);	   //year

		lcd16_1[0] = time.hour/10+0x30;	  //hour
		lcd16_1[1] = time.hour%10+0x30;
		lcd16_1[2] = '-';
		lcd16_1[3] = time.minute/10+0x30;	  //minute
		lcd16_1[4] = time.minute%10+0x30;
		lcd16_1[5] = '-';
		lcd16_1[6] = time.second/10+0x30;	  //second
		lcd16_1[7] = time.second%10+0x30;

 		lcd16_2[0] = time.year/1000+0x30;	  //year
		lcd16_2[1] = (time.year%1000)/100+0x30;
		lcd16_2[2] = (time.year%100)/10+0x30;
		lcd16_2[3] = time.year%10+0x30;
		lcd16_2[4] = '-';
		lcd16_2[5] = time.month/10+0x30;  //mon
		lcd16_2[6] = time.month%10+0x30;
		lcd16_2[7] = '-';
		lcd16_2[8] = time.day/10+0x30;	  //day
		lcd16_2[9] = time.day%10+0x30;

		lcd16_2[10] = ' ';
		lcd16_2[11] = time.weekday+0x30;

		
}
void w_com(uchar com)
{
	 //buys();
	 RW=0;
	 RS=0;
	 E=1;
	 P0=com;
	 E=0;
}


void w_date(uchar date)
{
	 //buys();
	 RW=0;
	 RS=1;
	 E=1;
	 P0=date;
	 E=0;
}


/*
	   LCD选屏函数
*/
void select_screen(uchar screen)
{
	   switch(screen)
	   {
	   		  case 0:     //选择全屏
			             CS1=0;
						 CS2=0;
	   					 break;
			  case 1:     //选择左屏
			             CS1=0;
						 CS2=1;
	   					 break;
			           
	   	   	  case 2:     //选择右屏
			             CS1=1;
						 CS2=0;
	   					 break;
			/*  case 3:     //选择右屏
			             CS1=1;
						   CS2=1;
	   				      break;
			*/
	   }	   	  
	   
}

/*
	 LCDx向上滚屏显示
*/

/*
	   LCD清屏函数:清屏从第一页的第一列开始,总共8页,64列
*/
void clear_screen(screen)
{
	 int x,y;
	 select_screen(screen);		   //screen:0-选择全屏,1-选择左半屏,2-选择右半屏
	 for(x=0xb8;x<0xc0;x++)			//从0xb8-0xbf,共8页
	    {
			w_com(x);
			w_com(0x40);			//列的初始地址是0x40
			for(y=0;y<64;y++)
			   {
			   	    w_date(0x00);
			   
			    }
	     }	   
}

/*
		LCD显示汉字字库函数
*/
void lcd_display_hanzi(uchar screen,uchar page,uchar col,uint mun)
{		//screen:选择屏幕参数,page:选择页参数0-3,col:选择列参数0-3,mun:显示第几个汉字的参数
      int a;
	  mun=mun*32;
	  select_screen(screen);
	  w_com(0xb8+(page*2));
	  w_com(0x40+(col*16));
	  for (	a=0;a<16;a++)
	     {
		 	   w_date(hanzi[mun++]);
		 
		 }
	  w_com(0xb8+(page*2)+1);
	  w_com(0x40+(col*16));
	  for (	a=0;a<16;a++)
	     {
		 	   w_date(hanzi[mun++]);
		 
		 }
}

void lcd_display_shuzi(uchar screen,uchar page,uchar col,uchar mun)
{		//screen:选择屏幕参数,page:选择页参数0-3,col:选择列参数0-7,mun:显示第几个汉字的参数
      int a;
	  mun=mun*16;
	  select_screen(screen);
	  w_com(0xb8+(page*2));
	  w_com(0x40+(col*8));
	  for (	a=0;a<8;a++)
	     {
		 	   w_date(shuzi[mun++]);
		 
		 }
	  w_com(0xb8+(page*2)+1);
	  w_com(0x40+(col*8));
	  for (	a=0;a<8;a++)
	     {
		 	   w_date(shuzi[mun++]);
		 
		 }
}

/*
		LCD初始化函数
*/
void lcd_init()
{
	 w_com(0x3f);		 //LCD开显示
	 w_com(0xc0);		 //LCD行初始地址,共64行
	 w_com(0xb8);		 //LCD页初始地址,共8页
	 w_com(0x40);		 //LCD列初始地址,共64列
    
}

/*
		LCD显示主函数
*/
void main()
{
      
	  lcd_init();			  //LCD初始化
	  clear_screen(0);		  //LCD清屏幕
	  PCF8563_init();
	PCF8563_wr_time();
   while(1)
   {		 PCF8563_rd_time();
	  		 lcd_display_shuzi(1,1,0,lcd16_2[0]);
			 lcd_display_shuzi(1,1,1,lcd16_2[1]);
			 lcd_display_shuzi(1,1,2,lcd16_2[2]);
			 lcd_display_shuzi(1,1,3,lcd16_2[3]);
		 	 lcd_display_hanzi(1,1,2,0);		  //LCD显示汉字
		 	 lcd_display_shuzi(1,1,6,lcd16_2[5]);
			 lcd_display_shuzi(1,1,7,lcd16_2[6]);
	  		 lcd_display_hanzi(2,1,0,1);
	     	 lcd_display_shuzi(2,1,2,lcd16_2[8]);
		 	 lcd_display_shuzi(2,1,3,lcd16_2[9]);
			 lcd_display_hanzi(2,1,2,2);
			 lcd_display_shuzi(1,2,0,lcd16_1[0]);
			 lcd_display_shuzi(1,2,1,lcd16_1[1]);
			 lcd_display_hanzi(1,2,1,3);
			 lcd_display_shuzi(1,2,4,lcd16_1[3]);
			 lcd_display_shuzi(1,2,5,lcd16_1[4]);
			 lcd_display_hanzi(1,2,3,4);
			 lcd_display_shuzi(2,2,0,lcd16_1[6]);
			 lcd_display_shuzi(2,2,1,lcd16_1[7]);
			 lcd_display_hanzi(2,2,1,5); 
			 

	}
	
}





⌨️ 快捷键说明

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