📄 lcd_driver_user.c
字号:
//========================================================================
// 文件名: LCD_Driver_User.c
// 作 者: Xinqiang Zhang(email: Xinqiang@Mzdesign.com.cn)
// www.Mzdesign.com.cn
// 日 期: 2007/01/07
// 描 述: 底层接口驱动扩展程序集
//
// 参 考: 请参考具体显示器的硬件描述说明书或者是DataSheet,并以此来编写底
// 层接口驱动程序,以及LCD的初始化代码
// 版 本:
// 2007/01/09 First version Mz Design
// 注 意: 适用于MzL501-12864 LCD模块,16位无byte操作指令的MCU
//========================================================================
#include "LCD_Config.h"
#include "LCD_PortConfig.h"
void TimeDelay(int Time);
//========================================================================
// 函数: void LCD_DataWrite(unsigned int Data)
// 描述: 写一个字节的显示数据至LCD中的显示缓冲RAM当中
// 参数: Data 写入的数据
// 返回: 无
// 备注: 无
// 版本:
// 2007/01/09 First version
//========================================================================
void LCD_DataWrite(unsigned int Data)
{
unsigned int uiTemp=0;
uiTemp = *LCD_CMD_Buffer;
uiTemp &= ~(LCD_EP/*+LCD_CS*/+LCD_RW); //EP CS RW to Low
uiTemp |= LCD_A0; //AO Hight
*LCD_CMD_Buffer = uiTemp;
#if LCD_Data_BUS_Byte==1
*LCD_Data_BUS_Out = (*LCD_Data_BUS_Out&0x00ff)|(Data<<8);
#else
*LCD_Data_BUS_Out = (*LCD_Data_BUS_Out&0xff00)|(Data&0x00ff);
#endif
uiTemp = *LCD_CMD_Buffer;
uiTemp |= LCD_EP; //EP to Hight
*LCD_CMD_Buffer = uiTemp;
uiTemp &= ~LCD_EP; //EP to Low
// uiTemp |= LCD_CS; //CS to Hight
*LCD_CMD_Buffer = uiTemp;
}
//========================================================================
// 函数: void LCD_RegWrite(unsigned int Command)
// 描述: 写一个字节的数据至LCD中的控制寄存器当中
// 参数: Command 写入的数据,低八位有效(byte)
// 返回: 无
// 备注:
// 版本:
// 2007/01/09 First version
//========================================================================
void LCD_RegWrite(unsigned int Command)
{
unsigned int uiTemp=0;
uiTemp = *LCD_CMD_Buffer;
uiTemp &= ~(LCD_EP/*+LCD_CS*/+LCD_RW+LCD_A0); //EP CS RW A0 to Low
*LCD_CMD_Buffer = uiTemp;
#if LCD_Data_BUS_Byte==1
*LCD_Data_BUS_Out = (*LCD_Data_BUS_Out&0x00ff)|(Command<<8);
#else
*LCD_Data_BUS_Out = (*LCD_Data_BUS_Out&0xff00)|(Command&0x00ff);
#endif
uiTemp = *LCD_CMD_Buffer;
uiTemp |= LCD_EP; //EP to Hight
*LCD_CMD_Buffer = uiTemp;
uiTemp &= ~LCD_EP; //EP to Low
// uiTemp |= LCD_CS; //CS to Hight
*LCD_CMD_Buffer = uiTemp;
}
//========================================================================
// 函数: unsigned int LCD_DataRead(void)
// 描述: 从LCD中的显示缓冲RAM当中读一个字节的显示数据
// 参数: 无
// 返回: 读出的数据,低八位有效(byte)
// 备注:
// 版本:
// 2007/01/09 First version
// 注意:
//========================================================================
unsigned int LCD_DataRead(void)
{
unsigned int uiTemp=0;
unsigned int Bus_Dir=0;
unsigned int Read_Dat=0;
Bus_Dir = *LCD_Data_BUS_Dir; //设置数据口为输入
#if LCD_Data_BUS_Byte==1
*LCD_Data_BUS_Dir = Bus_Dir&0x00ff;
#else
*LCD_Data_BUS_Dir = Bus_Dir&0xff00;
#endif
uiTemp = *LCD_CMD_Buffer;
uiTemp &= ~(LCD_EP/*+LCD_CS*/); //EP CS to Low
uiTemp |= (LCD_A0+LCD_RW); //AO RW Hight
*LCD_CMD_Buffer = uiTemp;
uiTemp |= LCD_EP; //EP to Hight
*LCD_CMD_Buffer = uiTemp;
uiTemp &= (~LCD_EP);
*LCD_CMD_Buffer = uiTemp; //第一次读是无效的
uiTemp |= LCD_EP; //EP to Hight
*LCD_CMD_Buffer = uiTemp;
uiTemp &= (~LCD_EP);
*LCD_CMD_Buffer = uiTemp;
Read_Dat = *LCD_Data_BUS_In;
// uiTemp = *LCD_CMD_Buffer;
// uiTemp |= LCD_CS; //CS to Hight
*LCD_CMD_Buffer = uiTemp;
*LCD_Data_BUS_Dir = Bus_Dir;
#if LCD_Data_BUS_Byte==1
Read_Dat = Read_Dat>>8;
#else
Read_Dat = Read_Dat&0x00ff;
#endif
return Read_Dat;
}
//========================================================================
// 函数: void Write_Dot_LCD(int x,int y,unsigned int i)
// 描述: 在LCD的真实坐标系上的X、Y点绘制填充色为i的点
// 参数: x X轴坐标
// y Y轴坐标
// i 要填充的点的颜色
// 返回: 无
// 备注:
// 版本:
// 2006/10/15 First version
// 2007/01/09 V1.2
//========================================================================
void Write_Dot_LCD(int x,int y,unsigned int i)
{
unsigned int x_low,x_hight; //定义列地址的高低位指令
unsigned int Dot_Mask_Buf=0x0001;
unsigned int y_Page; //用于存放要画点的位置所在的byte数据位置
x = x+4;
x_low = (x&0x000f); //定位列地址设置的低位指令
x_hight = ((x>>4)&0x000f)+0x10; //定位列地址设置的高位指令
// y_Page = y&0x07; //取低三位
switch(y&0x07)
{
case 0: Dot_Mask_Buf = 0x0001;break;
case 1: Dot_Mask_Buf = 0x0002;break;
case 2: Dot_Mask_Buf = 0x0004;break;
case 3: Dot_Mask_Buf = 0x0008;break;
case 4: Dot_Mask_Buf = 0x0010;break;
case 5: Dot_Mask_Buf = 0x0020;break;
case 6: Dot_Mask_Buf = 0x0040;break;
case 7: Dot_Mask_Buf = 0x0080;break;
}
y_Page = (y>>3)+0x00b0; //Get the page of the byte
LCD_RegWrite(y_Page);
LCD_RegWrite(x_low);
LCD_RegWrite(x_hight);
LCD_RegWrite(0xe0); //设置为读写改模式
y_Page = LCD_DataRead(); //
if(i) y_Page |= Dot_Mask_Buf;
else y_Page &= ~Dot_Mask_Buf;
LCD_DataWrite(y_Page); //
LCD_RegWrite(0xee); //读写改模式结束
}
//========================================================================
// 函数: void LCD_PortInit(void)
// 描述: 与LCD连接的端口初始化代码
// 参数: 无
// 返回: 无
// 备注:
// 版本:
// 2007/01/09 First version
// 注意:
//========================================================================
void LCD_PortInit(void)
{
#if LCD_Data_BUS_Byte==1
*LCD_Data_BUS_Dir = *LCD_Data_BUS_Dir|0xff00;
*LCD_Data_BUS_Attrib = *LCD_Data_BUS_Attrib|0xff00;
*LCD_Data_BUS_Out = *LCD_Data_BUS_Out|0xff00;
#else
*LCD_Data_BUS_Dir = *LCD_Data_BUS_Dir|0x00ff;
*LCD_Data_BUS_Attrib = *LCD_Data_BUS_Attrib|0x00ff;
*LCD_Data_BUS_Out = *LCD_Data_BUS_Out|0x00ff;
#endif
*LCD_CMD_Dir |= (LCD_EP+LCD_A0+LCD_RW/*+LCD_CS*/+LCD_RE);
*LCD_CMD_Attrib |= (LCD_EP+LCD_A0+LCD_RW/*+LCD_CS*/+LCD_RE);
*LCD_CMD_Buffer |= (LCD_EP+LCD_A0+LCD_RW/*+LCD_CS*/+LCD_RE);
*LCD_CMD_Buffer &= (~LCD_RE);
TimeDelay(200);
*LCD_CMD_Buffer |= LCD_RE;
TimeDelay(50);
}
//========================================================================
// 函数: void Clear_Dot_LCD(int x,int y)
// 描述: 清除在LCD的真实坐标系上的X、Y点
// 参数: x X轴坐标
// y Y轴坐标
// 返回: 无
// 备注: 暂不使用该函数
// 版本:
// 2006/10/15 First version
//========================================================================
void Clear_Dot_LCD(int x,int y)
{
//可根据自己的需要填写代码
}
//========================================================================
// 函数: unsigned int Get_Dot_LCD(int x,int y)
// 描述: 获取在LCD的真实坐标系上的X、Y点上的当前填充色数据
// 参数: x X轴坐标
// y Y轴坐标
// 返回: 该点的颜色
// 备注: 暂不使用该函数
// 版本:
// 2006/10/15 First version
//========================================================================
unsigned int Get_Dot_LCD(int x,int y)
{
unsigned int Read_Data;
//可根据自己的需要填写代码
return Read_Data;
}
//========================================================================
// 函数: void Set_Dot_Addr_LCD(int x,int y)
// 描述: 设置在LCD的真实坐标系上的X、Y点对应的RAM地址
// 参数: x X轴坐标
// y Y轴坐标
// 返回: 无
// 备注: 仅设置当前操作地址,为后面的连续操作作好准备
// 版本:
// 2006/10/15 First version
// 2007/01/09 V1.2
//========================================================================
void Set_Dot_Addr_LCD(int x,int y)
{
unsigned int x_low,x_hight; //定义列地址的高低位指令
unsigned int y_Page; //用于存放要画点的位置所在的byte数据位置
x = x+4;
x_low = (x&0x000f); //定位列地址设置的低位指令
x_hight = ((x>>4)&0x000f)+0x10; //定位列地址设置的高位指令
y_Page = (y>>3)+0x00b0; //Get the page of the byte
LCD_RegWrite(y_Page);
LCD_RegWrite(x_low);
LCD_RegWrite(x_hight);
}
//========================================================================
// 函数: void LCD_Fill(unsigned int Data)
// 描述: 会屏填充以Data的数据至各点中
// 参数: Data 要填充的颜色数据
// 返回: 无
// 备注: 仅在LCD初始化程序当中调用
// 版本:
// 2006/10/15 First version
// 2007/01/09 V1.2
//========================================================================
void LCD_Fill(unsigned int Data)
{
unsigned int i,j;
unsigned int uiTemp;
uiTemp = (unsigned int)Dis_Y_MAX;
uiTemp = uiTemp>>3;
for(i=0;i<=uiTemp;i++) //往LCD中填充初始化的显示数据
{
LCD_RegWrite(0xb0+i);
LCD_RegWrite(0x04);
LCD_RegWrite(0x10);
for(j=0;j<=Dis_X_MAX;j++)
{
LCD_DataWrite(Data);
}
}
}
//========================================================================
// 函数: void LCD_Fill_s(unsigned int Number,unsigned int Color)
// 描述: 连续填充以Color色调的Number个点
// 参数: Number 填充的数量 Color 像素点的颜色
// 返回:
// 备注: 该函数可能会使用到
// 版本:
// 2006/10/15 First version
// 2007/01/09 V1.2
//========================================================================
void LCD_Fill_s(unsigned int Number,unsigned int Color)
{
while(Number!=0)
{
LCD_DataWrite(Color); //
Number--;
}
}
//========================================================================
// 函数: void LCD_Init(void)
// 描述: LCD初始化程序,在里面会完成LCD初始所需要设置的许多寄存器,具体如果
// 用户想了解,建议查看DataSheet当中各个寄存器的意义
// 参数: 无
// 返回: 无
// 备注:
// 版本:
// 2006/10/15 First version
// 2007/01/09 V1.2
//========================================================================
//延时程序
void TimeDelay(int Time)
{
int i;
while(Time > 0)
{
for(i = 0;i < 800;i++)
{
// _nop_();
__asm__("nop");
__asm__("nop");
}
Time --;
}
}
void LCD_Init(void)
{
//LCD驱动所使用到的端口的初始化
LCD_PortInit(); //LCD的复位也在该函数中完成
LCD_RegWrite(M_LCD_ON); //LCD On
LCD_RegWrite(M_LCD_POWER_ALL); //设置上电控制模式
LCD_RegWrite(M_LCD_ELE_VOL); //电量设置模式(显示亮度)
LCD_RegWrite(0x30); //指令数据0x0000~0x003f
LCD_RegWrite(M_LCD_VDD_SET); //V5内部电压调节电阻设置
LCD_RegWrite(M_LCD_VDD); //LCD偏压设置,V3时选
LCD_RegWrite(M_LCD_COM_NOR); //Com 扫描方式设置
LCD_RegWrite(M_LCD_SEG_REV); //Segment方向选择
LCD_RegWrite(M_LCD_ALL_LOW); //全屏点亮/变暗指令
LCD_RegWrite(M_LCD_ALL_NOR); //正向反向显示控制指令
LCD_RegWrite(M_LCD_STATIC_OFF); //关闭静态指示器
LCD_RegWrite(0x00); //指令数据
LCD_RegWrite(M_LCD_BEGIN_LINE+0); //设置显示起始行对应RAM
LCD_Fill(LCD_INITIAL_COLOR);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -