📄 lcddrive.c
字号:
for(i=0; i<m; i++)
for(j=0; j<109; j++)
_nop_();
}
/*******************************************************************************************************
** Function name: Lcd_Command
** Descriptions: 写命令函数
** Input: Com 命令
** Output: 无
********************************************************************************************************/
void Lcd_Command(unsigned char cmdcode)
{
DIS_A0 = 1; // 选择指令写通道
LCD_DataPort = cmdcode; // 指令码送数据口
DIS_CS = 0; // 选择模块
DIS_WR = 0; // 写信号有效
DIS_WR = 1; // 写信号无效
DIS_CS = 1; // 封锁模块
Delayms(1); // 延迟,LM2068E、LM1095E使用
}
/*******************************************************************************************************
** Function name: Lcd_DataWrite
** Descriptions: 写数据函数
** Input: DATA 数据
** Output: 无
********************************************************************************************************/
void Lcd_DataWrite(int8 Data)
{
DIS_A0 = 0; // 选择数据写通道
LCD_DataPort = Data; // 数据送数据口
DIS_CS = 0; // 选择模块
DIS_WR = 0; // 写信号有效
DIS_WR = 1; // 写信号无效
DIS_CS = 1; // 封锁模块
}
//------数据读取子程序------------------
uint8 LCD_RdData()
{
uint8 DData;
DIS_A0= 1; // 选择数据读通道
LCD_DataPort=0xff;
DIS_CS = 0; // 选通模块
DIS_RD = 0; // 读信号有效
DData=LCD_DataPort; // 取数据
DIS_RD = 1; // 读信号无效
DIS_CS = 1; // 封锁模块
return(DData); // 返回读取的数据
}
/*******************************************************************************************************
** Function name: LCD_Initial
** Descriptions: 显示图片
********************************************************************************************************/
void LCD_Initial(void)
{
//-------系统设置指令-----------------------
Lcd_Command(0x40); //System Set (带8个参数)
Lcd_DataWrite(0x30); // IV=1,W/S=0,M2=0,M0=0
Lcd_DataWrite(0x87); // WF=1 FX=8
Lcd_DataWrite(0x07); // FY=8
Lcd_DataWrite(0x28); // C/R=40个字符/行 LM2068
// SdData(0x18); // C/R=24个字符/行 LM1095
Lcd_DataWrite(0x47); // TC/R LM2068/LM1095通用
Lcd_DataWrite(0xef); // L/F=240 LM2068
// SdData(0x7f); // L/F=128 LM1095
Lcd_DataWrite(0x30); // AP=0030H
Lcd_DataWrite(0x00); //
//------显示区域设置指令---------------------
Lcd_Command(0x44); //Scroll (带10个参数)
Lcd_DataWrite(0x00); // SAD1= 0000H
Lcd_DataWrite(0x00); //
Lcd_DataWrite(0xef); // SL1=240行 LM2068
// SdData(0x7f); // SL1=128行 LM1095
Lcd_DataWrite(0x00); // SAD2= 1000H
Lcd_DataWrite(0x10); //
Lcd_DataWrite(0xef); // SL2=240行 LM2068
// SdData(0x7f); // SL2=128行 LM1095
Lcd_DataWrite(0x00); // SAD3= 6000H
Lcd_DataWrite(0x60); //
Lcd_DataWrite(0x00); // SAD4= 0000H
Lcd_DataWrite(0x00); //
//------显示功能设置----------------------------
Lcd_Command(0x5a); // HDOT SCR (带1个参数)
Lcd_DataWrite(0x00); //
Lcd_Command(0x5b); // OVLAY (带1个参数)
Lcd_DataWrite(0x01); // OV=0,DM1=0,DM0=0,MX=01(XOR)
Lcd_Command(0x5d); //CSRFORM (带2个参数)
Lcd_DataWrite(0x07); // CX=8
Lcd_DataWrite(0x17); // CM=1, CY=8
//------显示开关指令-----------------------------
Lcd_Command(0x59); // Display ON/OFF(带1个参数)
Lcd_DataWrite(0x14); // 第1、2显示区显示开
}
//-----清屏子程序--------------------------------
void LCD_ClearScreen()
{
uint16 i;
Lcd_Command(0x46); // 设置光标地址
Lcd_DataWrite(0x00);
Lcd_DataWrite(0x00);
Lcd_Command(0x4c); // 设置光标移动方向
Lcd_Command(0x42); // 写数据指令
for (i=0;i<0x7fff;i++) // 循环写32K单元
{
Lcd_DataWrite(0x00); // 写数据0
}
}
//-------字符写入子程序----------------------
void PrintASCII(uint16 x,y,uint8 *pstr)
// 坐标(x,y),x为水平方向字符位;y为垂直方向字符行;*pstr ASCII字符代码数组名
{
uint16 addr; // 第一显示区域为文本属性
addr=y*0x30+x; // 计算显示RAM地址
Lcd_Command(0x46); // 设置字符显示首地址
Lcd_DataWrite(addr);
Lcd_DataWrite(addr>>8);
Lcd_Command(0x4c); // 地址水平加1设置
Lcd_Command(0x42); // 写数据指令
while(*pstr>0)
{
Lcd_DataWrite(*pstr++); // 写入字符代码
}
}
void PrintGB(uint8 x,y,uint8 *pstr)
// 坐标(x,y),x为水平方向字符位;y为垂直方向像素行;*pstr 中文字符代码数组名
{
uint16 addr,pter;
uint8 i,j; // 第二显示区域为图形属性
addr=y*0x30+x+0x1000; // 计算显示RAM地址
while(*pstr>0)
{
pter = *pstr++;
pter= (pter-1)*32; // 计算中文字库字符首地址
for (i=0;i<2;i++)
{
Lcd_Command(0x46); // 设置中文字符显示首地址
Lcd_DataWrite(addr);
Lcd_DataWrite(addr>>8);
Lcd_Command(0x4f); // 设置地址垂直加1行
Lcd_Command(0x42); // 写数据指令
for (j=0;j<16;j++)
{
Lcd_DataWrite(CCTAB[pter+j+16*i]); // 写入字模数据
}
addr=addr+1; // 下一个地址修正?
}
}
}
//-----图画写入子程序-----------------------------------
void Lcd_ShowPics(uint16 x,y,width,high,uint8 bmp[])
// 坐标(x,y),x为水平方向像素列;y为垂直方向像素行
//width:图形水平像素点数;high:图形垂直像素点数;bmp[]:图形数组名
{
uint8 i,j;
uint16 addr,k=0; // 第二显示区域为图形属性
addr=y*0x30+x+0x1000; // 计算显示RAM地址
for(i=0;i<high;i++) // 写入行循环量
{
Lcd_Command(0x46); // 设置图形显示首地址
Lcd_DataWrite(addr);
Lcd_DataWrite(addr>>8);
Lcd_Command(0x4c); // 设置地址水平加1
Lcd_Command(0x42); // 写数据指令
for(j=0;j<width;j++) // 写入数据个数/行
{
Lcd_DataWrite(bmp[k]); // 写入图形数据
k=k+1;
}
addr=addr+0x30; // 地址修正
}
}
//--------画点子程序----------------------------------------
void Draw_Dot(uint16 x, y)
//坐标X为屏幕上水平位置,以像素点为单位;Y为垂直位置,以像素行为单位
{
uint8 dotdata,m;
uint16 addr; // 第二显示区域为图形属性
addr=y*0x30+x/8+0x1000; // 计算显示RAM地址
m=x%8;
dotdata=0x80;
dotdata=dotdata>>m; // 计算显示点数据
Lcd_Command(0x46); // 设置点显示地址
Lcd_DataWrite(addr);
Lcd_DataWrite(addr>>8);
Lcd_Command(0x43); // 读取数据指令
m=LCD_RdData()|dotdata; // 当前显示数据“或”点数据
Lcd_Command(0x46); // 重新设置点显示地址
Lcd_DataWrite(addr);
Lcd_DataWrite(addr>>8);
Lcd_Command(0x42); // 写数据指令
Lcd_DataWrite(m); // 写入绘点数据
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -