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

📄 rt1602c+pcf8563一号.c

📁 RT1602C+PCF8563一号.rar
💻 C
字号:
//单片机RT1602_C语言程序__RT1602C+PCF8563P
//2006年3月8951_LCD_1602_Q_D_MCU适用
//AT89C54_Ver1.00
//KS0070(44780) 16x2 字符液晶屏驱动演示程序总线方式
//DB0=P1.0 DB1=P1.1 DB2=P1.2 DB3=P1.3 DB4=P1.4 DB5=P1.5
//DB6=P1.6 DB7=P1.7 R/W=P2.0 RS=P2.1  E=P2.7 
//[注]:AT89C51的晶振频率为12MHz

#include <REGX51.H>
#include <stdio.h> 
#include <absacc.h>
#include <intrins.h> 
#include <SS89BIN.h> 
   
sbit E_E=P3^3; 									//片选,下降沿触发
sbit R_S=P3^4;									//H数据寄存器,L指令寄存器 
sbit R_W=P3^5;									//H读数据,L写数据  
sbit sda=P0^0; 									//定义串行I/O口
sbit scl=P0^1;  
  
idata unsigned char rom_sed[9];
idata unsigned char rom_rec[7];
idata unsigned char j,k;
bit flag,flag1;

void time8563(void) 								//延时子程序
	{data unsigned char i;
	for(i=0;i<6;i++);
	}
void I_start(void) 									//发送I2C总线起始条件子程序
	{sda=1;;
	scl=1;
	time8563();
	sda=0;
    time8563();
    scl=0;;
    }
void I_stop(void) 									//I2C总线停止条件子程序
	{sda=0;;
    scl=1;
	time8563();
	sda=1;
	time8563();
	}
bit I_send(unsigned char I_data) 					//字节数据传送子程序
	{data unsigned char i;
	for(i=0;i<8;i++)
		{sda=(bit)(I_data&0x80);
		I_data=I_data<<1;;
		scl=1;
		time8563();
		scl=0;
		}
	;;
	sda=1;;; 										//准备接收ACK位
	scl=1;;; 										//开始接收ACK位
	flag=0;
	if(sda==0)	flag=0;
		else 	flag=1; 							//返回(~I_clock());
	scl=0;
	return(flag);
	}
unsigned char I_receive(void) 						//字节数据接收子程序
	{data unsigned char i;
	unsigned char I_data=0;
	sda=1;
	for(i=0;i<8;i++)
		{I_data*=2;;
		scl=0;
		time8563();
		scl=1;;;
		if(sda==1)I_data++;
		;;
		}
	scl=0;;;;
	sda=0;
	if(flag1==0){;;scl=1;time8563();scl=0;} 		//not last receic _unsigned char ACK
 		else	{sda=1;;;scl=1;time8563();			//the last receive_unsigned char ACK 
				scl=0;flag1=0;
				} 
	return(I_data);
	}

void TIME(int nt)								//延时函数
	{long int it=0;
	for(it=0;it<nt*1000;it++);
	return;
	}
void DELAY(void)								//判断液晶显示器是否忙的子程序
	{P1=0xFF;
	R_S=0;R_W=1;E_E=0;
	_nop_();
	E_E=1;
	while(P1_7);								//如果P1.7为高电平表示忙就循环等待
	return;
	}
void WR1602C(char mun,char rs)					//写入控制命令的子程序
	{P1=mun;									//将代码送到P1口
	R_S=rs;										//1数据寄存器,0指令寄存器 
	R_W=0;E_E=0;								//执行显示命令
	DELAY();									//判断液晶模块是否忙
	E_E=1;										//显示完成,程序停车
	return;
	}

