⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd.c

📁 飞利浦ARM7 LPC2368的12864点阵LCD驱动
💻 C
字号:
#include "config.h"

/*************************LCD***************************/

#define LCD_RST   0X00000010
#define LCD_CMD   0X00000020
#define LCD_CSI    0X00000040
#define LCD_CLK    0X00000080
#define LCD_DATA  0X00000200

#define LCD_RST_MASK   0XFFFFFFEF
#define LCD_CMD_MASK   0XFFFFFFDF
#define LCD_CSI_MASK    0XFFFFFFBF
#define LCD_CLK_MASK    0XFFFFFF7F
#define LCD_DATA_MASK  0XFFFFFDFF

#define LCD_TEST 0x000002F0


/*************************LCD***************************/
void gpio_init_lcd(void)
{
	SCS     = 0x20;
	PINSEL0 &= 0xFFFFFCFF;	//* P0.04 set as LCD_RST IO
	PINSEL0 &= 0xFFFFF3FF;	//* P0.05 set as LCD_CMD IO
	PINSEL0 &= 0xFFFFCFFF;	//* P0.06 set as LCD_CSI IO
	PINSEL0 &= 0xFFFF3FFF;	//* P0.07 set as LCD_CLK IO
	PINSEL0 &= 0xFFF3FFFF;	//* P0.09 set as LCD_DATA IO
	
	
	IODIR0  |= LCD_RST; 		//* LCD_RST out dir
	IODIR0  |= LCD_CMD; 		//* LCD_CMD out dir
	IODIR0  |= LCD_CSI; 		//* LCD_CSI out dir
	IODIR0  |= LCD_CLK;		//* LCD_CLK output direction
	IODIR0  |= LCD_DATA;		//* LCD_DATA output direction	
}

void LcdTest(void)
{
	IOSET0  = LCD_TEST;
	delay2us();	
	IOCLR0 = LCD_TEST;
	delay2us();	
}
void Send2LcdCmd(uint8 cmd )/* rs=0时写入控制指令,rs=1时写入显示数据 */
{
	uint8 i;
	
	IOCLR0 = LCD_CSI;
	delay1us();
	IOCLR0 = LCD_CMD;	
	for(i=0;i<8;i++)
	{
		IOCLR0 = LCD_CLK;			
		if ((cmd & 0x80)!=0)
			IOSET0  = LCD_DATA;
		else 
			IOCLR0 = LCD_DATA;
		delay1us();
		
		IOSET0  = LCD_CLK;
		delay1us();
		cmd = cmd<<1;
	}
	IOSET0  = LCD_CSI;
}
void Send2LcdData(uint8 dat)/* A0=0时写入控制指令,A0=1时写入显示数据 */
{
	uint8 i;
	
	IOCLR0 = LCD_CSI;
	delay1us();
	IOSET0  = LCD_CMD;
	for(i=0;i<8;i++)
	{
		IOCLR0 = LCD_CLK;			
		if ((dat & 0x80)!=0)
			IOSET0  = LCD_DATA;
		else 
			IOCLR0 = LCD_DATA;
		delay1us();
		
		IOSET0  = LCD_CLK;
		delay1us();
		dat = dat<<1;
	}
	IOSET0  = LCD_CSI;
}


void disbmp(uint8 *p)/*显示一幅128*64的图片*/
{
    uint8 i,j;
    for (i = 0xb0;i<0xb8;i++)
    { 
        Send2LcdCmd(i);
        Send2LcdCmd(0x10);
        Send2LcdCmd(0x01);	   //从第1列开始
        for (j=0;j<128;j++)    //到第128列为止
            Send2LcdData(*p++);
    }	
}
void disp_all(uint8 xx,uint8 yy,uint8 l1,uint8 l2)
{
	uint8 i=0,j=0;
	for(j=l1;j<l2;j++)
	{
		Send2LcdCmd(j);
		Send2LcdCmd(0x10);
		Send2LcdCmd(0x01);
		for(i=0;i<64;i++)
		{
			Send2LcdData(xx);
	        Send2LcdData(yy);
		}
	}
}

void dishz(uint8 x_add,uint8 y_add,uint8  *p)
{/*x_add 页地址 y_add 列地址 *p 字模数据地址*/
    uint8 i, pag,colh,coll;
    pag = x_add+0xb0;
    colh = y_add>>4; /*取y_add的高4位*/
    colh = colh | 0xf0;
    colh = colh & 0x1f;
    coll = y_add & 0x0f; /*取y_add的低4位*/
    Send2LcdCmd(colh);
    Send2LcdCmd(coll);
    Send2LcdCmd(pag);
    for (i=0;i<32;i++)
    { 
        if (i == 16)
        { 
            Send2LcdCmd(pag+1);
            Send2LcdCmd(colh);
            Send2LcdCmd(coll);
        }
        Send2LcdData(*p++);
    }
}


void LcdClear()
{
	uint8 i=0,j=0;
	for(j=0xb0;j<0xb8;j++)
	{
		Send2LcdCmd(j);
		Send2LcdCmd(0x10);
		Send2LcdCmd(0x01);
		for(i=0;i<129;i++)
		{
			Send2LcdData(0x00);
		}
	}
}
void InitLcd(void)    /*初始化LCM*/
{  
	
    delayms(250);
	IOCLR0 = LCD_RST;
	delayms(100);
	
	IOSET0 = LCD_RST;
    Send2LcdCmd(0xe2); /*软件复位*/
    delayms(250);
	
	Send2LcdCmd(0x2f); /*电源控制模式:VC,VR,VF=111*/
  	
    Send2LcdCmd(0xa3); /*a2 LCD BIAS=1/9  a3 LCD BIAS=1/7 */
	
    Send2LcdCmd(0xa0); /*列地址移动方向:ADC=0(SEG1->SEG132)从左往右*/
	 
    Send2LcdCmd(0xc8); /*c0 行扫描方向:SHL=0(COM0->COM63)从上往下*/
	
    Send2LcdCmd(0x81); /*对比度寄存器模式*/
	
    Send2LcdCmd(0x08); /*对比度寄存器值  修改这个值就可以调节对比度了   */
	
    Send2LcdCmd(0x60); /*初始行偏移量,偏移32=4 pages,0x40+0x20=0x60*/	

    Send2LcdCmd(0xaf); /*开显示*/
	delayms(100);
	
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -