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

📄 time.c

📁 再来一个IIC的时钟实现的例程吧。都是自己写的
💻 C
字号:
#include<at89x52.h>
#define uchar unsigned char
#define SCL P1_0
#define SDA P1_1

#define E1 P1_3
#define E2 P1_2
#define RS P3_5
#define RW P3_6
#define E P3_7
#define LED_BUS P2

idata uchar rom_sed[]={0x00,0x56,0x23,0x03,0x21,0x03,0x07,0x00};//秒;分;小时;星期;日;月;年;输出波
idata uchar rom_rec[9];
bit flag,flag1;

/******字库*******/
code uchar zhifu[][16]={
{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00},//0
{0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},//1
{0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00},//2
{0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00},//3
{0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00},//4
{0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00},//5
{0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00},//6
{0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00},//7
{0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00},//8
{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00}};//9
code uchar xian[]=
{0x06,0xC6,0xFE,0xFE,0xC6,0xC6,0x00,0xFE,0x06,0xF6,0xF6,0x06,0xFE,0xFE,0x00,0x00,
0x18,0x18,0x1F,0x0F,0x0C,0x6C,0x30,0x1B,0x0C,0x07,0x3F,0x7C,0x63,0x73,0x70,0x00};/*"现",0*/
code uchar zai[]=
{0x00,0x0C,0x8C,0xCC,0xEC,0x3C,0x9F,0x8F,0x8C,0xEC,0xEC,0x8C,0x8C,0x8C,0x0C,0x00,
0x02,0x03,0x01,0x7F,0x7F,0x30,0x31,0x31,0x31,0x3F,0x3F,0x31,0x31,0x31,0x30,0x00};/*"在",1*/
code uchar shi1[]=
{0xFE,0xFE,0xC6,0xC6,0xFE,0xFE,0x00,0x98,0x98,0x18,0x18,0xFF,0xFF,0x18,0x18,0x00,
0x1F,0x1F,0x0C,0x0C,0x1F,0x1F,0x00,0x00,0x03,0x03,0x60,0x7F,0x3F,0x00,0x00,0x00};/*"时",2*/
code uchar jian[]=
{0x00,0xF8,0xFB,0x07,0xF6,0xF0,0x36,0x36,0x36,0xF6,0xF6,0x06,0xFE,0xFE,0x00,0x00,
0x00,0x7F,0x7F,0x00,0x0F,0x0F,0x0D,0x0D,0x0D,0x0F,0x2F,0x60,0x7F,0x3F,0x00,0x00};/*"间",3*/
code uchar maohao[]=
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x33,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/*":",4*/
code uchar xin[]=
{0x00,0x00,0x00,0x20,0xF0,0xD0,0xD0,0xD0,0xD0,0xD0,0xD0,0xF0,0x00,0x00,0x00,0x00,
0x00,0x10,0x14,0x1A,0x17,0x16,0x16,0x1F,0x1F,0x16,0x16,0x16,0x10,0x30,0x30,0x10};/*"星",0*/
code uchar qi[]=
{0x00,0x00,0x20,0x20,0xF0,0xA0,0xA0,0xF0,0x20,0x00,0xE0,0xA0,0xA0,0xE0,0x00,0x00,
0x04,0x04,0x24,0x14,0x0B,0x03,0x05,0x1B,0x12,0x1C,0x07,0x02,0x02,0x3F,0x00,0x00};/*"期",1*/
code uchar shi2[]=
{0x00,0xF8,0x08,0x08,0x08,0xF8,0x10,0x90,0x10,0x10,0x10,0x10,0xFC,0x10,0x10,0x00,
0x00,0x7F,0x82,0x82,0x82,0x7F,0x00,0x00,0x41,0x86,0x88,0x80,0xFF,0x00,0x00,0x00};/*"时",0*/
code uchar fen[]=
{0x00,0x80,0x80,0xC0,0xB0,0x8C,0x80,0x80,0x80,0x82,0x8C,0x90,0xA0,0x40,0x80,0x00,
0x00,0x80,0x80,0x40,0x20,0x18,0x07,0x00,0x80,0x80,0x80,0x80,0x7F,0x00,0x00,0x01};/*"分",1*/
code uchar miao[]=
{0x00,0x44,0x44,0xFC,0x44,0x44,0x40,0xF0,0x00,0x00,0xFE,0x00,0x00,0x70,0x80,0x00,
0x10,0x0C,0x03,0xFF,0x03,0x04,0x83,0x80,0x80,0x80,0x5F,0x20,0x10,0x0E,0x01,0x00};/*"秒",2*/
code uchar nian[]=
{0x40,0x20,0x10,0x0C,0xE3,0x22,0x22,0x22,0xFE,0x22,0x22,0x22,0x22,0x02,0x00,0x00,
0x04,0x04,0x04,0x04,0x07,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x00};/*"年",0*/
code uchar yue[]=
{0x00,0x00,0x00,0x00,0x00,0xFF,0x11,0x11,0x11,0x11,0x11,0xFF,0x00,0x00,0x00,0x00,
0x00,0x40,0x20,0x10,0x0C,0x03,0x01,0x01,0x01,0x21,0x41,0x3F,0x00,0x00,0x00,0x00};/*"月",1*/
code uchar ri[]=
{0x00,0x00,0x00,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0xFE,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x3F,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x00};/*"日",2*/
/********************************************************************************************************************/
void delay(void){
	uchar i;
	for(i=0;i<6;i++) ;
	}
void delay2(){
	uchar k;
	for(k=30000;k>0;k--);
	}
/************************************************************************************************************/
/************如果忙则等待****************/
void wait_E1( void )
{
	E1=0;E2=1;
 	LED_BUS=0xff;
	RW=1;                    	
	RS=0;               //d0~D7为状态输出       	
	E=1;
 	while(LED_BUS&0x80);
 	E=0;
}

void wait_E2( void )
{
	E1=1;E2=0;
 	LED_BUS=0xff;
	RW=1;                    	
	RS=0;                      	
	E=1;
 	while(LED_BUS&0x80);
 	E=0;
}

/************写指令代码数据 *********/
void write_code_E1( uchar cod )
{

	wait_E1();             	 
	LED_BUS=cod;                   	 
	RW=0;                     	
	RS=0;                     	  
	E1=0;E2=1;
	E=1;                       	
	E=0;
}

void write_code_E2( uchar cod )
{		
	wait_E2();             	 
	LED_BUS=cod;                   	 
	RW=0;                     	
	RS=0;                     	  
	E1=1;E2=0;
	E=1;                       	
	E=0;
}
/*************向DDRAM中写数据 *********/
void write_data_E1( uchar dat )
{
	wait_E1();
    LED_BUS=dat;
	RW=0;
	RS=1;                         	
	E1=0;E2=1;
	E=1;
	E=0;                         
}

void write_data_E2( uchar dat )
{
	wait_E2();
    LED_BUS=dat;
	RW=0;
	RS=1;                         	
	E1=1;E2=0;
	E=1;
	E=0;                         
}
/*******************清屏*******************/
void clear_lcd()
{
	uchar page,i;
	for(page=0xb8;page<0xc0;page++)    //x=0(10111000)  y=(10111111);
  	{
   		write_code_E1(page);      //设置页地址x=page
		write_code_E1(0x40);      //设置列地址y=0 
		for(i=0;i<64;i++)    
   		{
		write_data_E1(0x00);       //写0  每写一次y自动加1
   		}
  	}
  	for(page=0xb8;page<0xc0;page++)    //x=0(10111000)  y=(10111111);
  	{
   		write_code_E2(page);      //设置页地址x=page
		write_code_E2(0x40);      //设置列地址y=0 
		for(i=0;i<64;i++)    
   		{
		write_data_E2(0x00);       //写0  每写一次y自动加1
   		}
  	}
}


/****************初始化液晶****************/
void init_lcd()
{
	wait_E1();
	write_code_E1(0x3e);           // 关显示1
	wait_E2();
	write_code_E2(0x3e);           //   关显示2
	wait_E1();
	write_code_E1(0x3f);           // 开显示1
	wait_E2();
	write_code_E2(0x3f);           //   开显示2
	wait_E1();
 	write_code_E1(0xc0);		//(11 000000)  设置显示起始行z=0
	wait_E2();
 	write_code_E2(0xc0);		//(11 000000)  设置显示起始行z=0
	clear_lcd();
}

void write_char_N_16( uchar *p_char,uchar page,uchar column,uchar N )
{
	uchar i;
	if( column<= 0x38)  
	{
 	write_code_E1(page|0xb8);  	 //设置页地址
 	write_code_E1(column|0x40);  	 //设置列地址
 	for(i=0;i<N;i++)
    		write_data_E1(p_char[i]);
 	write_code_E1(page+1|0xb8);   	//设置页地址
 	write_code_E1(column|0x40);   	//设置列地址
 	for(i=N;i<(2*N);i++)
    		write_data_E1(p_char[i]);
    	}
    	else
    	{
    write_code_E2(page|0xb8);  	 //设置页地址
 	write_code_E2(column|0x40);  	 //设置列地址
 	for(i=0;i<N;i++)
    		{write_data_E2(p_char[i]);/*P0_0_flash();*/}
 	write_code_E2(page+1|0xb8);   	//设置页地址
 	write_code_E2(column|0x40);   	//设置列地址
 	for(i=N;i<(2*N);i++)
    		{write_data_E2(p_char[i]);/*P0_7_flash();*/}
	}
}
/**********************************************************************************************************************/


void start(void){	//IIC总线起始条件
	SDA=1;
	SCL=1;
	delay();
	SDA=0;
	delay();
	SCL=0;
	}

void stop(void){	//IIC总线停止条件
	SDA=0;
	SCL=1;
	delay();
	SDA=1;
	delay();
	SCL=0;
	}

