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

📄 clock 2.0.c

📁 pic16f上12864液晶显示
💻 C
字号:
#include"pic18.h"
 const char shu[160]={/*--  文字:  0  --*/

0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,

/*--  文字:  1  --*/
///*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,

/*--  文字:  2  --*/

0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,

/*--  文字:  3  --*/
///*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,

/*--  文字:  4  --*/
///*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,

/*--  文字:  5  --*/
///*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,

/*--  文字:  6  --*/
///*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,

/*--  文字:  7  --*/
///*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,

/*--  文字:  8  --*/
///*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,

/*--  文字:  9  --*/
///*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,

};
char mao[]={0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,

};
char shi[]=
///*--  文字:  时  --*/
///*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
{0x00,0xFC,0x44,0x44,0x44,0xFC,0x10,0x90,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x00,
0x00,0x07,0x04,0x04,0x04,0x07,0x00,0x00,0x03,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,};
char jian[]={
0x00,0xF8,0x01,0x06,0x00,0xF0,0x92,0x92,0x92,0x92,0xF2,0x02,0x02,0xFE,0x00,0x00,
0x00,0xFF,0x00,0x00,0x00,0x07,0x04,0x04,0x04,0x04,0x07,0x40,0x80,0x7F,0x00,0x00,};
char *ARRAY[10];
char s[6];
char  PPP[34];
char I;
char flagkey;
void	YJ_initial()
{
	INTCON=0X00;		
	WDTCON=0;
	ADCON1=0X87;				//设置所有与模拟输入共用的引脚为I/O方式
	TRISE=TRISE&0XF8;			//设置RE0,RE1,RE2为输出
	TRISB=TRISB&0XFC;			//设置RB0,1为输出
   TRISA=TRISA&0XF7;			//设置RA3为输出
	TRISB=TRISB|0X10;
	RB1=0;
}


//读液晶显示器状态子程序,行参E代表液晶的边
void	LCDSTA1(int	E)
//int	E;
{
	int	E1FLAG;
	TRISD=0XFF;					//设置D口为输入
	while(1)
	{
		if(E==1)
			{PORTA=PORTA|0X08;	//设置RE2/CSA=0,RA3/CSB=1,RE0/RW=1,RE1/DI=0
			PORTE=(PORTE|0X01)&0XF9;}
		else	
			{PORTA=PORTA&0XF7;	//设置RE2/CSA=1,RA3/CSB=0,RE0/RW=1,RE1/DI=0	
			PORTE=(PORTE|0X05)&0XFD;}
		PORTB=PORTB|0X01;		//RB0/E=1
		E1FLAG=PORTD&0X80;
		PORTB=PORTB&0XFE;		//RB0/E=0
		if(E1FLAG==0X0000)break;
	}
}

//对液晶显示器发指令子程序,行参E代表处理的液晶的边
void	TRANS1(int	TRANS,int E)
//int	TRANS,E;
{
	LCDSTA1(E);
	TRISD=0X00;			//RD为输出
	if(E==1)				//设置RE2/CSA=0,RA3/CSB=1,RE0/RW=0,RE1/DI=0	
		{PORTA=PORTA|0X08;
		PORTE=PORTE&0XF8;}
	else					//设置RE2/CSA=1,RA3/CSB=0,RE0/RW=0,RE1/DI=0
		{PORTA=PORTA&0xF7;
		PORTE=(PORTE|0X04)&0XFC;}
	PORTD=TRANS;
	PORTB=PORTB|0X01;	//RB0/E=1
	PORTB=PORTB&0XFE;	//RB0/E=0		
}

//对液晶显示器写数据子程序
void	WRITE1(char	WRITE,int CLMADD,int	E)
//int	WRITE,CLMADD,E;
{
	TRANS1(CLMADD,E);		///设置列地址
	LCDSTA1(E);				//查询液晶是否为空闲
	TRISD=0X00;	//RD为输出
	if(E==1)					//设置RE2/CSA=0,RA3/CSB=1,RE0/RW=0,RE1/DI=1	
		{PORTA=PORTA|0X08;
		PORTE=(PORTE|0X02)&0xFA;}
	else						//设置RE2/CSA=1,RA3/CSB=0,RE0/RW=0,RE1/DI=1
		{PORTA=PORTA&0xF7;
		PORTE=(PORTE|0X06)&0xFE;}
	PORTD=WRITE;
	PORTB=PORTB|0X01;		//RB0/E=1
	PORTB=PORTB&0XFE;		//RB0/E=0
}

//开E边显示子程序
void	DISP1(int	E)
//int	E;
{
	int	E1FLAG;
	while(1)
	{
		TRANS1(0X03F,E);		///送出控制命令
      //	LCDSTA1(E);				//判断液晶是否为空闲状态
		TRISD=0XFF;				//设置ED为输入
		if(E==1)					//设置RE2/CSA=0,RA3/CSB=1,RE0/RW=1,RE1/DI=0
			{PORTA=PORTA|0X08;
			PORTE=(PORTE|0X01)&0xF9;}
		else						//设置RE2/CSA=1,RA3/CSB=0,RE0/RW=1,RE1/DI=0
			{PORTA=PORTA&0xF7;
			PORTE=(PORTE|0X05)&0xFD;}
	PORTB=PORTB|0X01;			//RB0/E=1
	E1FLAG=PORTD&0X20;
	PORTB=PORTB&0XFE;			//RB0/E=0
	if(E1FLAG==0X00)break;			//如果液晶被打开,则退出循环,否则继续打开
	}
}

//E边清屏子程序
void	CLEAR1(int	E)
//int	E;
{
	int PAGEADD,PAGENUM,CLMSUM;
	for(PAGENUM=0X08,PAGEADD=0X0B8;PAGENUM>0;PAGENUM--,PAGEADD++)
     	{
         	TRANS1(PAGEADD,E); 		//设置相应的页地址
        	 for(CLMSUM=0x40;CLMSUM<=0X7F;CLMSUM++)
         		{
           			LCDSTA1(E);		//判断液晶空闲状态
           			WRITE1(0X00,CLMSUM,E);	//送0清屏
          		}
        }
}


//关E边显示子程序
void	DISOFF1(int	E)
//int	E;
{
	int E1FLAG;
	while(1)
	{
		TRANS1(0X3E,E);		//发送控制命令
		LCDSTA1(E);			//判断液晶是否为空闲状态
		TRISD=0XFF;			//设置RD为输入
		if(E==1)				//设置RE2/CSA=0,RA3/CSB=1,RE0/RW=1,RE1/DI=0
			{PORTA=PORTA|0X08;
			PORTE=(PORTE|0X01)&0xF9;}
		else					//设置RE2/CSA=1,RA3/CSB=0,RE0/RW=1,RE1/DI=0
			{PORTA=PORTA&0xF7;
			PORTE=(PORTE|0X05)&0xFD;}
	PORTB=PORTB|0X01;		//RB0/E=1
	E1FLAG=PORTD&0X20;
	PORTB=PORTB&0XFE;		//RB0/E=0
	if(E1FLAG==0X20)break;		//如液晶关闭,则推出循环,否则继续关闭
	}
}

//LCD的E边初始化子程序
void	LCD1INIT(int	E)
{
	DISOFF1(E);			//关E区显示
	/*TRANS1(0X0A4,E);  
   	TRANS1(0X0A9,E);    
  	TRANS1(0X0E2,E);   
 	TRANS1(0X0A0,E);*/ 
   	CLEAR1(E);			//清屏
    LCDSTA1(E);			//判断液晶空闲状态
    DISP1(E);				//开显示
} 

//显示""
DISPLAY1(int	E,int	PAGADD,int	CLMADD,int n)////////////////////////////////////////////////////
{int K;
 char TEMP;
 TRANS1(0xc0,E) ;
 TRANS1(PAGADD,E);
 for(K=0;K<16;K++,CLMADD++,ARRAY[n]++)
	{TEMP=*ARRAY[n];
	 WRITE1(TEMP,CLMADD,E);

	}
	CLMADD=CLMADD-16;
	PAGADD=PAGADD+1;
	TRANS1(PAGADD,E);
	for(;K<32;K++,CLMADD++,ARRAY[n]++)
	{TEMP=*ARRAY[n];
	 WRITE1(TEMP,CLMADD,E);
	}
}
DISPLAY2(int	E,int	PAGADD,int	CLMADD,int n)
{int K;
 char TEMP;
 TRANS1(0xc0,E) ;
 TRANS1(PAGADD,E);
 for(K=0;K<8;K++,CLMADD++,ARRAY[n]++)
	{TEMP=*ARRAY[n];
	 WRITE1(TEMP,CLMADD,E);

	}
	CLMADD=CLMADD-8;
	PAGADD=PAGADD+1;
	TRANS1(PAGADD,E);
	for(;K<16;K++,CLMADD++,ARRAY[n]++)
	{TEMP=*ARRAY[n];
	 WRITE1(TEMP,CLMADD,E);
	}
}



	void MAOXIAN()
{	
	int J;
	for(J=0;J<16;J++)
	PPP[J]=mao[J];
	ARRAY[6]=&PPP[0];
	DISPLAY2(2,0XBc,0X50,6);//4页16列
	for(J=0;J<16;J++)
	PPP[J]=mao[J];
	ARRAY[6]=&PPP[0];
	DISPLAY2(1,0XBc,0X67,6);//4页39列
	for(J=0;J<16;J++)
	PPP[J]=mao[J];
	ARRAY[6]=&PPP[0];
	DISPLAY2(1,0Xb9,0X60,6);//33列
}
void xianzi()
{ int i,j;
  for(i=0,j=0;i<32;i++,j++)
	PPP[j]=shi[i];
	ARRAY[7]=&PPP[0];
	DISPLAY1(1,0xb9,0x40,7); //2页1列
  for(i=0,j=0;i<32;i++,j++)
	PPP[j]=jian[i];
	ARRAY[8]=&PPP[0];
	DISPLAY1(1,0xb9,0x50,8);//17列
}



void port_B()
{	
	TRISB=TRISB|0XF0;
	INTCON=INTCON|0X08;
	INTCON2=INTCON2&0X7F;
	RBIP=0;
	RB1=0;
	PORTB=PORTB;
}
void xsh0()
{	
	int i,j,k,y,u;	//				秒个
		
			y=s[0];	
			k=y*16;
			for(i=k,j=0;i<k+16;i++,j++)
				PPP[j]=shu[i];
				ARRAY[0]=&PPP[0];
				DISPLAY2(2,0xbc,0X68,0);//40列
				//CLEAR1(2);  //加上有闪动效果
	
			
			//	for(u=0;u<52500;u++)	//delay
			//	{}
				
}
void xsh1()
{	
		int i,j,k,y;
		y=s[1];
		k=y*16;
		for(i=k,j=0;i<k+16;i++,j++)
			PPP[j]=shu[i];
			ARRAY[1]=&PPP[0];
			DISPLAY2(2,0xbc,0X58,1);	//24列
}

void xsh2()
{
	int i,j,k,y;
	int x,a;
	y=s[2];
			k=y*16;
			for(i=k,j=0;i<k+16;i++,j++)//
			PPP[j]=shu[i];
			ARRAY[2]=&PPP[0];
		DISPLAY2(2,0xbc,0X40,2);// 2块4页0列	
}
void xsh3()
{	
		int i,j,k,y;
		y=s[3];
		k=y*16;
		for(i=k,j=0;i<k+16;i++,j++)
			PPP[j]=shu[i];
			ARRAY[3]=&PPP[0];
			DISPLAY2(1,0xbc,0X6f,3);	//1块4页47列
}
void xsh4()
{	
		int i,j,k,y;
		y=s[4];
		k=y*16;
		for(i=k,j=0;i<k+16;i++,j++)
			PPP[j]=shu[i];
			ARRAY[4]=&PPP[0];
			DISPLAY2(1,0xbc,0X57,4);//23 lie
}
void xsh5()
{	
		int i,j,k,y;
		y=s[5];
		k=y*16;
		for(i=k,j=0;i<k+16;i++,j++)
			PPP[j]=shu[i];
			ARRAY[5]=&PPP[0];
			DISPLAY2(1,0xbc,0X47,5);	//7 lie
}
void daxian()
{
	s[0]=s[0]+1;
	if(s[0]==10)
	{
		s[1]=s[1]+1;
		s[0]=0;		
	}
	xsh0();
	if(s[1]>=6)
	{
		s[2]=s[2]+1;
		s[1]=0;		
	}
	xsh1();
		if(s[2]>=10)
	{
		s[3]=s[3]+1;
		s[2]=0;		
	}
	xsh2();
		if(s[3]>=6)
	{
		s[4]=s[4]+1;
		s[3]=0;		
	}
	xsh3();
	if (s[5]<=1)
{		if(s[4]>=10)
	{
		s[5]=s[5]+1;
		s[4]=0;		
	}
}
	else
	if(s[4]>=4)
	{	s[5]=s[5]+1;
		s[4]=0;	
	}

	xsh4();
		if(s[5]>=3)
	{
		s[0]=s[0]+1;
		s[5]=0;		
	}
	xsh5();
/////////////////////......................
}
void keyscan()
{
}
void interrupt low_priority LOW_ISR()
{	
	if(RBIF==1)
	{  int i;
		flagkey=1;
		
		for(i=0;i<600;i++)
		{}
		if(RB4==0) return;//********rb4==0
		else	
		
			RBIF=0;
   }
}

main()
{long u;	
	YJ_initial();
	LCD1INIT(1);
	LCD1INIT(2);
	port_B();
	IPEN=1;
	INTCON=INTCON|0XC0;
	while(1){
	xianzi();

	MAOXIAN();

  
if (flagkey==1)	
	s[4]=s[4]+1;
	daxian();
flagkey=0;		
for(u=0;u<52500;u++)	//delay
				{}


	}
}

⌨️ 快捷键说明

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