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

📄 lcd.c

📁 128*64LCD功能程序(原创)
💻 C
字号:
#include <reg52.h>
#include <string.h>
#include <stdlib.h>
#define uchar unsigned char  
#define uint unsigned int 
sbit rs=P3^4;
sbit rw=P3^5;
sbit e=P3^6;
sbit down=P2^1;
sbit up=P2^0;
sbit yes=P2^2;
sbit lb=P2^3;
uint dn=0;
uint un=0;
bit query=0;
unsigned char bdata  TA;
sbit ACC0=TA^0;
sbit ACC1=TA^1;
sbit ACC2=TA^2;
sbit ACC3=TA^3;
sbit ACC4=TA^4;
sbit ACC5=TA^5;
sbit ACC6=TA^6;
sbit ACC7=TA^7;
uchar code xy[]={0x80,0x90,0x88,0x98};
void w_i(uchar ch);
void dis_xyascii(uchar ly ,uchar lx , uint ch); 
void flg_on();
void delay(uint n);           
void xiang()
{
 lb=0;
 delay(2000);
 lb=1;
 delay(3000);
  lb=0;
 delay(2000);
 lb=1;
 delay(3000);
 }

void delay(uint n)           //14us
{
    uint i;
    for(i=0;i<n;i++);
}
void init_lcd()
{
 w_i(0x30);   //设置8BIT界面,基本指令
 delay(100);
 w_i(0x30);   //设置8BIT界面,基本指令
 delay(100);
 w_i(0x0c);    // 打开显示,关光标,反白显示
 delay(100);
 w_i(0x01);	  // 清屏(DDRAM地址计数器归0
 delay(100);    
 w_i(0x06);   //  DDRAM计数器地址加1
 delay(100);
}

void lcd_clr()
{
w_i(0x01);
delay(1000);
}

bit busy()
{

 P1=0xff;
 rs=0;
 rw=1;
 e=1;
 TA=P1;
 e=0;
 if(ACC7==1)     //忙
  {
   	return(0);
   }
  else
   {
    return(1);
	}
 
}
void w_i(uchar ch)  //写指令
{
 while(busy()==0);  //如果忙就等待
 rw=0;
 P1=ch;
 e=1;
 e=0;
}

void w_d(uchar dd)   //写数据         
{
  while(busy()==0);
  rs=1;
  rw=0;
  P1=dd;
  e=1;
  e=0;
}

void flg_on1()         //开光标,不闪烁
{
rs=0;
rw=0;
w_i(0x0e);
delay(50);
}

void flg_on2()         //开光标,闪烁
{
rs=0;
rw=0;
w_i(0x0f);
delay(50);
}
void flg_off()       //关光标
{
rs=0;
rw=0;
w_i(0x0c);
delay(50);
}


void flg_left(uchar k)    //光标左移1位
{
uchar i;
for(i=0;i<k;i++)
{
rs=0;
rw=0;
w_i(0x10);
delay(50);
}
}

void flg_right(uchar k)   //光标右移一位
{
uchar i;
for(i=0;i<k;i++)
{
rs=0;
rw=0;
w_i(0x14);
delay(50);
}
}

void hua_left(uchar n)   //整图右移一位
{
uchar i;
for(i=0;i<n;i++)
{
rs=0;
rw=0;
w_i(0x18);
delay(50);
}
}

void hua_right(uchar n)   //整图右移一位
{
uchar i;
for(i=0;i<n;i++)
{
rs=0;
rw=0;
w_i(0x1c);
delay(50);
}
}


void fanbai(uchar k)     //反白指定行(注意:每当切换下一行反白时,要把上一次反白的行关闭
{
 switch (k)
 {
  case 0:       //1行
   {
   rs=0;
   rw=0;
   w_i(0x34);  //开启扩展命令方式
   delay(50);
   w_i(0x04);
   delay(50);
   w_i(0x30);  //恢复正常命令方式 
   delay(50);
   w_i(0x30);  //恢复正常命令方式 
   delay(50);
   break;
   }
  case 1:        //2行
   {
   rs=0;
   rw=0;
   w_i(0x34);  //开启扩展命令方式
   delay(50);
   w_i(0x05);
   delay(50);
   w_i(0x30);  //恢复正常命令方式 
   delay(50);
   w_i(0x30);  //恢复正常命令方式 
   delay(50);
   break;
   }
  case 2:        //3行
   {
   rs=0;
   rw=0;
   w_i(0x34);  //开启扩展命令方式
   delay(50);
   w_i(0x06);
   delay(50);
   w_i(0x30);  //恢复正常命令方式 
   delay(50);
   w_i(0x30);  //恢复正常命令方式 
   delay(50);
   break;
   }
  case 3:        //4行
   {
   rs=0;
   rw=0;
   w_i(0x34);  //开启扩展命令方式
   delay(50);
   w_i(0x07);
   delay(50);
   w_i(0x30);  //恢复正常命令方式 
   delay(50);
   w_i(0x30);  //恢复正常命令方式 
   delay(50);
    break;
   }
  }

}