void main(void)
{	data unsigned char i;
	rom_sed[0]=0x00;							//时____秒寄存器1初始值=0x00__00秒
	rom_sed[1]=0x36;							//时__分钟寄存器1初始值=0x55__36分
	rom_sed[2]=0x14;							//时__小时寄存器1初始值=0x23__14点
	rom_sed[3]=0x30;							//日____日寄存器1初始值=0x31__30日
	rom_sed[4]=0x04;							//日__星期寄存器1初始值=0x06__星期4
	rom_sed[5]=0x83;							//日____月寄存器1初始值=0x92__03月
	rom_sed[6]=0x06;							//日____年寄存器1初始值=0x99__06年
	rom_sed[7]=0x00;							//控制状态寄存器2初始值=0x00
	rom_sed[8]=0x00;							//控制状态寄存器1初始值=0x00

	for(i=0;i<255;i++)time8563();				//长时间延时
/*	I_start();									//时间调整开始
	if(~I_send(0xA2)) 							//写地址寄存器为0xA2
		{if(~I_send(0x02)) 						//从地址寄存器0x02开始读数据
			{for(i=0;i<9;i++)
				{if(~I_send(rom_sed[i]));
					else;
				}I_stop();
			}else;
		}else;	
*/
	P3_1=0;P3_2=1;TIME(3);						//指示灯闪烁
	P3_1=1;P3_2=0;TIME(3);	
	P3_1=0;P3_2=1;TIME(3);

	WR1602C(B0000_0001,0);						//清屏并光标复位									
	WR1602C(B0011_1000,0);						//设置显示模式:8位2行5x7点阵
	WR1602C(B0000_1111,0);						//显示器开,光标开,光标允许闪烁
	WR1602C(B0000_0110,0);						//文字不动,光标自动右移
	WR1602C(B1110_1000,0);						//写入显示起始地址(第一行第一个位置)
	WR1602C(B0100_0001,1);						//字母A的代码
	WR1602C(B0100_0010,1);
	WR1602C(B0100_0011,1);
	TIME(5);

START:I_start();								//时间读取开始
	if(~I_send(0xA2)) 							//写地址寄存器为0xA2
		{if(~I_send(0x02)) 						//从地址寄存器0x02开始读数据
			{I_start();
			if(~I_send(0xA3)) 					//读地址寄存器为0xA3
				{for(i=0;i<7;i++)
					{if(i==6)flag1=1;
						else flag1=0;
					rom_rec[i]=I_receive();
					switch(i)
						{case 1:rom_rec[i]=rom_rec[i]&0x7f;break;
						case 2:
						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]&0x9f;break;
						default:break;
						}
					}
				I_stop();
				}
			}
		}
	WR1602C(B1100_0000,0);							//写入显示起始地址(第二行第一个位置)
	WR1602C(0x4E,1);WR1602C(0x6F,1);				//第二排从头开始显示NowTime
	WR1602C(0x77,1);WR1602C(0x54,1);
	WR1602C(0x69,1);WR1602C(0x6D,1);				
	WR1602C(0x65,1);WR1602C(0x20,1);

	WR1602C(rom_rec[2]/16+48,1);					//时钟_时_十位
	WR1602C(rom_rec[2]%16+48,1);					//时钟_时_个位
	WR1602C(0x3A,1);								//显示:
	WR1602C(rom_rec[1]/16+48,1);					//时钟_分_十位
	WR1602C(rom_rec[1]%16+48,1);					//时钟_分_个位
	WR1602C(0x3A,1);								//显示:
	WR1602C(rom_rec[0]/16+40,1);					//时钟_秒_十位
	WR1602C(rom_rec[0]%16+48,1);					//时钟_秒_个位

	WR1602C(B1110_1000,0);							//写入显示起始地址(第一行第一个位置)
	if(rom_rec[5]>0x12)								//判断是99世纪还20世纪
		{rom_rec[5]=rom_rec[5]-0x80;
		WR1602C(0x32,1);WR1602C(0x30,1);			//第一排从头开始显示20世纪
		}
		else {WR1602C(0x31,1);WR1602C(0x39,1);		//第一排从头开始显示19世纪
			 }
	WR1602C(rom_rec[6]/16+48,1);					//时钟_年_十位
	WR1602C(rom_rec[6]%16+48,1);					//时钟_年_个位
	WR1602C(0x2F,1);								//显示/
	
	WR1602C(rom_rec[5]/16+48,1);					//时钟_月_十位
	WR1602C(rom_rec[5]%16+48,1);					//时钟_月_个位
	WR1602C(0x2F,1);								//显示/
	WR1602C(rom_rec[3]/16+48,1);					//时钟_日_十位
	WR1602C(rom_rec[3]%16+48,1);					//时钟_日_个位
	
	WR1602C(0x20,1);
	WR1602C(0x57,1);WR1602C(0x65,1);				//显示Week
	WR1602C(0x65,1);WR1602C(0x6B,1);
	WR1602C(rom_rec[4]+48,1);						//时钟_星期几
	TIME(5);

	
	goto START;	


}


⌨️ 快捷键说明

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