📄 lcddrive.c
字号:
/****************************************************************************************
* 文件名:LCDDRIVE.C
* 功能:图形液晶320*240驱动(型号为ili9320)。65K显示存,0000H-7FFFH地址。显示是横向字节,高位
* 在前。
* 硬件连接: D0--D15 <===> D0--D15
* _CS1 <===> (1<<27)
* RS <===> (1<<28)
* _WR <===> (1<<25)
* _RD <===> (1<<24)
* /RST <===> VCC
****************************************************************************************/
#include "config.h"
unsigned int page,seg,Temp0,Temp1;
void delay(unsigned int param)
{
unsigned int x,y;
for(y=0;y<param;y++)
for(x=0;x<10000;x++);
}
void WriteRegAddr(unsigned int Address)
{
IOCLR = DataPort; //DataPort
IOCLR = RS;
IOCLR = _CS1;
IOCLR = _WR;
IOSET = Address;
IOSET = _WR;
IOSET = _CS1;
IOSET = RS;
}
void WriteData(unsigned int OutData)
{
IOCLR = DataPort;
IOCLR = _CS1;
IOSET = OutData; //DataPort=OutData;
IOCLR = _WR;
IOSET = _WR;
IOSET = _CS1;
}
void WriteReg(unsigned int Address, unsigned int OutData)
{
WriteRegAddr(Address);
WriteData(OutData);
}
void LCD_Reset(void)
{
IOSET = _CS1;
IOSET = _RD;
delay(10);
}
//============================================
void LCD_Initial(void) //initial code 1
{
WriteReg(0x000000,0x000100);
WriteReg(0x000100,0x010000);
WriteReg(0x000200,0x040000);
WriteReg(0x000300,0x120000);
WriteReg(0x000400,0x000000);
WriteReg(0x000800,0x020200);
WriteReg(0x000900,0x000000);
WriteReg(0x000a00,0x000000);
WriteReg(0x000c00,0x000000);
WriteReg(0x000d00,0x000000);
WriteReg(0x000f00,0x000000);
WriteReg(0x001000,0x000000);
WriteReg(0x001100,0x000700);
WriteReg(0x001200,0x000000);
WriteReg(0x001300,0x080000);
delay(50);
WriteReg(0x001000,0x15f000);
WriteReg(0x001100,0x000000);
delay(50);
WriteReg(0x001200,0x011c00);
delay(50);
WriteReg(0x001300,0x0d0000);
WriteReg(0x002900,0x000000);
delay(50);
WriteReg(0x002000,0x000000);
WriteReg(0x002100,0x000000);
WriteReg(0x002B00,0x002000);
WriteReg(0x003000,0x000000);
WriteReg(0x003100,0x030600);
WriteReg(0x003200,0x020000);
WriteReg(0x003500,0x010700);
WriteReg(0x003600,0x040400);
WriteReg(0x003700,0x060600);
WriteReg(0x003800,0x010500);
WriteReg(0x003900,0x070700);
WriteReg(0x003c00,0x060000);
WriteReg(0x003d00,0x080700);
//------------------ Set GRAM area -------------//
WriteReg(0x005000, 0x000000); // Horizontal GRAM Start Address
WriteReg(0x005100, 0x00EF00); // Horizontal GRAM End Address
WriteReg(0x005200, 0x000000); // Vertical GRAM Start Address
WriteReg(0x005300, 0x013F00); // Vertical GRAM Start Address
WriteReg(0x006000, 0x270000); // Gate Scan Line
WriteReg(0x006100, 0x000100); // NDL,VLE, REV
WriteReg(0x006A00, 0x000000); // set scrolling line
//-------------- Partial Display Control -------//
WriteReg(0x008000, 0x000000);
WriteReg(0x008100, 0x000000);
WriteReg(0x008200, 0x000000);
WriteReg(0x008300, 0x000000);
WriteReg(0x008400, 0x000000);
WriteReg(0x008500, 0x000000);
//-------------- Panel Control -----------------//
WriteReg(0x009000, 0x001300);
WriteReg(0x009200, 0x000000);
WriteReg(0x009300, 0x000300);
WriteReg(0x009500, 0x011000);
WriteReg(0x009700, 0x000000);
WriteReg(0x009800, 0x000000);
WriteReg(0x000700, 0x000100);
delay(50);
WriteReg(0x000700, 0x002100);
WriteReg(0x000700, 0x002300);
delay(50);
WriteReg(0x000700, 0x017300); // 65K color and display ON
}
//----------------------------------------------------------------------
void Checker(unsigned int param1,unsigned int param2) //Full on,off,checkerboard,bar
{
WriteRegAddr(0x002200);
for(page=0;page<DisplayCol;page++)
{
for(seg=0;seg<DisplaySeg;seg++)
{
if(seg%2)
{
WriteData(param1);
}
else
{
WriteData(param2);
}
}
}
}
//===================================================
void WriteGrid1(void)
{
for(page=0;page<DisplayCol;page++)
{
for(seg=0;seg<DisplaySeg;seg++)
{
switch((page/16+seg/16)%3)
{
case 0: WriteData(0x001f00);break; //red
case 1: WriteData(0x07e000);break; //green
case 2: WriteData(0xf80000);break; //blue
}
}
}
}
//============================================
void Field(void)
{
unsigned char x;
unsigned int y;
WriteRegAddr(0x002200);
for(y=0;y<320;y++)
for(x=0;x<240;x++)
{
if((y==0)||(y==1)||(y==158)||(y==159)||(y==318)||(y==319)){WriteData(0xffff);}
else if((x==0)||(x==1)||(x==118)||(x==119)||(x==238)||(x==239)){WriteData(0xffff);}
else{WriteData(0x000000); }
}
}
//==================================================
void WR_DATA(unsigned int temp1, unsigned int temp2)
{
IOSET = RS;
IOSET = _CS1;
IOCLR = DataPort; //DataPort=temp1;
IOSET = temp1;
IOCLR = _CS1;
IOCLR = DataPort; //DataPort=temp2;
IOSET = temp2;
IOCLR = _WR;
IOSET = _WR;
IOSET = _CS1;
}
//========================================================
void showpicture1(void)
{
unsigned char *p;
unsigned int i,j,temp1,temp2;
WriteReg(0x002000,0x000000);
WriteReg(0x002100,0x000000);
WriteRegAddr(0x002200);
for(i=0;i<320;i++)
{
for(j=0;j<240;j++)
{
temp1=*p++;
temp2=*p++;
WR_DATA(temp1,temp2);
}
}
}
//========================================================
void WriteBar1(void)
{
unsigned char i;
unsigned int m;
WriteRegAddr(0x002200);
for(i=0;i<80;i++)
{
for(m=0;m<240;m++)
WriteData(0xf80000);
}
for(i=0;i<80;i++)
{
for(m=0;m<240;m++)
WriteData(0x07e000);
}
for(i=0;i<80;i++)
{
for(m=0;m<240;m++)
WriteData(0x001f00);
}
for(i=0;i<80;i++)
{
for(m=0;m<240;m++)
WriteData(0xffff00);
}
}
/***********************************************************************
* 名称:LCD_FillAll()
* 功能:LCD填充。以图形方式进行填充,起始地址为0x0000。
* 入口参数:dat 要填充的数据
* 出口参数:无
***********************************************************************/
void LCD_FillAll(uint8 dat)
{// uint32 i;
// LCD_WriteTCommand3(LCD_ADR_POS, 0x00, 0x00); // 置地址指针
// LCD_WriteTCommand1(LCD_AUT_WR); // 自动写
// for(i=0;i<128*30;i++)
// { LCD_WriteTData1(dat); // 写数据
// }
// LCD_WriteTCommand1(LCD_AUT_OVR); // 自动写结束
// LCD_WriteTCommand3(LCD_ADR_POS,0x00,0x00); // 重置地址指针
}
/****************************************************************************
* 名称:LCD_UpdatePoint()
* 功能:在指定位置上画点,刷新某一点。
* 入口参数: x 指定点所在列的位置
* y 指定点所在行的位置
* 出口参数:返回值为1时表示操作成功,为0时表示操作失败。
* 说明:操作失败原因是指定地址超出缓冲区范围。
****************************************************************************/
void LCD_UpdatePoint(uint32 x, uint32 y)
{
/* 设置缓冲区相应的点 */
WriteReg(0x000c00,0x001000);
WriteReg(0x002000,x>>8);
WriteReg(0x002100,y>>8);
/* 输出数据 */
WriteReg(0x002200,0x000000);
WriteReg(0x000c00,0x000000);
}
/****************************************************************************
* 与LCM相关的GUI接口函数
****************************************************************************/
/****************************************************************************
* 名称:GUI_FillSCR()
* 功能:全屏填充。直接使用数据填充显示缓冲区。
* 入口参数:dat 填充的数据(对于黑白色LCM,为0的点灭,为1的点显示)
* 出口参数:无
****************************************************************************/
void GUI_FillSCR(uint8 dat)
{// uint32 i, j;
// for(i=0; i<GUI_LCM_YMAX; i++) // 历遍所有行
// { for(j=0; j<GUI_LCM_XMAX/8; j++) // 历遍所有行
// { gui_disp_buf[i][j] = dat; // 填充数据
// }
// }
/* 填充LCM */
LCD_FillAll(dat);
}
/****************************************************************************
* 名称:GUI_Point()
* 功能:在指定位置上画点。
* 入口参数: x 指定点所在列的位置
* y 指定点所在行的位置
* color 显示颜色(对于黑白色LCM,为0时灭,为1时显示)
* 出口参数:返回值为1时表示操作成功,为0时表示操作失败。(操作失败原因是指定地址超出有
* 效范围)
* 说明:用户根据LCM的实际情况编写此函数。对于单色,只有一个位有效,则要使用左移的方法
* 实现point_dat = (point_dat&MASK_TAB [i]) | (color<<n),其它位数的一样
* 处理。
****************************************************************************/
uint8 GUI_Point(uint32 x, uint32 y, uint32 color)
{ /* 参数过滤 */
if(x>=320) return(0);
if(y>=240) return(0);
/* 设置缓冲区相应的点 */
WriteReg(0x000c00,0x001000);
WriteReg(0x002000,x<<8);
WriteReg(0x002100,y<<8);
/* 刷新显示 */
WriteReg(0x002200,color<<8);
WriteReg(0x000c00,0x000000);
return(1);
}
/****************************************************************************
* 名称:GUI_HLine()
* 功能:画水平线。
* 入口参数:x0 水平线起点所在列的位置
* y0 水平线起点所在行的位置
* x1 水平线终点所在列的位置
* color 显示颜色(对于黑白色LCM,为0时灭,为1时显示)
* 出口参数:无
* 说明:操作失败原因是指定地址超出缓冲区范围。
****************************************************************************/
void GUI_HLine(uint32 x0, uint32 y0, uint32 x1, uint32 color)
{
/* 设置缓冲区相应的点 */
WriteReg(0x000c00,0x001000);
WriteReg(0x002000,x0<<8);
WriteReg(0x002100,y0<<8);
delay(10);
WriteRegAddr(0x002200);
do
{
WriteData(color<<8);
x0--;
}while(x0>x1);
WriteData(color<<8);
WriteReg(0x000c00,0x000000);
}
/****************************************************************************
* 名称:GUI_RLine()
* 功能:画垂直线。
* 入口参数: x0 垂直线起点所在列的位置
* y0 垂直线起点所在行的位置
* y1 垂直线终点所在行的位置
* color 显示颜色(对于黑白色LCM,为0时灭,为1时显示)
* 出口参数:无
* 说明:操作失败原因是指定地址超出缓冲区范围。
****************************************************************************/
void GUI_RLine(uint32 x0, uint32 y0, uint32 y1, uint32 color)
{
/* 设置缓冲区相应的点 */
WriteReg(0x000c00,0x001000);
WriteReg(0x002000,x0<<8);
do
{
WriteReg(0x002100,y0<<8);
WriteRegAddr(0x002200);
WriteData(color<<8);
y0--;}while(y0>y1);
WriteReg(0x002100,y0<<8);
WriteRegAddr(0x002200);
WriteData(color<<8);
WriteReg(0x000c00,0x000000);
}
/***************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -