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

📄 untitled.c

📁 基于PIC18F2580实现的 1602LCD显示程序 只用4个数据口
💻 C
字号:
/*****************************************
	   	     *
         			 *
* 时钟频率:内部8MHz 						 *
* 设    计:方  勇						 *
* 修改日期:2008年08月20日				 *
* 编译环境:maplab8.1					 *
* 实验环境:自制试验板					 *
* 使用端口:RC0~PCRC3,RC4,RC5
* 端口连接:RC0~PCRC3->	     *
*****************************************/

#include	"pic18.h"
#pragma romdata TABLE=0x1000
const rom char table[240]={0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,
                           0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,		//"P",0~15
                           0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,
                           0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,		//"I",16~31
					       0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00, 
					       0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,		//"C",32~47
					       0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,
                           0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,		//"1",48~63
				           0x00,0x70,0x88,0x08,0x00,0x1C,0x22,0x21,		//"8"左,64~71
				       	   0x08,0x88,0x70,0x00,0x21,0x22,0x1C,0x00,		//"8"右,72~79 
					       0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,
                           0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,		//"F",80~95
					       0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,
                           0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,		//"4",96~111
					       0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00, 
                           0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,		//"5",112~127
					       0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,
                           0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,		//"8",128~143
					       0x00,0x10,0x0C,0x04,0x4C,0xB4,0x94,0x05,
                           0xF6,0x04,0x04,0x04,0x14,0x0C,0x04,0x00,
                      	   0x00,0x82,0x82,0x42,0x42,0x23,0x12,0x0A,
                           0x07,0x0A,0x12,0xE2,0x42,0x02,0x02,0x00,		//"实",144~175
					       0x02,0xFA,0x82,0x82,0xFE,0x80,0x40,0x60,
                           0x08,0x04,0x24,0x40,0x3F,0x22,0x2C,0x21,	//"验"左,176~191
					       0x58,0x46,0x48,0x50,0x20,0x20,0x20,0x00,
                           0x21,0x2E,0x20,0x30,0x2C,0x23,0x20,0x00,	//"验"右,192~207
				 	       0x10,0x10,0xD0,0xFF,0x50,0x90,0x00,0xFE,
                           0x62,0xA2,0x22,0x21,0xA1,0x61,0x00,0x00,
                     	   0x04,0x03,0x00,0x7F,0x00,0x11,0x0E,0x41,
                           0x20,0x11,0x0A,0x0E,0x31,0x60,0x20,0x00};//"板",208~239	
#pragma romdata

void	initial()
{
	INTCON=0X00;		
	WDTCON=0;
	ADCON1=0X87;				//设置所有与模拟输入共用的引脚为I/O方式
	TRISE=TRISE&0XF8;			//设置RE0,RE1,RE2为输出
	TRISB=TRISB&0XFE;			//设置RB0为输出
    TRISA=TRISA&0XF7;			//设置RA3为输出

}


//读液晶显示器状态子程序,行参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,CLMADD,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);				//开显示
} 

//显示"PIC18"
DISPLAY1(int	E,int	PAGADD,int	CLMADD)
{ 
	int K,m,n=0;
    char TEMP;
	TRANS1(0X0C0,E);
   	TRANS1(PAGADD,E);
    for(m=0;m<4;m++)
	{    
		for(K=0;K<8;K++,CLMADD++) 
	    	{
	        	TEMP=table[K+n];
	        	WRITE1(TEMP,CLMADD,E);
	        }
		CLMADD=CLMADD-8;
	    PAGADD=PAGADD+1;
	    TRANS1(PAGADD,E);
	    for(;K<16;K++,CLMADD++)
	      	{
	       		TEMP=table[K+n];
	       		WRITE1(TEMP,CLMADD,E);
	      	}
		TRANS1(0X0C0,E);
		PAGADD=PAGADD-1;
    	TRANS1(PAGADD,E);
		n=n+16;
	}
	for(K=0;K<4;K++,CLMADD++) 
    	{
        	TEMP=table[K+64];
        	WRITE1(TEMP,CLMADD,E);
        }
	CLMADD=CLMADD-4;
    PAGADD=PAGADD+1;
    TRANS1(PAGADD,E);
    for(;K<8;K++,CLMADD++)
      	{
       		TEMP=table[K+64];
       		WRITE1(TEMP,CLMADD,E);
      	}
}

//显示"8F458"
DISPLAY2(int	E,int	PAGADD,int	CLMADD)
{ 
	int K,m,n=80;
    char TEMP;
    TRANS1(0X0C0,E);
    TRANS1(PAGADD,E);
	for(K=0;K<4;K++,CLMADD++) 
    	{
        	TEMP=table[K+72];
        	WRITE1(TEMP,CLMADD,E);
        }
	CLMADD=CLMADD-4;
    PAGADD=PAGADD+1;
    TRANS1(PAGADD,E);
    for(;K<8;K++,CLMADD++)
      	{
       		TEMP=table[K+72];
       		WRITE1(TEMP,CLMADD,E);
      	}
    
	for(m=0;m<4;m++)
	{
		TRANS1(0X0C0,E);
		PAGADD=PAGADD-1;
    	TRANS1(PAGADD,E);	
		for(K=0;K<8;K++,CLMADD++) 
	    	{
	        	TEMP=table[K+n];
	        	WRITE1(TEMP,CLMADD,E);
	        }
		CLMADD=CLMADD-8;
	    PAGADD=PAGADD+1;
	    TRANS1(PAGADD,E);
	    for(;K<16;K++,CLMADD++)
	      	{
	       		TEMP=table[K+n];
	       		WRITE1(TEMP,CLMADD,E);
	      	}
		n=n+16;
	}

}

//显示"实验"
DISPLAY3(int	E,int	PAGADD,int	CLMADD)
{ 
	int K;
    char TEMP;
    TRANS1(0X0C0,E);		//从0行开始显示
    TRANS1(PAGADD,E);
    for(K=0;K<16;K++,CLMADD++)
     	{   
			TEMP=table[K+144];
        	WRITE1(TEMP,CLMADD,E);
      	}
 	CLMADD=CLMADD-16;
    PAGADD=PAGADD+1;
    TRANS1(PAGADD,E);
    for(;K<32;K++,CLMADD++)
      	{ 
 			TEMP=table[K+144];
       		WRITE1(TEMP,CLMADD,E);
        }
	TRANS1(0X0C0,E);
	PAGADD=PAGADD-1;
    TRANS1(PAGADD,E);
	for(K=0;K<8;K++,CLMADD++) 
	    {
	        TEMP=table[K+176];
	        WRITE1(TEMP,CLMADD,E);
	    }
	CLMADD=CLMADD-8;
	PAGADD=PAGADD+1;
	TRANS1(PAGADD,E);
	for(;K<16;K++,CLMADD++)
	    {
	       	TEMP=table[K+176];
	       	WRITE1(TEMP,CLMADD,E);
	    }
}

//显示"验板"
DISPLAY4(int	E,int	PAGADD,int	CLMADD)
{ 
	int K;
    char TEMP;
    TRANS1(0X0C0,E);		//从0行开始显示
    TRANS1(PAGADD,E);
	for(K=0;K<8;K++,CLMADD++) 
	    {
	        TEMP=table[K+192];
	        WRITE1(TEMP,CLMADD,E);
	    }
	CLMADD=CLMADD-8;
	PAGADD=PAGADD+1;
	TRANS1(PAGADD,E);
	for(;K<16;K++,CLMADD++)
	    {
	       	TEMP=table[K+192];
	       	WRITE1(TEMP,CLMADD,E);
	    }
	TRANS1(0X0C0,E);
	PAGADD=PAGADD-1;
    TRANS1(PAGADD,E);
    for(K=0;K<16;K++,CLMADD++)
     	{   
			TEMP=table[K+208];
        	WRITE1(TEMP,CLMADD,E);
      	}
 	CLMADD=CLMADD-16;
    PAGADD=PAGADD+1;
    TRANS1(PAGADD,E);
    for(;K<32;K++,CLMADD++)
      	{ 
 			TEMP=table[K+208];
       		WRITE1(TEMP,CLMADD,E);
        }
}

//主函数
main()
{    
	int	j;

	for(j=0;j<5;j++)
	{	
		initial();
    	LCD1INIT(1);
   		LCD1INIT(2);

    	DISPLAY1(1,0xBC-j,0x5C); 
    	DISPLAY2(2,0xBC-j,0x40);
    	DISPLAY3(1,0xBE-j,0x68);
		DISPLAY4(2,0xBE-j,0x40);

		Delay10KTCYx (255);			/*暂停 (255 * 10,000 cycles) */
	}
}

⌨️ 快捷键说明

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