bit send_byte(uchar da){		//传送字节数据
	data uchar i;
	for(i=0;i<8;i++){
		SDA=(bit)(da&0x80);
		da=da<<1;
		SCL=1;
		delay();
		SCL=0;
		}
	;;
	SDA=1;			//准备接收ACK位
	;
	;
	SCL=1;			//开始接收ACK位
	;
	;
	flag=0;
	if(SDA==0) flag=0;	//ACK(SDA线上是与关系决定电平)
	else flag=1;	//No ACK(SDA==1)
	SCL=0;			//与上面的SCL=1构成正常的时钟同期
	delay();//加了这一句之后,成功了
	return(flag);
	}

uchar recieve_byte(void){
	data uchar i;
	uchar da=0;
	SDA=1;
	for(i=0;i<8;i++){
		da*=2;
		;
		SCL=0;
		delay();
		SCL=1;;;
		if(SDA==1) da++;
		;;
		}
	SCL=0;
	if(flag1==0){
		SDA=0;
		;;
		SCL=1;
		delay();
		SCL=0;
		delay();
		}
	else {
		SDA=1;
		;;
		SCL=1;
		delay();
		SCL=0;
		delay();//加了这一句之后,成功了
		flag1=0;
		}
	return(da);
	}

void send(){
	data uchar i;
	for(i=0;i<255;i++)  delay();
		start();
		if(~send_byte(0xd0)){
		if(~send_byte(0x00)){
			for(i=0;i<8;i++){
				if(~send_byte(rom_sed[i]));
				else ;
				}
			stop();
			}
		else;
		}
		else;

}


void recieve(){
	data uchar i;
	start();
	if(~send_byte(0xd0)){
	if(~send_byte(0x00)){
	delay2();
	start();
	if(~send_byte(0xd1)){
		for(i=1;i<9;i++){
			if(i==8) flag1=1;
			else flag1=0;
			rom_rec[i]=recieve_byte();
			switch(i){
				case 1: rom_rec[i]=rom_rec[i]&0x7f; break;
				case 2: rom_rec[i]=rom_rec[i]&0x7f; break;
				case 3: rom_rec[i]=rom_rec[i]&0x3f; break;
				case 4: rom_rec[i]=rom_rec[i]&0x07; break;
				case 5: rom_rec[i]=rom_rec[i]&0x3f; break;
				case 6: rom_rec[i]=rom_rec[i]&0x1f; break;
				case 7: rom_rec[i]=rom_rec[i]&0xff; break;
				default : break;
				}
			delay();//加了这一句之后,成功了
			delay();//加了这一句之后,成功了
			}
		}
		stop();
	}
	}
}


void main(){
	init_lcd();
	send();
	while(1){
	clear_lcd();
	write_char_N_16(xian,0x00,00,16);//现
	write_char_N_16(zai,0x00,24,16);//在
	write_char_N_16(shi1,0x00,48,16);//	时
	write_char_N_16(jian,0x00,72,16);//间
	write_char_N_16(maohao,0x00,96,16);//:

	write_char_N_16(shi2,0x04,16,16);//时
	write_char_N_16(fen,0x04,48,16);//分
	write_char_N_16(miao,0x04,80,16);//秒

	write_char_N_16(xin,0x06,20,16);//星
	write_char_N_16(qi,0x06,48,16);//期

	write_char_N_16(nian,0x02,16,16);//年
	write_char_N_16(yue,0x02,48,16);//月
	write_char_N_16(ri,0x02,80,16);//日


    recieve();
	//秒
	write_char_N_16(zhifu[((rom_rec[1]&0x70)>>4)],0x04,64,8);
	write_char_N_16(zhifu[(rom_rec[1]&0x0f)],0x04,72,8);
	//分
	write_char_N_16(zhifu[((rom_rec[2]&0x70)>>4)],0x04,32,8);
	write_char_N_16(zhifu[(rom_rec[2]&0x0f)],0x04,40,8);
	//时
	write_char_N_16(zhifu[((rom_rec[3]&0x70)>>4)],0x04,00,8);
	write_char_N_16(zhifu[(rom_rec[3]&0x0f)],0x04,8,8);
	//日
	write_char_N_16(zhifu[((rom_rec[5]&0x30)>>4)],0x02,64,8);
	write_char_N_16(zhifu[(rom_rec[5]&0x0f)],0x02,72,8);
	//月
	write_char_N_16(zhifu[((rom_rec[6]&0x10)>>4)],0x02,32,8);
	write_char_N_16(zhifu[(rom_rec[6]&0x0f)],0x02,40,8);
	//年
	write_char_N_16(zhifu[((rom_rec[7]&0xf0)>>4)],0x02,00,8);
	write_char_N_16(zhifu[(rom_rec[7]&0x0f)],0x02,8,8);
	//星期
	write_char_N_16(zhifu[(rom_rec[4]&0x07)],0x06,76,8);
	delay2();
	}
	}

⌨️ 快捷键说明

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