📄 lcd_19264a_drv.c
字号:
#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 + -