void dis_xychar(uchar ly ,uchar lx , uchar *str)    //一排显示中文(小于8字)
{
  uchar temp;
  temp=xy[ly]+lx;
  rs=0;
  rw=0;
  w_i(temp);
  delay(50);
  temp=0;
	do{
	 if(str[temp]==0) 
	  {break;}
	   w_d(str[temp]);
	   delay(10);
	   temp++;
	  }while(1);
}



void dis_xyascii(uchar ly ,uchar lx , uint ch)    //定位显示ASCII符号(2个ASCII字符组成)
{
  uchar temp;
  uchar temp2;
  uchar temp3;
  temp2=ch>>8;
  temp2=temp2&0xff;    //取出高4位
  temp3=ch&0xff;          //取低4位
  temp=xy[ly]+lx;
  rs=0;
  rw=0;
  w_i(temp);
  delay(50);
  w_d(temp2);
  w_d(temp3);
  delay(50);

}


void dis_xynum(uchar ly ,uchar lx , uchar ch)  //定位显示数字
{
  uchar temp;
  uchar temp2;
  temp2=ch>>4;
  temp2=temp2&0x0f;    //取出高4位
  ch=ch&0x0f;          //取低4位
  temp=xy[ly]+lx;
  rs=0;
  rw=0;
  w_i(temp);
  delay(50);
  temp2=temp2+0x30;
  w_d(temp2);
  delay(50);
  ch=ch+0x30;
  w_d(ch);
  delay(50);
}


void dis_xylongchar(uchar ly ,uchar lx , uchar *str)    // 长中文显示(小于32字)
{
  uchar temp=0;
  uchar  temp2=0;
  temp2=xy[ly]+lx;
  rs=0;
  rw=0;
  w_i(temp2);
	do{
	 if(str[temp]==0) 
	  {break;}
	   w_d(str[temp]);
	   temp++;
     if(temp==16-2*lx)
	 {
        temp2=xy[ly+1];      //换行顶格开始
        rs=0;
        rw=0;
        w_i(temp2);
	}
   if(temp==32-2*lx)
   {
        temp2=xy[ly+2];      //换行顶格开始
        rs=0;
        rw=0;
        w_i(temp2);
   }
   if(temp==48-2*lx)
   {
        temp2=xy[ly+3];      //换行顶格开始
        rs=0;
        rw=0;
        w_i(temp2);
   }
	  }while(1);
}
void dwar(uchar *aa)
{
uint temp=0;
uint temp2=0x80;
uchar i,j;
w_i(0x32);       //先打开绘图功能(此时扩展指令允许位为0)
delay(50);
w_i(0x36);      //保持刚才打开的绘图功能,在把扩展指令位值1
delay(50);
for(i=0;i<32;i++)
 {   
    w_i(temp2);
    temp2++;
	delay(50);
  	w_i(0x80);
	delay(50);
  for(j=0;j<16;j++)
   {
    temp++;
	w_d(aa[temp]);
    delay(50);
	}
  } 
temp2=0x80;

for(i=0;i<32;i++)
 {
    w_i(temp2);
    temp2++;
	delay(50);
  	w_i(0x88);
	delay(50);
  for(j=0;j<16;j++)
   {
    temp++;
	w_d(aa[temp]);
    delay(50);
	}
  } 
w_i(0x30);       //画完图就回到普通模式下
delay(50);
w_i(0x30);       
delay(50);
}

void clr_xy(uchar ly,uchar lx)		   //定点清除
{

   dis_xyascii(ly,lx,0x2020); 

}

void dis_xyflg1(uchar ly ,uchar lx )    //定点显示光标不闪烁
{
  uchar temp;
  temp=xy[ly]+lx;
  rs=0;
  rw=0;
  w_i(temp);
  delay(50);
  temp=0;
  flg_on1();
}

void dis_xyflg2(uchar ly ,uchar lx )    //定点显示光标闪烁
{
  uchar temp;
  temp=xy[ly]+lx;
  rs=0;
  rw=0;
  w_i(temp);
  delay(50);
  temp=0;
  flg_on2();
}
/*----------------------------------------
------------------------------------------*/

void main()
{
init_lcd();
do
{

}while(1);
}






⌨️ 快捷键说明

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