📄 lcd_drive.c
字号:
uint8 LCD12864_Data;
ReadStatus(); //检测忙标志位
IOCLR = LCD12864_EN;
IOSET = LCD12864_RS; //LCD12864_RS为1,选择数据寄存器
IOSET = LCD12864_RW; //LCD12864_RW为1,执行读操作
IOSET = LCD12864_EN;
Delay(2);
IOCLR = LCD12864_EN;
LCD12864_Data = IOPIN&0xff;
return LCD12864_Data;
}
/*********************************************************************************************************************************************
*函数名称: void LCD12864_Write1Byte_X_Y(uint8 x,uint8 y,uint8 LCD12864_data)
*函数功能: 向LCD12864指定点写入一字节数据
*入口参数: x对应列,y对应行
*出口参数: 无
*备 注: x对应行,x~(0-127),y对应列,y~(0-63)
**********************************************************************************************************************************************/
void LCD12864_Write1Byte_X_Y(uint8 x,uint8 y,uint8 LCD12864_data) //x对应行,x~(0-127),y对应列,y~(0-63)
{
x &= 0x7f; //参数过滤
y &= 0x3f;
IOCLR = LCD12864_CS1; //不选中左半屏及右半屏
IOCLR = LCD12864_CS2;
/*更新LCD12864显示*/
if(x<64) //判断选择左右屏
IOSET = LCD12864_CS1; //选中左半屏
else
{
IOSET = LCD12864_CS2; //选中右半屏
x = x-64;
}
LCD12864_Write_cmd(LCD12864_COL_START_ADDR+x); //设置当前列地址,即x坐标
LCD12864_Write_cmd(LCD12864_PAGE_START_ADDR+y); //设置当前页地址,即y坐标
LCD12864_Write_data(LCD12864_data);
}
/*********************************************************************************************************************************************
*函数名称: uint8 LCD12864_Read1Byte_X_Y(uint8 x,uint8 y)
*函数功能: 从LCD12864指定点读取一字节数据
*入口参数: x,y
*出口参数: 无
*备 注: 无
**********************************************************************************************************************************************/
uint8 LCD12864_Read1Byte_X_Y(uint8 x,uint8 y)
{
uint8 LCD12864_Data;
x = x&0x7f; //参数过滤
y = y&0x3f;
IOCLR = LCD12864_CS1; //不选中左半屏及右半屏
IOCLR = LCD12864_CS2;
if(x<64)
{
IOSET = LCD12864_CS1; //选中左半屏
}
else
{
IOSET = LCD12864_CS2; //选中右半屏
x = x-64;
}
LCD12864_Write_cmd(LCD12864_COL_START_ADDR+x); //设置当前列地址,即x地址
LCD12864_Write_cmd(LCD12864_PAGE_START_ADDR+y); //设置当前页地址,即y地址
LCD12864_Data = LCD12864_Read_Data(); //读数据
return LCD12864_Data;
}
/*********************************************************************************************************************************************
*函数名称: void LCD12864_Fill_Screen(uint8 t,uint8 LCD_FillData)
*函数功能: 向12864填充数据
*入口参数: t为设置涮屏速度,为1不涮屏,默认为60;LCD_FillData为要写入的数据
*说 明: 此函数会设置显示起始行为0;且会自动选中左半屏,即CS1有效
*备 注: 无
**********************************************************************************************************************************************/
void LCD12864_Fill_Screen(uint8 t,uint8 LCD12864_FillData)
{
uint8 x,y;
IOSET = LCD12864_CS1; //选中左半屏及右半屏
IOSET = LCD12864_CS2;
LCD12864_Write_cmd(LCD12864_START_ROW+0); //设置显示地址行为0
for(x = 0;x<8;x++)
{
Delay(t);
LCD12864_Write_cmd(LCD12864_PAGE_START_ADDR+x); //设置页地址
LCD12864_Write_cmd(LCD12864_COL_START_ADDR); //设置列地址
for(y = 0;y<64;y++)
LCD12864_Write_data(LCD12864_FillData);
}
IOSET=LCD12864_CS1; //选中左半屏
IOCLR=LCD12864_CS2;
}
/*********************************************************************************************************************************************
*函数名称: void LCD12864_Clear_Screen(void)
*函数功能: 清屏
*入口参数: 无
*出口参数: 无
*备 注: 无
**********************************************************************************************************************************************/
void LCD12864_Clear_Screen(void)
{
LCD12864_Fill_Screen(60,0x00); //写入0到每个显示区
}
/*********************************************************************************************************************************************
*函数名称: void LCD12864_Clear_black(void)
*函数功能: 使12864黑屏
*入口参数: 无
*出口参数: 无
*备 注: 无
**********************************************************************************************************************************************/
void LCD12864_Clear_black(void)
{
LCD12864_Fill_Screen(60,0xff); //写入1到每个显示区
}
/*********************************************************************************************************************************************
*函数名称: void LCD12864_Disp_Bitmap(uint8 t,uint8 *bitmap)
*函数功能: 显示128*64图片
*入口参数: t,设置涮屏速度(为1不涮屏,默认为60),bitmap为128*64点阵图像所在的数组表
*出口参数: 无
*备 注: 无
**********************************************************************************************************************************************/
void LCD12864_Disp_Bitmap(uint8 t,uint8 *bitmap_12864)
{
uint8 j,k;
for(k = 0;k<8;k++) //设置8页的显示
{
Delay(t);
IOSET = LCD12864_CS1; //左半屏
IOCLR = LCD12864_CS2;
LCD12864_Write_cmd(LCD12864_PAGE_START_ADDR+k); //选中页
LCD12864_Write_cmd(LCD12864_COL_START_ADDR+0); //选中列
for(j = 0;j<64;j++)
{
LCD12864_Write_data(bitmap_12864[k*128+j]); //开始写入数据
}
IOCLR = LCD12864_CS1; //右半屏
IOSET = LCD12864_CS2;
LCD12864_Write_cmd(LCD12864_PAGE_START_ADDR+k);
LCD12864_Write_cmd(LCD12864_COL_START_ADDR+0);
for(j = 64;j<128;j++)
{
LCD12864_Write_data(bitmap_12864[k*128+j]);
}
}
}
/*********************************************************************************************************************************************
*函数名称: void LCD12864_Disp_Char_x_16(uint8 t,uint8 b, uint8 LCD12864_page,LCD12864_col,uint8 *Char_x_16)
*函数功能: 写入一个汉字
*入口参数: t设置书写速度,(为1直接显示,默认为12),b为8时输入8*16字符,b为16时输入16*16字符
LCD12864_page为LCD12864的页地址(0~7),LCD12864_col为LCD12864的列地址(0~64)
Char_x_16为16*16点阵汉字字模(纵向取模,字节倒序)
*出口参数: 无
*备 注: 无
**********************************************************************************************************************************************/
void LCD12864_Disp_Char_x_16(uint8 t,uint8 b, uint8 LCD12864_page,uint8 LCD12864_col,uint8 *char_16)
{
uint8 i = 0,j = 0;
for(j = 0;j<2;j++)
{
LCD12864_Write_cmd(LCD12864_PAGE_START_ADDR+LCD12864_page+j);
LCD12864_Write_cmd(LCD12864_COL_START_ADDR+LCD12864_col);
for(i = 0;i<b;i++)
{
LCD12864_Write_data(char_16[b*j+i]);
Delay(t);
}
}
}
/*********************************************************************************************************************************************
*函数名称: void LCD12864_Frame(void)
*函数功能: 在LCD12864上显示最大尺寸的边框
*入口参数: 无
*出口参数: 无
*备 注: 无
**********************************************************************************************************************************************/
void LCD12864_Frame(void)
{
uint8 i;
IOSET = LCD12864_CS1;
IOSET = LCD12864_CS2;
LCD12864_Write_cmd(LCD12864_PAGE_START_ADDR+0);
LCD12864_Write_cmd(LCD12864_COL_START_ADDR+0);
for(i = 0;i<64;i++)
LCD12864_Write_data(0x01); //最上面一行全写1
LCD12864_Write_cmd(LCD12864_PAGE_START_ADDR+7);
LCD12864_Write_cmd(LCD12864_COL_START_ADDR+0);
for(i = 0;i<64;i++)
LCD12864_Write_data(0x80); //最下面一行全写1
for(i = 0;i<8;i++)
{
IOCLR = LCD12864_CS1;
IOSET = LCD12864_CS2;
LCD12864_Write_cmd(LCD12864_PAGE_START_ADDR+i);
LCD12864_Write_cmd(LCD12864_COL_START_ADDR+63);
LCD12864_Write_data(0xff); //最右面一列全写1
IOSET = LCD12864_CS1;
IOCLR = LCD12864_CS2;
LCD12864_Write_cmd(LCD12864_PAGE_START_ADDR+i);
LCD12864_Write_cmd(LCD12864_COL_START_ADDR+0);
LCD12864_Write_data(0xff); //最左面一列全写1
}
}
/*********************************************************************************************************************************************
*函数名称: void LCD12864_init(void)
*函数功能: LCD12864初始化
*入口参数: 无
*出口参数: 无
*备 注: 无
**********************************************************************************************************************************************/
void LCD12864_init(void)
{
IODIR = DATA_CON_DIR|LINE_CON_DIR; //P0.0~P0.7输出,_RS,_RW,_EN,PSB,RST都为输出
IOCLR = LCD12864_RST; //复位
Delay(1);
IOSET = LCD12864_RST;
Delay(1);
LCD12864_Clear_Screen(); //清屏
IOSET = LCD12864_CS1; //选中左半屏及右半屏
IOSET = LCD12864_CS2;
LCD12864_Write_cmd(LCD12864_DISP_OFF); //关显示
LCD12864_Write_cmd(LCD12864_PAGE_START_ADDR+0); //第0页位置
LCD12864_Write_cmd(LCD12864_START_ROW+0); //第0行
LCD12864_Write_cmd(LCD12864_COL_START_ADDR+0); //第0列
LCD12864_Write_cmd(LCD12864_DISP_ON); //开显示
}
/*********************************************************************************************************************************************
*函数名称: void LPC2104_init(void)
*函数功能: LPC2104初始化
*入口参数: 无
*出口参数: 无
*备 注: 无
**********************************************************************************************************************************************/
void LPC2104_init(void)
{
PINSEL0 = 0x00000000; //所以管脚接GPIO
PINSEL1 = 0x00000000;
}
/*********************************************************************************************************************************************
*函数名称: int main(void)
*函数功能: 控制在液晶上显示字符
*入口参数: 无
*出口参数: 无
*备 注: 无
**********************************************************************************************************************************************/
int main(void)
{
uint8 lx = 0,i;
LPC2104_init(); //LPC2104初始化
LCD12864_init(); //LCD12864初始化
while(1)
{
LCD12864_Disp_Bitmap(60,doyleee); //显示LOGO图像
Delay(50000); //延时1秒
LCD12864_Clear_Screen();
for(i = 0;i<7;i++) //显示字符串"Dy12864"
{
LCD12864_Disp_Char_x_16(8,8,1,lx+8*i,nAsciiDot+16*i); //显示"Dy12864"从第1页第0列
}
Delay(50000);
LCD12864_Disp_Char_x_16(12,16,4,20,huan1); //显示"欢",在第4页第20列
Delay(50000);
LCD12864_Disp_Char_x_16(12,16,4,40,ying2); //显示"迎",在第4页第40列
Delay(50000);
}
return 0;
}
/*********************************************************************************************************************************************
//文件到此结束
*********************************************************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -