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

📄 g19264.c

📁 这是一个用STC单片机作的,带液晶显示屏的万年历程序,并有串行接收部份,大家一定要珍惜用.
💻 C
📖 第 1 页 / 共 3 页
字号:
   		  Putedot(10);//显示空格
		  Delay100ms(3);
		  keydn=0;
		  }
	WDT_CONTR=WDT;//启动看门狗
	aminute4=a*10+b;  
		  col=172,row=2;
    Putedot(b);//显示分的低位
	enterflg=0;

	wr_time();			//写时间到8563
	Lcmcls();

}

void main(void)
{ 	
	Delay(30);
	col=0;	row=0;	Delay(40);		/*延时大约40Ms,等待外设准备好	*/
	Lcminit();		               /*液晶模块初始化,包括全屏幕清屏*/
	Lcmcls();
	read_count=0;
	EA=1;TR1=1;ES=1;
	init_serial();
    while(1)
		{   
		    startbell();
		    readkey();
			if((keydn==1)&(keybuf=='*')) adj_time();
			rd_time();	//从时间芯片中读时间到second,minute,hour,week等变量中			
			time_to_byt();
			dispdata();	/*第一行字符输出our friend over the world.  24字节	*/
			disptime();
			WDT_CONTR=WDT;//启动看门狗
			if(read_count==3)
				{   EA=0;TR1=0;ES=0;
				    dpcard();//显示卡号
				    read_count=0;
					EA=1;TR1=1;ES=1;
				}
			if(read_count==3)
			{   EA=0;TR1=0;ES=0;
			    dpcard();//显示卡号
			    read_count=0;
				EA=1;TR1=1;ES=1;
			}

	}


}


/****************************************/
/*	一个字串的输出			*/
/****************************************/
void Putstr(Uchar *puts,Uchar i)
	{
		Uchar j,X;
		for (j=0;j<i;j++)
		{
		X = puts[j];	                 //X=0X80 OR 0X20
			if (X&0x80)
				{
					Putcdot(X&0x7f);	/*只保留低7位.全角字符输出*/
				}
			else Putedot(X-0x30);		/*ascii码表从0x20开始,半角字符输出*/
		}
	}

/****************************************/
/*   半角字符点阵码数据输出		*/
/****************************************/
void Putedot(Uchar Order)
	{
	Uchar i,bakerx,bakery;	/*共定义4个局部变量			*/
	int x;					/*偏移量,字符量少的可以定义为UCHAR	*/
	bakerx = col;			/*暂存x,y坐标,已备下半个字符使用	*/
	bakery = row;
	x=Order * 0x10;			/*半角字符,每个字符16字节	*/
/*上半个字符输出,8列	*/
	for(i=0;i<8;i++)
		{
		cbyte = Ezk[x];				/*取点阵码,rom数组	*/
		Wrdata(cbyte);				/*写输出一字节		*/
		x++;
		col++;
		if (col==LCMLIMIT){col=0;row=row+2;};	/*下一列,如果列越界换行*/
			if (row>7) row=0;		/*如果行越界,返回首行	*/
		}							/*上半个字符输出结束	*/

	col = bakerx;					/*列对齐		*/
	row = bakery+1;					/*指向下半个字符行	*/
/*下半个字符输出,8列	*/
	for(i=0;i<8;i++)
		{
		cbyte = Ezk[x];				/*取点阵码		*/
		Wrdata(cbyte);				/*写输出一字节		*/
		x++;
		col++;
		if (col==LCMLIMIT){col=0;row=row+2;};	/*下一列,如果列越界换行*/
			if (row>7) row=1;		/*如果行越界,返回首行	*/
		}					/*下半个字符输出结束	*/
	row=bakery;
	}						/*整个字符输出结束	*/

void Putedotbig(Uchar Order)
	{
	Uchar i,bakerx,bakery;	/*共定义4个局部变量			*/
	int x;					/*偏移量,字符量少的可以定义为UCHAR	*/
	bakerx = col;			/*暂存x,y坐标,已备下半个字符使用	*/
	bakery = row;
	x=Order * 144;			/*半角字符,每个字符16字节	*/
/*上半个字符输出,8列	*/
	for(i=0;i<24;i++)
		{
		cbyte = bigzf[x];				/*取点阵码,rom数组	*/
		Wrdata(cbyte);				/*写输出一字节		*/
		x++;
		col++;
		if (col==LCMLIMIT){col=0;row=row+2;};	/*下一列,如果列越界换行*/
			if (row>7) row=0;		/*如果行越界,返回首行	*/
		}							/*上半个字符输出结束	*/

	col = bakerx;					/*列对齐		*/
	row ++;//= bakery+2;					/*指向下半个字符行	*/
/*下半个字符输出,8列	*/
	for(i=0;i<24;i++)
		{
		cbyte = bigzf[x];				/*取点阵码		*/
		Wrdata(cbyte);				/*写输出一字节		*/
		x++;
		col++;
		if (col==LCMLIMIT){col=0;row=row+2;};	/*下一列,如果列越界换行*/
			if (row>7) row=1;		/*如果行越界,返回首行	*/
		}					/*下半个字符输出结束	*/

	col = bakerx;					/*列对齐		*/
	row++;// = bakery+4;					/*指向下半个字符行	*/
/*下半个字符输出,8列	*/
	for(i=0;i<24;i++)
		{
		cbyte = bigzf[x];				/*取点阵码		*/
		Wrdata(cbyte);				/*写输出一字节		*/
		x++;
		col++;
		if (col==LCMLIMIT){col=0;row=row+2;};	/*下一列,如果列越界换行*/
			if (row>7) row=1;		/*如果行越界,返回首行	*/
		}					/*下半个字符输出结束	*/

	col = bakerx;					/*列对齐		*/
	row++;// = bakery+6;					/*指向下半个字符行	*/
/*下半个字符输出,8列	*/
	for(i=0;i<24;i++)
		{
		cbyte = bigzf[x];				/*取点阵码		*/
		Wrdata(cbyte);				/*写输出一字节		*/
		x++;
		col++;
		if (col==LCMLIMIT){col=0;row=row+2;};	/*下一列,如果列越界换行*/
			if (row>7) row=1;		/*如果行越界,返回首行	*/
		}					/*下半个字符输出结束	*/
	col = bakerx;					/*列对齐		*/
	row++;// = bakery+8;					/*指向下半个字符行	*/
/*下半个字符输出,8列	*/
	for(i=0;i<24;i++)
		{
		cbyte = bigzf[x];				/*取点阵码		*/
		Wrdata(cbyte);				/*写输出一字节		*/
		x++;
		col++;
		if (col==LCMLIMIT){col=0;row=row+2;};	/*下一列,如果列越界换行*/
			if (row>7) row=1;		/*如果行越界,返回首行	*/
		}					/*下半个字符输出结束	*/
	col = bakerx;					/*列对齐		*/
	row++;//= bakery+10;					/*指向下半个字符行	*/
/*下半个字符输出,8列	*/
	for(i=0;i<24;i++)
		{
		cbyte = bigzf[x];				/*取点阵码		*/
		Wrdata(cbyte);				/*写输出一字节		*/
		x++;
		col++;
		if (col==LCMLIMIT){col=0;row=row+2;};	/*下一列,如果列越界换行*/
			if (row>7) row=1;		/*如果行越界,返回首行	*/
		}					/*下半个字符输出结束	*/
/*下半个字符输出,8列	*/

	row=bakery;
	}						/*整个字符输出结束	*/


/****************************************/
/*  全角字符点阵码数据输出		*/
/****************************************/
void Putcdot(Uchar Order)
	{
	Uchar i,bakerx,bakery;		/*共定义3个局部变量		*/
	int x;						/*偏移量,字符量少的可以定义为UCHAR	*/
	bakerx = col;				/*暂存x,y坐标,已备下半个字符使用	*/
	bakery = row;
	x=Order * 32;				/*每个字符32字节	*/
	
/*上半个字符输出,16列	*/
	for(i=0;i<16;i++)
		{
		Wrdata(HZ[x]);				/*写输出一字节		*/
		x++;
		col++;
		if (col==LCMLIMIT){ col=0;row=row+2;}	/*下一列,如果列越界换行*/
			if (row>7) row=0;		/*如果行越界,返回首行	*/
		}					/*上半个字符输出结束	*/
		
/*下半个字符输出,16列	*/
	col = bakerx;
	row = bakery+1;
	for(i=0;i<16;i++)				/*下半部分*/
		{
		Wrdata(HZ[x]);
		x++;
		col++;
		if (col==LCMLIMIT){col=0;row=row+2;}	/*下一列,如果列越界换行*/
			if (row>7) row=1;		/*如果行越界,返回首行	*/
		}					/*下半个字符输出结束	*/
	row = bakery;
	}						/*整个字符输出结束	*/

/****************************************/
/*	清屏,全屏幕清零		*/
/****************************************/
void Lcmcls( void )
	{
	for(row=0;row<8;row++)
   		for(col=0;col<LCMLIMIT;col++) Wrdata(0);
	}

/****************************************/
/*  从液晶片上读数据,保留在全局变量中	*/
/****************************************/

void Rddata(void)
	{
		Locatexy();		/*坐标定位,返回时保留分区状态不变	*/
		Datalcm=0xFF;
		Dilcm = 1;	/*数据*/
		Rwlcm = 1;	/*读数据*/
		Elcm = 1;	/*读入到LCM*/
		_nop_();
		cbyte = Datalcm;	/*虚读一次 */
		Elcm = 0;
		Locatexy();		/*坐标定位,返回时保留分区状态不变	*/
		Datalcm=0xFF;
		_nop_();
	Dilcm = 1;	/*数据*/
		Rwlcm = 1;	/*读数据*/
		Elcm = 1;	/*读入到LCM*/
		_nop_();
		cbyte = Datalcm;	/*从数据口读数据,真读 */
		Elcm = 0;
}

/****************************************/
/*	数据写输出			*/
/****************************************/

void Wrdata(Uchar X)
	{
	Locatexy();		/*坐标定位,返回时保留分区状态不变	*/
	wtcom();
		Dilcm = 1;	/*数据输出*/
		Rwlcm = 0;	/*写输出  */
		Datalcm = X;	/*数据输出到数据口 */
		Elcm = 1;	/*读入到LCM*/
		_nop_();
		Elcm = 0;
	}

/********************************/
/* 命令输出到左区控制口		*/
/********************************/

void WrcmdL(Uchar X)
	{
		lcdbusyL();		/*确定分区,返回时保留分区状态不变*/
		Dilcm = 0;			/*命令操作	*/
		Rwlcm = 0;			/*写输出  	*/
		Datalcm = X;			/*数据输出到数据口 */
		Elcm = 1;_nop_();Elcm = 0;	/*读入到LCM*/
	}

/********************************/
/* 命令输出到中区控制口		*/
/********************************/

void WrcmdM(Uchar X)
	{
		lcdbusyM();		/*确定分区,返回时保留分区状态不变*/
		Dilcm = 0;			/*命令操作	*/
		Rwlcm = 0;			/*写输出  	*/
		Datalcm = X;			/*命令输出到数据口 */
		Elcm = 1;_nop_();Elcm = 0;	/*读入到LCM*/
	}

/********************************/
/* 命令输出到右区控制口		*/
/********************************/

void WrcmdR(Uchar X)
	{
		lcdbusyR();	/*确定分区,返回时保留分区状态不变	*/
		Dilcm = 0;			/*命令操作	*/
		Rwlcm = 0;			/*写输出  	*/
		Datalcm = X;			/*命令输出到数据口 */
		Elcm = 1;_nop_();Elcm = 0;	/*读入到LCM*/
	}

/********************************************************/
/* 分区操作允许等待,返回时保留分区选择状态		*/
/********************************************************/
void lcdbusyL(void)
	{
        CS1LCM = 0;		/*CLR	CS1		*/
        CS2LCM = 0;		/*SETB	CS2		*/
       // CS3LCM = 1;		/*SETB	CS3		*/
	wtcom();		/* waitting for enable	*/
	}

void lcdbusyM(void)
	{
        CS1LCM = 0;		/*SETB	CS1		*/
        CS2LCM = 1;		/*CLR	CS2		*/
        //CS3LCM = 1;		/*SETB	CS3		*/
	wtcom();		/* waitting for enable	*/
	}

void lcdbusyR(void)
	{
        CS1LCM = 1;		/*SETB	CS1		*/
        CS2LCM = 0;		/*SETB	CS2		*/
       // CS3LCM = 0;		/*CLR	CS3		*/
	wtcom();		   /* waitting for enable	*/
	}

void wtcom(void)
	{
	Dilcm = 0;		    /*CLR	DI		*/
	Rwlcm = 1;		    /*SETB	RW		*/
    Datalcm = 0xFF;		/*MOV	DATA_LCM,#0FFH  */
	Elcm  = 1;_nop_();		
      	while(Datalcm & Lcdbusy);//if BF=1;LCM is busy.
      	Elcm  = 0;
	}

/********************************************************/
/*根据设定的坐标数据,定位LCM上的下一个操作单元位置	*/
/********************************************************/
void Locatexy(void)
	{
	unsigned char  x,y;
	switch (col&0xc0)		/*  col.and.0xC0,c0=1100,0000=192	*/
		{			/*条件分支执行		*/
		case 0:		{lcdbusyL();break;}	/*左区	*/
		case 0x40:	{lcdbusyM();break;}	/*中区 0X40=0100,0000=64	*/
		case 0x80:	{lcdbusyR();break;}	/*右区	0X80=1000,0000=128*/
		}
	x = col&0x3F|SETX;		/*  col.and.0x3f.or.setx,3F=63	*/
	y = row&0x07|SETY;		/*  row.and.0x07.or.sety	*/
		wtcom();		/*  waitting for enable		*/
		Dilcm = 0;			/*CLR	DI	DI=0写指令*/
		Rwlcm = 0;			/*CLR	RW	R/W=0为写*/
		Datalcm = y;			/*MOV	P0,Y	*/
		Elcm = 1;_nop_();Elcm = 0;
		wtcom();		/*  waitting for enable		*/
		Dilcm = 0;			/*CLR	DI	*/
		Rwlcm = 0;			/*CLR	RW	*/
		Datalcm = x;			/*MOV	P0,X	*/
		Elcm = 1;_nop_();Elcm = 0;
	}

/********************************/
/*液晶屏初始化			*/
/********************************/

void Lcminit(void)
	{//	Lcmcls();
		cbyte = DISPOFF;	/*关闭显示屏	*/
		WrcmdL(cbyte);
		WrcmdM(cbyte);
		WrcmdR(cbyte);
		cbyte = DISPON;		/*打开显示屏	*/
		WrcmdL(cbyte);
		WrcmdM(cbyte);
		WrcmdR(cbyte);
		cbyte = DISPFIRST;	/*定义显示起始行为零	*/
		WrcmdL(cbyte);
		WrcmdM(cbyte);
		WrcmdR(cbyte);
		col=0;		/*清屏		*/
		row=0;
		Locatexy();
	}
/********************************/
/* 延时				*/
/********************************/
void Delay(Uchar MS)
	{
		Uchar us,usn;
		while(MS!=0)
			{ usn = 10;
				while(usn!=0)
					{
						us=0xff;
						while (us!=0){us--;};
						usn--;
					}
				MS--;
			}
	}

//////////串口初始化函数,T0初始化////
void init_serial()
{
	TMOD=0x20;			//定时器T1工作方式2
	TL1=0XFD;			//初值
	TH1=0XFD;
	TR1=1;				//启动T1,开始计时
	PCON=0X00;			//SMOD=0,波特率不加倍
	SCON=0X50;			//工作方式1,10位UART, 波特率9600KBPS,允许接收
	EA=1;ES=1;
}

⌨️ 快捷键说明

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