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

📄 st7529.c

📁 St7529液晶模块在LPC2368下的驱动程序及基本显示
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "DisConfig.h"
#include "st7529.h"

//OS_EVENT *St7529Mutex;
//uint8 err;

extern uint8 Dis_ScrBuf[84][20];
extern uint8 Dis_DatLineBuf[12][20];

uint8 Dis_HZK12Buf[24];

const uint8 Dis_DrvBuf[8][2]={	//显示查找表,用两个字节数据显示3个像素
	{0xFF,0xFF},{0xFF,0xC0},{0xF8,0x1F},{0xF8,0x00},
	{0x07,0xFF},{0x07,0xC0},{0x00,0x1F},{0x00,0x00}};
	
uint8 BackFlag;		//反显标志,用于显示菜单项时反显所选项
void Dis_Drv2B3P(uint8 u8t)	//送三个像素显示信息到显示模块,u8t底三位记录对应三个像素显示黑还是白
{
	if(BackFlag)	//需要反显,则查找方式改变
	{WriteLcdData(Dis_DrvBuf[7-u8t][0]);WriteLcdData(Dis_DrvBuf[7-u8t][1]);}
	else		//不需要反显
	{WriteLcdData(Dis_DrvBuf[u8t][0]);WriteLcdData(Dis_DrvBuf[u8t][1]);}
}
//************************************************************************
//LCD INTERFACE for SED1335 or compatable
//************************************************************************

#define ExtModeOff 0x30
#define ExtModeOn  0x31

#define DispOn	0xaf
#define DispOff 0xae
#define DispNor 0xa6
#define DispInv 0xa7

#define ComScan 0xbb

#define DispCtrl 0xca

#define SleepIn 0x95
#define SleepOut 0x94

#define LineAddSet 0x75
#define ColumnAddSet 0x15

#define DataScanDir 0xbc

#define MemWrite 0x5c
#define MemRead  0x5d

#define PartialIn 0xa8
#define PartialOut 0xa9

#define ReadModifyWriteOn 0xe0
#define ReadModifyWriteOff 0xee

#define AreaScrollSet 0xaa
#define ScrollStartAddSet 0xab

#define InternalOscOn 0xd1
#define InternalOscOff 0xd2

#define PowerCtrlSet 0x20

#define VolumnCtrl 0x81
#define IncVolumn  0xd6
#define DecVolumn  0xd7

#define ReadReg1 0x7c
#define ReadReg2 0x7d

#define NoOperation 0x25
#define ExitTestMode 0x25

//#define StatusRead 

#define InitialCode 0x07

#define SetGray1 0x20
#define SetGray2 0x21

#define AnalogCircuitSet 0x32

#define SoftInit 0x34
#define EepromEn  0xcd
#define EepromDis 0xcc

#define EepromWrite 0xfc
#define EepromRead  0xfd


void Delay(int t)
{
	while(t--);
}

/***********************LCM写数据***********************/
void write_bus(uint8 pdata)
{
uint32  tmp;
        tmp=pdata<<20;
        FIO1SET=RD;
	//FIO1PIN=(FIO1PIN&~IO1)|tmp;
	FIO1SET = tmp;
	FIO1CLR = ((~tmp)&IO1);
	Delay(100);	//1~100或注释掉此语句
	FIO1CLR=WR;
	Delay(100);	//1~100或注释掉此语句
        FIO1SET=WR;
}

///////////////////LCD读数据/////////////////////////////
uint8 read_bus()
{
	uint8 pdata;
	uint32 tmp;

	FIO1SET=WR;
	IODIR1&=(~IO1);
	FIO1CLR=RD;
	OSTimeDly(1);
	tmp = FIO1PIN & IO1;
	FIO1SET=RD;
	OSTimeDly(1);
	IODIR1|=IO1;
	pdata = tmp >> 20;
	return pdata;
}

/**********************写命令*******************************/

void SetLcdReg(uint8 cdata)         /* Command write routine */
{
	//OS_ENTER_CRITICAL();
	FIO1CLR=LCDCS0;
	FIO1CLR=A0;
	write_bus(cdata);
	FIO1SET=A0;
	FIO1SET=LCDCS0;
	//OS_EXIT_CRITICAL();
}
/****************写入数据*************************************/
void WriteLcdData(uint8 pdata)        /* Data write (1 byte) routine */
{
	//OS_ENTER_CRITICAL();
	FIO1CLR=LCDCS0;
	FIO1SET=A0;
	write_bus(pdata);
	FIO1SET=LCDCS0;
	//OS_EXIT_CRITICAL();
}
/*******************读取数据*********************************/
uint8 LCD_DataRead(void)
{
uint8 pdata;

	FIO1CLR=LCDCS0;
	FIO1SET=A0;
	pdata=read_bus();
	FIO1SET=LCDCS0;
	return pdata;
}

/////////////////////LCD初始化//////////////////////////
void Lcd_Init(void)
{
	SetLcdReg(ExtModeOff);	// EXT=0
	
	OSTimeDly(1);////////////////

	SetLcdReg(SleepOut);	// SLEEP OUT
	SetLcdReg(InternalOscOn);// INTERNAL OSCILLATION ON
	OSTimeDly(1);////////////////
	
	SetLcdReg(PowerCtrlSet);// POWER CONTROL SET
	WriteLcdData(0x08);		// TURN ON BOOSTER first;
	//Delay(100);
	OSTimeDly(1);
	SetLcdReg(PowerCtrlSet);// POWER CONTROL SET
	WriteLcdData(0x0b);		// TURN ON BOOSTER AND REFERENCE VOLTAGE GENERATION CIRCUIT ;0bh
	
	OSTimeDly(1);////////////////

	SetLcdReg(VolumnCtrl);// THREE COMMANDSET REFERENCE VOLTAGE SELECT MODE 
	WriteLcdData(0x0a);// REFERENCE VOLTAGE PARAMETER ;16
	OSTimeDly(1);////////////////
	WriteLcdData(0x05);// SET REFERENCE VOLTAGE PARAMETER ;04
	OSTimeDly(1);////////////////
	
	SetLcdReg(DispCtrl); // DISPLAY CONTROL 
	WriteLcdData(0x00);// CL DIVIDING RATIO ,F1 AND F2 DRIVE PATTERN
	WriteLcdData(0x27);// DRIVER DUTY 1/160
	WriteLcdData(0x00);// FR INVERSE-SET VALUE 16
	
	OSTimeDly(1);////////////////

	SetLcdReg(DispNor);// DISPLAY NORMAL
	
	OSTimeDly(1);////////////////

	SetLcdReg(ComScan); // C0M0-->COM79,C0M159-->COM81
	WriteLcdData(0x02); 
	
	OSTimeDly(1);////////////////

	SetLcdReg(DataScanDir); // data scan direction
	//WriteLcdData(0x00);     //inverse mode
	//WriteLcdData(0x00);     //p1p2p3p1p2p3...
	//WriteLcdData(0x02);     //3B3P
	WriteLcdData(0x02);     //inverse mode
	WriteLcdData(0x01);     //p3p2p1p3p2p1...
	WriteLcdData(0x01);     //2B3P	WriteLcdData(0x02);
	
	OSTimeDly(1);////////////////

	SetLcdReg(LineAddSet); // line address set
	WriteLcdData(0x00); 
	WriteLcdData(0x9F); 
	OSTimeDly(1);////////////////

	SetLcdReg(ColumnAddSet);// THIRDCOMMAND SET COLUMN ADDRESS 
	WriteLcdData(0x00);// START COLUMN
	WriteLcdData(0x35);// ENDCOLUMN
	OSTimeDly(1);////////////////

	SetLcdReg(ExtModeOn); // EXT=1
	OSTimeDly(1);////////////////

	//==================================================== 
	SetLcdReg(SetGray1);// SET GRAY VALUE

	WriteLcdData(0X00);// START PARA00
	WriteLcdData(0X03);// START PARA03 
	WriteLcdData(0X06);// START PARA06
	WriteLcdData(0X09);// START PARA09

	WriteLcdData(0X0B);// START PARA
	WriteLcdData(0X0D);// START PARA
	WriteLcdData(0X0E);// START PARA 
	WriteLcdData(0X0F);// START PARA
	 
	WriteLcdData(0X10);// START PARA
	WriteLcdData(0X11);// START PARA
	WriteLcdData(0X12);// START PARA 
	WriteLcdData(0X14);// START PARA

	WriteLcdData(0X16);// START PARA
	WriteLcdData(0X18);// START PARA
	WriteLcdData(0X1B);// START PARA 
	WriteLcdData(0X1F);// START PARA
	
	OSTimeDly(1);////////////////

	SetLcdReg(SetGray2);// SET GRAY VALUE

	WriteLcdData(0X00);// START PARA00
	WriteLcdData(0X03);// START PARA03 
	WriteLcdData(0X06);// START PARA06
	WriteLcdData(0X09);// START PARA09

	WriteLcdData(0X0B);// START PARA
	WriteLcdData(0X0D);// START PARA
	WriteLcdData(0X0E);// START PARA 
	WriteLcdData(0X0F);// START PARA
	 
	WriteLcdData(0X10);// START PARA
	WriteLcdData(0X11);// START PARA
	WriteLcdData(0X12);// START PARA 
	WriteLcdData(0X14);// START PARA

	WriteLcdData(0X16);// START PARA
	WriteLcdData(0X18);// START PARA
	WriteLcdData(0X1B);// START PARA 
	WriteLcdData(0X1F);// START PARA
	
	OSTimeDly(1);////////////////

	SetLcdReg(AnalogCircuitSet);// ANALOG CIRCUIT SET 
	WriteLcdData(0x00);// OSC FREQUENCEY ADJUSTMENT
	WriteLcdData(0x01);// BOOSTER EFFICIENCY SET
	WriteLcdData(0x00);// BIAS SETTING 1/14
	
	OSTimeDly(1);////////////////

	SetLcdReg(SoftInit);// DITHERER OFF
	
	OSTimeDly(1);////////////////

	SetLcdReg(ExtModeOff); // EXT=0
	
	OSTimeDly(1);////////////////
	
	SetLcdReg(DispOn); // display on;
}

/***********************接口函数***************************/
void DrowLine(uint8 y)		//画线,y表示线的纵坐标
{
	int32 i;
	SetLcdReg(LineAddSet); // line address set
	WriteLcdData(y); 
	WriteLcdData(y+1);
	
	SetLcdReg(ColumnAddSet);// THIRDCOMMAND SET COLUMN ADDRESS 
	WriteLcdData(0x1f);// START COLUMN
	WriteLcdData(0x54);// ENDCOLUMN
	
	SetLcdReg(MemWrite);//DATA WRITE 
	 
	for(i=0;i<54;i++)
	{	Dis_Drv2B3P(7);}	
}


void Clear6(uint8 x,uint8 y)		//清除(x,y)处开始的6*12的区域
{
	uint16 j;
	SetLcdReg(LineAddSet); // line address set
	WriteLcdData(y); 
	WriteLcdData(y+11); 

	SetLcdReg(ColumnAddSet);// THIRDCOMMAND SET COLUMN ADDRESS 
	WriteLcdData(32+x/3);// START COLUMN
	WriteLcdData(32+x/3+1);// ENDCOLUMN
	
	SetLcdReg(MemWrite);//DATA WRITE 
	for(j=0;j<24;++j)
	{
		Dis_Drv2B3P(0);
	}
}

void Clear(uint8 x,uint8 y,const uint8 *pic)		//清除(x,y)处开始的6*12的区域,该函数用于显示状态栏
{
	uint16 j;
	SetLcdReg(LineAddSet); // line address set
	WriteLcdData(y); 
	WriteLcdData(y+11); 

	SetLcdReg(ColumnAddSet);// THIRDCOMMAND SET COLUMN ADDRESS 
	WriteLcdData(32+x/3);// START COLUMN
	WriteLcdData(32+x/3+3);// ENDCOLUMN
	
	SetLcdReg(MemWrite);//DATA WRITE 
	for(j=0;j<48;++j)
	{
		Dis_Drv2B3P(0);
	}
}


void Clear12(uint8 x,uint8 y)		//清除(x,y)处开始的12*12的区域
{
	uint16 j;
	SetLcdReg(LineAddSet); // line address set
	WriteLcdData(y); 
	WriteLcdData(y+11); 

	SetLcdReg(ColumnAddSet);// THIRDCOMMAND SET COLUMN ADDRESS 
	WriteLcdData(32+x/3);// START COLUMN
	WriteLcdData(32+x/3+3);// ENDCOLUMN
	
	SetLcdReg(MemWrite);//DATA WRITE 
	for(j=0;j<48;++j)
	{
		Dis_Drv2B3P(0);
	}
}

void ScreenClear2()	//清除整个屏幕,并画两条线
{
	int32 i,j;
	SetLcdReg(ColumnAddSet);// THIRDCOMMAND SET COLUMN ADDRESS 
	WriteLcdData(0x1f);// START COLUMN
	WriteLcdData(0x54);// ENDCOLUMN
	
	SetLcdReg(LineAddSet); // line address set
	WriteLcdData(0); 
	WriteLcdData(159);
	
	SetLcdReg(MemWrite);//DATA WRITE 	
	for(i=0;i<160;i++)
	{
		for(j=0;j<54;j++)	Dis_Drv2B3P(0);
	}
	DrowLine(TITLEHIGH-5);
	DrowLine(160-BOOMHIGH);
}
void ScreenClear()	//清除状态拦以外的部分(除显示文字的12像素区域),并画屏幕上的两条线,
{
	int32 i,j,h,k;
	SetLcdReg(ColumnAddSet);// THIRDCOMMAND SET COLUMN ADDRESS 
	WriteLcdData(0x1f);// START COLUMN
	WriteLcdData(0x54);// ENDCOLUMN
	
	SetLcdReg(LineAddSet); // line address set
	WriteLcdData(TITLEHIGH-5); 
	WriteLcdData(TITLEHIGH);
	SetLcdReg(MemWrite);//DATA WRITE 	
	for(i=0;i<6;i++)
	{
		for(j=0;j<54;j++)	Dis_Drv2B3P(0);
	}
	
	h=LINEHIGH-11;
	for(k=0;k<MAXLINE-1;k++)
	{
		SetLcdReg(LineAddSet); // line address set
		WriteLcdData(TITLEHIGH+k*LINEHIGH+12); 
		WriteLcdData(TITLEHIGH+(k+1)*LINEHIGH);
		
		SetLcdReg(MemWrite);//DATA WRITE 	
		for(i=0;i<h;i++)
		{
			for(j=0;j<54;j++)	Dis_Drv2B3P(0);
		}

⌨️ 快捷键说明

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