📄 12864lcd.c
字号:
/*******************************************************************************
名 称:12864液晶操作程序
功 能:本c文件封装了对12864液晶的一些简单的基本读写操作.
封装函数:
void Lcd_WriteCmd(unsigned char a); //写指令
void Lcd_WriteData(unsigned char a); //写数据
int Lcd_ReadCmd(); //读指令
int Lcd_ReadData(); //读数据
void Lcd_Init(); //初始化液晶
void Lcd_XY(unsigned char a,unsigned char b); //设定光标位置
void Clear_GDRAM(void); //清除液晶GDRAM中的随机数据
void Draw_PM(const uchar *ptr); //在整个液晶屏幕上画图
void Draw_TX(uchar Yaddr,uchar Xaddr,const uchar * dp); //显示一个16*16大小的图形
作 者:胡静涛
最后修改时间:2011年7月25号
备注:该程序应在1M的系统时钟下运行,读忙信号函数已经被封装到除读指令函数以外的函数
中.
典型应用:
Lcd_XY( 1 , 1 );
i = 0;
while( num1[i] != '\0' )
{
Lcd_WriteData( num1[i] );
i++;
}
以上函数均进行测试可以正常使用
*******************************************************************************/
#include "12864LCD.h"
#include "define.h"
//******************************************************************************
//12864液晶读指令
//典型应用 读忙标志:while(Lcd_ReadCmd() & 0x80);
//******************************************************************************
int Lcd_ReadCmd()
{
int temp;
//LCD12864_CMDDIR;
//LCD12864_DATADIR = 0X00;
LCD12864_LCDRS_0;
LCD12864_LCDWR_1;
LCD12864_LCDEN_0;
//_NOP();
delay_ms(1);
LCD12864_LCDEN_1;
//_NOP();
//_NOP();
delay_ms(1);
delay_ms(1);
temp = LCD12864_DATAIN;
LCD12864_LCDEN_0;
return temp;
}
//******************************************************************************
//12864液晶读数据
//******************************************************************************
int Lcd_ReadData()
{
int temp;
while(Lcd_ReadCmd() & 0x80); //读忙信号
//LCD12864_DATADIR = 0X00;
//LCD12864_CMDDIR;
LCD12864_LCDRS_1;
LCD12864_LCDWR_1;
LCD12864_LCDEN_0;
//_NOP();
delay_ms(1);
LCD12864_LCDEN_1;
//_NOP();
//_NOP();
delay_ms(1);
delay_ms(1);
temp = LCD12864_DATAIN;
LCD12864_LCDEN_0;
return temp;
}
//******************************************************************************
//12864液晶写指令
//******************************************************************************
void Lcd_WriteCmd(uchar a)
{
while(Lcd_ReadCmd() & 0x80); //读忙信号
//LCD12864_DATADIR = 0XFF;
//LCD12864_CMDDIR;
LCD12864_LCDRS_0;
LCD12864_LCDWR_0;
LCD12864_LCDEN_0;
//_NOP();
delay_ms(1);
LCD12864_DATA = a;
//_NOP();
delay_ms(1);
LCD12864_LCDEN_1;
//_NOP();
//_NOP();
delay_ms(1);
delay_ms(1);
LCD12864_LCDEN_0;
}
//******************************************************************************
//12864液晶写数据
//******************************************************************************
void Lcd_WriteData(uchar a)
{
while(Lcd_ReadCmd() & 0x80); //读忙信号
//LCD12864_DATADIR = 0XFF;
//LCD12864_CMDDIR;
LCD12864_LCDRS_1;
LCD12864_LCDWR_0;
LCD12864_LCDEN_0;
//_NOP();
delay_ms(1);
LCD12864_DATA = a;
//_NOP();
delay_ms(1);
LCD12864_LCDEN_1;
//_NOP();
//_NOP();
delay_ms(1);
delay_ms(1);
LCD12864_LCDEN_0;
}
//******************************************************************************
//12864液晶初始化
//******************************************************************************
void Lcd_Init()
{
Lcd_WriteCmd(0x30);
Lcd_WriteCmd(0x0c);
Lcd_WriteCmd(0x01);
Lcd_WriteCmd(0x80);
}
//******************************************************************************
//12864液晶光标地址
//******************************************************************************
void Lcd_XY(unsigned char a,unsigned char b)
{
switch (a)
{
case 1:
a = 0x80;
break;
case 2:
a = 0x90;
break;
case 3:
a = 0x88;
break;
case 4:
a = 0x98;
break;
}
Lcd_WriteCmd(a + b - 1);
}
//******************************************************************************
//清除液晶GDRAM中的随机数据
//******************************************************************************
void Clear_GDRAM(void)
{
uchar i,j,k;
Lcd_WriteCmd(0x34); //打开扩展指令集
i = 0x80;
for(j = 0;j < 32;j++)
{
Lcd_WriteCmd(i++);
Lcd_WriteCmd(0x80);
for(k = 0;k < 16;k++)
{
Lcd_WriteData(0x00);
}
}
i = 0x80;
for(j = 0;j < 32;j++)
{
Lcd_WriteCmd(i++);
Lcd_WriteCmd(0x88);
for(k = 0;k < 16;k++)
{
Lcd_WriteData(0x00);
}
}
Lcd_WriteCmd(0x30); //回到基本指令集
}
//******************************************************************************
//在整个液晶屏幕上画图
//******************************************************************************
void Draw_PM(const uchar *ptr)
{
uchar i,j,k;
Lcd_WriteCmd(0x34); //打开扩展指令集
i = 0x80;
for(j = 0;j < 32;j++)
{
Lcd_WriteCmd(i++);
Lcd_WriteCmd(0x80);
for(k = 0;k < 16;k++)
{
Lcd_WriteData(*ptr++);
}
}
i = 0x80;
for(j = 0;j < 32;j++)
{
Lcd_WriteCmd(i++);
Lcd_WriteCmd(0x88);
for(k = 0;k < 16;k++)
{
Lcd_WriteData(*ptr++);
}
}
Lcd_WriteCmd(0x36); //打开绘图显示
Lcd_WriteCmd(0x30); //回到基本指令集
}
//******************************************************************************
//功 能:显示一个16*16大小的图形
//参 数:Yaddr--Y地址
// Xaddr--X地址
// dp--指向图形数据存放地址的指针
//******************************************************************************
void Draw_TX(uchar Yaddr,uchar Xaddr,const uchar * dp)
{
uchar j;
uchar k=0;
Yaddr = Yaddr + 0x80;
Xaddr = Xaddr + 0x80;
Lcd_WriteCmd(0x01); //清屏,只能清除DDRAM
Lcd_WriteCmd(0x34); //使用扩展指令集,关闭绘图显示
for(j=0;j<16;j++)
{
Lcd_WriteCmd(Yaddr++); //Y地址
Lcd_WriteCmd(Xaddr); //X地址
Lcd_WriteData(dp[k++]);
Lcd_WriteData(dp[k++]);
}
Lcd_WriteCmd(0x36); //打开绘图显示
Lcd_WriteCmd(0x30); //回到基本指令集模式
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -