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

📄 lcd.c

📁 液晶显示lcd128*64
💻 C
字号:
#include<W78E365.h>
#include<math.h>
#include<string.h>
#include<absacc.h>
#include<INTRINS.H>
#include<lcd.h>
#include<util.h>

/********常用命令及参数定义********/
#define DISPON     0x3f
#define DISPOFF    0x3e
#define DISPFIRST  0xc0
#define SETX       0x40
#define SETY       0xb8
#define LCDBUZY    0x80
#define L          0x00
#define R          0x40
#define LIMIT      0x80

/**********引脚定义*********/
sbit addr_lcd_c = P2^2;//锁存信号
sbit addr_lcd_d = P2^7;//锁存信号

/**********全局变量************/
unsigned char cbyte;
unsigned char statu;
//bit simple;

extern unsigned char  code  char_Table[95][16];

//***********初始化LCD*******************/

void Lcminit (void)
{ 
    cbyte=DISPOFF;
    WrL(cbyte);
    WrR(cbyte);
    cbyte=DISPON;
    WrL(cbyte);
    WrR(cbyte);
    cbyte=DISPFIRST;
    WrL(cbyte);
    WrR(cbyte);
    Lcmcls();
    Locatexy(0,0);
}

/***************LCD清屏********************/
void Lcmcls(void)
{ 	
	unsigned char  i,j;
    for(i=0;i<8;i++)
	{
      //delay(6);
        for(j=0;j<LIMIT;j++)
		{
          //delay(6);
          Wrdata(0x0,i,j);
       	}
     }
}

/**************写左区**************/
void WrL(unsigned char x)
{   
   P0=0xFF;		//P0口送FF,准备读
   addr_lcd_d=1;
   addr_lcd_d = 0;
  
   P0 = 0x19;	//ELCD=1(使能),R/W=1(读),D/I=0(指令),CSB=0(左半屏),CSA=1(右半屏),0有效
   addr_lcd_c=1;
   addr_lcd_c = 0;

   delay(5);	//while(P0 & LCDBUZY);//最高位为1,表示忙,则循环

   P0 = 0x03;
   addr_lcd_c = 1;
   addr_lcd_c = 0; 
      
   P0=x;		//P0口送FF,准备读
   addr_lcd_d=1;
   addr_lcd_d = 0;
  
   P0 = 0x11;
   addr_lcd_c = 1;
   addr_lcd_c = 0;
   
   P0 = 0x03;
   addr_lcd_c = 1;
   addr_lcd_c = 0;
}

/**************写右区**************/
void WrR(unsigned char data x)
{
   
   P0=0xFF;		//P0口送FF,准备读
   addr_lcd_d=1;
   addr_lcd_d = 0;

   
   P0 = 0x1a;
   addr_lcd_c=1;
   addr_lcd_c = 0;

   delay(5);		//while(P0 & LCDBUZY);//最高位为1,表示忙,则循环

   P0 = 0x03;
   addr_lcd_c = 1;
   addr_lcd_c = 0;
     
   P0=x;		//P0口送FF,准备读
   addr_lcd_d=1;
   addr_lcd_d = 0;

   P0 = 0x12;
   addr_lcd_c = 1;
   addr_lcd_c = 0;

   P0 = 0x03;
   addr_lcd_c = 1;
   addr_lcd_c = 0;
}

/*************定位*****************/
void Locatexy(unsigned char  row,unsigned char  col)
{
   	unsigned char  x, y, right;
   	switch(col&0xc0)
    {
    	case 0:   
		{
			P0=0xFF;	//P0口送FF,准备读
			addr_lcd_d=1;
   			addr_lcd_d = 0;
   			P0 = 0x1a;
   			addr_lcd_c=1;
   			addr_lcd_c = 0;
   			delay(5);	//while(P0 & LCDBUZY);//最高位为1,表示忙,则循环  
   			P0 = 0x03;
   			addr_lcd_c = 1;
   			addr_lcd_c = 0;
   			right = 1;	//置右半屏标志
			break;
		}		
   		case 0x40:
   		{
   			P0=0xFF;	//P0口送FF,准备读
   			addr_lcd_d=1;
   			addr_lcd_d = 0;
   			P0 = 0x19;
   			addr_lcd_c=1;
   			addr_lcd_c = 0;
   			delay(5);		//while(P0 & LCDBUZY);//最高位为1,表示忙,则循环  
   			P0 = 0x03;
   			addr_lcd_c = 1;
   			addr_lcd_c = 0;
   			right = 0;
			break;
    	}
	}
   	x=col&0x3f|SETX;		//把列数据变成行命令
   	y=row&0x07|SETY;		//把行数据变成行命令
/**********************************/
   	P0=0xFF;
   	addr_lcd_d=1;
   	addr_lcd_d=0;

   	if(right)
    	P0 = 0x1a;
   	else
    	P0 = 0x19;
   	addr_lcd_c = 1;
   	addr_lcd_c = 0;

   	delay(5);	//while(P0 & LCDBUZY);//最高位为1,表示忙,则循环 

   	P0 = 0x03;
   	addr_lcd_c = 1;
   	addr_lcd_c = 0;

/*********以上为判断忙标志********/
   	P0 = y;
	addr_lcd_d=1;
   	addr_lcd_d=0;

   	if(right)
    	P0 = 0x12;
   	else
    	P0 = 0x11;
   	addr_lcd_c = 1;
   	addr_lcd_c = 0;

   	P0 = 0x03;
   	addr_lcd_c = 1;
   	addr_lcd_c = 0;

/**********以上为送行命令***********/
	P0=0xFF;
   	addr_lcd_d=1;
	addr_lcd_d=0;

   	if(right)
    	P0 = 0x1a;
   	else
    	P0 = 0x19;
   	addr_lcd_c = 1;
  	addr_lcd_c = 0;
	 
   	delay(5);	//while(P0 & LCDBUZY);//最高位为1,表示忙,则循环 

   	P0 = 0x03;
   	addr_lcd_c = 1;
   	addr_lcd_c = 0;
/*********以上为判断忙标志********/
   	P0 = x;
   	addr_lcd_d=1;
   	addr_lcd_d=0;

   	if(right)
   	 	P0 = 0x12;
   	else
    	P0 = 0x11;
   	addr_lcd_c = 1;
   	addr_lcd_c = 0; 
    
   	P0 = 0x03;
   	addr_lcd_c = 1;
   	addr_lcd_c = 0;
/**********以上为送列命令***********/
   	if(right)   	//置左右半区全局变量标志
    	statu = 1;
   	else
    	statu = 0;	
}


/**************数据写输出***************/
void  Wrdata(unsigned char  x,unsigned char  row,unsigned char  col)
{   
    Locatexy(row,col);	//定位显示位置

    if(statu)
     	P0 = 0x06;
    else
     	P0 = 0x05;
    addr_lcd_c = 1;
    addr_lcd_c = 0;

    P0 = x;
    addr_lcd_d=1;
    addr_lcd_d=0;

    if(statu)
     	P0 = 0x16;
    else
     	P0 = 0x15;
    addr_lcd_c = 1;
    addr_lcd_c = 0;
   
    P0 = 0x03;
    addr_lcd_c = 1;
    addr_lcd_c = 0;
}



/****************图形输出******************/
void Putpicture(unsigned char *picture)
{
   	unsigned char i,j,row, col ;
   	unsigned int x;
   	row = 0; 
	col=0;
    for(j=0;j<128;j++)
	{
     	x=j*0x08; 
     	for(i=0;i<8;i++)
      	{ 
			cbyte=picture[x++];
          	Wrdata(cbyte,row,col);
        	row++;
      	}   
     	row=0;
     	col++;    
    }  
      
}

/***************半角数据点阵输出*******************/
void Puthalf(unsigned char *strch,unsigned char row,unsigned char col)
{
    unsigned char i,bakerx;
    bakerx = row;
    for(i=0;i<16;i++)//上半字输出
   	{
       	cbyte=strch[i];
        Wrdata(cbyte,bakerx,col);
        cbyte=strch[i+1];
        Wrdata(cbyte,bakerx+1,col);
        col++;
        i++;
   	}
}

/***********************字符型点阵行--》列转换*******************/
void VtoH8x16change(unsigned char  *hzbuf)
{   
	unsigned char i,j,k,cash[16];
    unsigned char newbyte, savebit[8];
    for(k=0;k<16;k++)
	{
      	newbyte = 0;
      	for(i=0;i<8;i++)
		{
        	savebit[i]=hzbuf[i] & 0x80;
       	}
      	for(j=0;j<8;j++)
		{
        	savebit[j] = savebit[j] >> (7-j);
        	newbyte = newbyte | savebit[j];
       	}
      	cash[k] = newbyte;
      	newbyte = 0;
      	for(i=8;i<16;i++)
		{
        	savebit[i-8]=hzbuf[i] & 0x80;
       	}
      	for(j=0;j<8;j++)
		{
        	savebit[j] = savebit[j] >> (7-j);
        	newbyte = newbyte |savebit[j];
       	}
      	cash[k+1] = newbyte;
      	for(j=0;j<16;j++)
		{
        	hzbuf[j] = hzbuf[j] <<1; 
       	}
      	k++;
     }
   	for(i=0;i<16;i++)
      hzbuf[i] = cash[i];
 }

/************************显示英文和符号字符*******************/
void vWrite8x16Character(unsigned char *ch,unsigned char row,unsigned char col,bit flag)
{
	unsigned char  ucXArray[16],i;
    if(flag)
	{     					
		for(i = 0; i < 16; i++)
			ucXArray[i] = ~ch[i];	// 反白显示英文
	}
	else
	{
        for(i = 0; i < 16; i++)
            ucXArray[i] = ch[i];
    }
    VtoH8x16change(ucXArray);
	Puthalf(ucXArray,row,col);
}

/*************************显示中英文字符串*********************/
void  vWrite8x16String(unsigned char  *str,unsigned char row, unsigned char col, bit flag)
{
	unsigned char  i,  j,thiscol;
	j = strlen(str);
	for(i = 0; i < j; i++)
	{   
		thiscol = (i % 16) * 8 + col;//计算列地址
        vWrite8x16Character(&char_Table[str[i]-0x20][0],row,thiscol,flag);
        if(i>15)
		{
         	row++;
         	col=0;
        }
	}
}

⌨️ 快捷键说明

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