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

📄 lcd_19264a_drv.c

📁 LCM19264的测试程序,用于PIC单片机,已经测试通过 可写汉字和英文字符,支持画点
💻 C
📖 第 1 页 / 共 2 页
字号:
#include<worddot.h>
#define LCD_E    PIN_E7
#define LCD_RW   PIN_E6
#define LCD_DI   PIN_E5
#define LCD_CS3  PIN_E4
#define LCD_CS2  PIN_E3
#define LCD_CS1  PIN_E2
#define BL_PWR   PIN_E1
#define LCD_PWR  PIN_E0
#byte   Datalcm  =  0x0f83
#define	lcd_read_status() ( bit_test( Datalcm,7) )

/***********常用操作命令和参数定义***************/
#define	 DISPON		0x3f	/*显示on		*/
#define	 DISPOFF	0x3e	/*显示off		*/
#define	 DISPFIRST	0xc0	/*显示起始行定义	*/
#define	 SETX		0x40	/*X定位设定指令(页)	*/
#define	 SETY		0xb8	/*Y定位设定指令(列)	*/

/**************显示分区边界位置*****************/
#define	 MODL		0   	/*显示区的左边界    */
#define	 MODM		64 	    /*左区和中区分界	*/
#define	 MODR		128 	/*中区和右区分界	*/
#define	 LCMLIMIT	192     /*显示区的右边界	*/

/****************全局变量定义*******************/
int col,row,cbyte;		/*列x,行(页)y,输出数据	*/

#define	lcd_set_e()    output_high(LCD_E)
#define	lcd_set_rw()   output_high(LCD_RW)
#define	lcd_set_di()   output_high(LCD_DI)
#define	lcd_set_cs1()  output_high(LCD_CS1)
#define	lcd_set_cs2()  output_high(LCD_CS2)
#define	lcd_set_cs3()  output_high(LCD_CS3)
#define	lcd_clear_e()  output_low(LCD_E)
#define	lcd_clear_rw() output_low(LCD_RW)
#define	lcd_clear_di() output_low(LCD_DI)
#define	lcd_clear_cs1()  output_low(LCD_CS1)
#define	lcd_clear_cs2()  output_low(LCD_CS2)
#define	lcd_clear_cs3()  output_low(LCD_CS3)

/*****************函数列表**********************/
void Lcminit(void);		    /*液晶模块初始化*/
void Delay(int);		    /*延时,入口数为Ms*/
void lcdbusyL(void);		/*busy判断、等待(左区)	*/
void lcdbusyM(void);		/*busy判断、等待(中区)	*/
void lcdbusyR(void);		/*busy判断、等待(右区)	*/
void Putedot(int x,int y,int Order,int widthw);
void Wrdata(int);		/*数据输出给LCM		*/
void Lcmcls( void );		/*LCM全屏幕清零(填充0)	*/
void wtcom(void);		/*公用busy等待		*/
void Locatexy(void);		/*光标定位		*/
void WrcmdL(int);		/*左区命令输出		*/
void WrcmdM(int);		/*中区命令输出		*/
void WrcmdR(int);		/*右区命令输出		*/
void Putstr(int x,int y,int *array,int i);/*字符串输出*/
void Rollscreen(int x);	/*屏幕向上滚动演示*/
void Rddata(void);		/*从液晶片上读数据*/
void point(void);		/*打点*/
void Linexy(int x0,int y0,int xt,int yt);
void main_init(void);
void timer(void);
void circle(int Ox,int Oy,int Rx);

/********************************************************/
/* 分区操作允许等待,返回时保留分区选择状态		*/
/********************************************************/
//函数功能:选择LCD的左区;
void lcdbusyL(void)
{ lcd_clear_cs1(); /* CS1=0 */
  lcd_set_cs2();   /* CS2=1 */
  lcd_set_cs3();   /* CS3=1 */
  wtcom();         /* 等待LCD使能 */
}

//函数功能:选择LCD的中区;
void lcdbusyM(void)
{ lcd_set_cs1();    /* CS1=1 */
  lcd_clear_cs2();  /* CS2=0 */
  lcd_set_cs3();    /* CS3=1 */
  wtcom();          /* 等待LCD使能 */
}

//函数功能:选择LCD的右区;
void lcdbusyR(void)
{ lcd_set_cs1();    /* CS1=1 */
  lcd_set_cs2();    /* CS2=1 */
  lcd_clear_cs3();  /* CS3=1 */
  wtcom();          /* 等待LCD使能 */
}

//函数功能:等待LCD使能
void wtcom(void)
{ set_tris_d(0xff);         /* 改变RD口的状态,作为输入口 */
  lcd_clear_di();           /* D/I=0,选择指令寄存器 */
  lcd_set_rw();  	        /* R/W=1,发送读允许信号 */
  //Datalcm = 0xFF;
  lcd_set_e();              /* E=1,发送使能信号 */
  delay_us(1);              /* */
  while(lcd_read_status()); /* 若LCD忙,则等待*/
  lcd_clear_e();            /* E=0,发送不使能信号 */
  set_tris_d(0x00);         /* 改变RD口的状态,作为输出口 */
}

/********************************/
/* 命令输出到左区控制口		*/
/********************************/
void WrcmdL(int X)
{ lcdbusyL();       /* 选择LCD的左区,且等待LCD使能; */
  lcd_clear_di();   /* D/I=0,选择指令寄存器 */
  lcd_clear_rw();   /* R/W=0,发送写允许信号 */
  delay_us(1);      /* 延时1us */
  set_tris_d(0x00); /* 改变RD口的状态,作为输出口 */  
  Datalcm= X;       /* 数据写到数据口 */
  lcd_set_e();      /* E=1,发送使能信号 */
  delay_us(1);      /* 延时1us */
  lcd_clear_e();    /* E=0,发送不使能信号 */
}

/********************************/
/* 命令输出到中区控制口		*/
/********************************/
void WrcmdM(int X)
{ lcdbusyM();       /* 选择LCD的中区,且等待LCD使能; */
  lcd_clear_di();   /* D/I=0,选择指令寄存器 */
  lcd_clear_rw();   /* R/W=0,发送写允许信号 */
  delay_us(1);      /* 延时1us */
  set_tris_d(0x00); /* 改变RD口的状态,作为输出口 */  
  Datalcm= X;       /* 数据写到数据口 */
  lcd_set_e();      /* E=1,发送使能信号 */
  delay_us(1);      /* 延时1us */
  lcd_clear_e();    /* E=0,发送不使能信号 */
}

/********************************/
/* 命令输出到右区控制口		*/
/********************************/
void WrcmdR(int X)
{ lcdbusyR();       /* 选择LCD的右区,且等待LCD使能; */
  lcd_clear_di();   /* D/I=0,选择指令寄存器 */
  lcd_clear_rw();   /* R/W=0,发送写允许信号 */
  delay_us(1);      /* 延时1us */
  set_tris_d(0x00); /* 改变RD口的状态,作为输出口 */  
  Datalcm= X;       /* 数据写到数据口 */
  lcd_set_e();      /* E=1,发送使能信号 */
  delay_us(1);      /* 延时1us */
  lcd_clear_e();    /* E=0,发送不使能信号 */
}

/********************************************************/
/*将坐标(col,row)转换为"命令x"和"命令y",选中DDRAM中的"列地址"和"行地址"*/
/********************************************************/
void Locatexy(void)
{ int x,y;
  switch(col&0xc0)
   {  /*条件分支执行*/
     case 0:   { lcdbusyL(); break; }  /* 当0x00<=col<=0x3f时,表示当前坐标位于左区,选择LCD的左区,且等待LCD使能; */
     case 0x40:{ lcdbusyM(); break; }  /* 当0x40<=col<=0x7f时,表示当前坐标位于中区,选择LCD的中区,且等待LCD使能; */
     case 0x80:{ lcdbusyR(); break; }  /* 当0x80<=col<=0xff时,表示当前坐标位于右区,选择LCD的右区,且等待LCD使能; */
   }
  x=col&0x3F|SETX;  //将col的值,转换为"Y地址命令"
  y=row&0x07|SETY;  //将row的值,转换为"X地址命令"

  wtcom();          //等待LCD使能;
  lcd_clear_di();   // D/I=0,选择指令寄存器;
  lcd_clear_rw();   // R/W=0,发送写允许信号;
  delay_us(1);      //延时1us;
  set_tris_d(0x00); //改变RD口的状态,作为输出口;
  Datalcm=y;        //将"X地址命令"的值y发送到DDRAM的"行地址寄存器"中;
  lcd_set_e();      //E=1,发送使能信号;
  delay_us(1);      //延时1us;
  lcd_clear_e();    //E=0,发送不使能信号;

  wtcom();          //等待LCD使能;
  lcd_clear_di();   // D/I=0,选择指令寄存器;
  lcd_clear_rw();   // R/W=0,发送写允许信号;
  delay_us(1);      //延时1us;
  set_tris_d(0x00); //改变RD口的状态,作为输出口;
  Datalcm=x;        //将"Y地址命令"的值x发送到DDRAM的"列地址寄存器"中;
  lcd_set_e();      //E=1,发送使能信号;
  delay_us(1);      //延时1us;
  lcd_clear_e();    //E=0,发送不使能信号;
}

/****************************************/
/*  从液晶片上读数据,保留在全局变量中	*/
/****************************************/
//从LCM中读取地址为(col,row)处的内容,结果保存在cPbyte中;
void Rddata(void)
{ Locatexy();  //将坐标(col,row)转换为"命令x"和"命令y",并选中DDRAM中的"列地址"和"行地址";
  set_tris_d(0xff);  //改变RD口的状态,作为输入口;
  //Datalcm=0xFF;
  lcd_set_di();    // D/I=1,选择数据寄存器;
  lcd_set_rw();    // R/W=1,发送读允许信号
  lcd_set_e();     //E=1,发送使能信号;
  delay_us(1);     //延时1us;
  cbyte=Datalcm;   /*虚读一次*/
  lcd_clear_e();   //E=0,发送不使能信号;

  Locatexy();  //将坐标(col,row)转换为"命令x"和"命令y",并选中DDRAM中的"列地址"和"行地址";
  set_tris_d(0xff); //改变RD口的状态,作为输入口;
  //Datalcm=0xFF;
  lcd_set_di();     // D/I=1,选择数据寄存器;
  lcd_set_rw();     // R/W=1,发送读允许信号
  lcd_set_e();      //E=1,发送使能信号;
  delay_us(1);      //延时1us;
  cbyte=Datalcm;    /*从数据口读数据,真读 */
  lcd_clear_e();    //E=0,发送不使能信号;//E=0,发送不使能信号;
  delay_us(1);      //延时1us;
  set_tris_d(0x00); //改变RD口的状态,作为输出口;
}

/****************************************/
/*将数据X的值,写入到坐标为(col,row)的存储单元*/
/****************************************/
void Wrdata(int X)
{ Locatexy();     //将坐标(col,row)转换为"命令x"和"命令y",并选中DDRAM中的"列地址"和"行地址"
  wtcom();          //等待LCD使能;
  lcd_set_di();     // D/I=1,选择数据寄存器;
  lcd_clear_rw();   // R/W=0,发送写允许信号;
  delay_us(1);      //延时1us;
  set_tris_d(0x00); //改变RD口的状态,作为输出口;
  Datalcm=X;        //将数据X的值写入数据存储器;
  lcd_set_e();      //E=1,发送使能信号;
  delay_us(1);      //延时1us;
  lcd_clear_e();    //E=0,发送不使能信号;
}

/****************************************/
/*	屏幕滚动定位			*/
/****************************************/
void Rollscreen(int x)
{ cbyte=DISPFIRST|x; //显示起始行定义,DISPFIRST=0xc0,设置显示的第1行,为DDRAM的第x行;
  WrcmdL(cbyte); //将命令(0xc0+x)的值输出到左区控制口,告诉LCM,左区显示的第1行,为左区DDRAM的第x行;
  WrcmdM(cbyte); //将命令(0xc0+x)的值输出到中区控制口,告诉LCM,中区显示的第1行,为中区DDRAM的第x行;
  WrcmdR(cbyte); //将命令(0xc0+x)的值输出到右区控制口,告诉LCM,右区显示的第1行,为右区DDRAM的第x行;
}

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

/********************************/
/*液晶屏初始化			*/
/********************************/
//函数功能:第1步:关闭显示屏,第2步:打开显示屏,第3步:定义行号0为显示起始行,第4步:全屏幕清零;
void Lcminit(void)
{ cbyte=DISPOFF;	/*关闭显示屏,定义DISPOFF=0x3e*/
  WrcmdL(cbyte);  //将命令0x3e输出到左区控制口,告诉LCM关闭左区显示;
  WrcmdM(cbyte);  //将命令0x3e输出到中区控制口,告诉LCM关闭中区显示;
  WrcmdR(cbyte);  //将命令0x3e输出到右区控制口,告诉LCM关闭右区显示;

  cbyte=DISPON;   /* 打开显示屏,定义DISPON=0x3f */
  WrcmdL(cbyte);  //将命令0x3f输出到左区控制口,告诉LCM打开左区显示;
  WrcmdM(cbyte);  //将命令0x3f输出到中区控制口,告诉LCM打开中区显示;
  WrcmdR(cbyte);  //将命令0x3f输出到右区控制口,告诉LCM打开右区显示;

  cbyte=DISPFIRST; /*显示起始行定义,DISPFIRST=0xc0*/
  WrcmdL(cbyte);   //将命令0xc0输出到左区控制口,告诉LCM,左区显示的第1行,为左区DDRAM的第0行;
  WrcmdM(cbyte);   //将命令0xc0输出到中区控制口,告诉LCM,中区显示的第1行,为中区DDRAM的第0行;
  WrcmdR(cbyte);   //将命令0xc0输出到右区控制口,告诉LCM,右区显示的第1行,为右区DDRAM的第0行;

  Lcmcls(); //清屏,全屏幕清零;
}

⌨️ 快捷键说明

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