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

📄 lcd_control.c

📁 驾驶员考试电桩考试系统的车载程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************Copyright (c)**************************************************
**                               长春智君电子有限公司
**
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: LCD_control.c
**创   建   人: 查立军
**最后修改日期: 2007年03月18日
**描        述: 带汉字字库的LCD模块的接口程序
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 查立军
** 版  本: 1.0
** 日 期: 2007年03月18日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
** 修改人: 查立军
** 版  本: 2.0
** 日 期: 2007年04月13日
** 描 述: 为适应新ARM7电路板而修改程序。
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "config.h"

#define 	_RS			0x00000001	//A0	P3.0	//1:指令寄存器	0:数据寄存器
#define 	_RW 		0x08000000	//WE	P3.27	//1:读取 0:写入
#define 	_EN 		0x00000002	//OE	P1.1	//1:有效,0 无效 (使能端)
#define 	_CS1 		0x02000000	//CS1	P3.25	//片选1 
#define 	_CS1_A21 	0x00200000	//A21	P3.21	//片选2 片选1和片选2不同时为0时有效,否则无效
#define 	_Busy		0x40000000	//D30	P2.30	//
//#define 	_Int		0x00000000	//空
#define 	_RST		0x00080000	//P019			//低电平复位 (低电平不少于100ms)

#define 	_BusDIR		0x00100000	//P020			//0:写出 1 读入
#define 	_LightOn	0x02000000	//D25	P2.25

#define 	_D0		0x00000001
#define 	_D1		0x00000002
#define 	_D2		0x00000004
#define 	_D3		0x00000008
#define 	_D4		0x00000010
#define 	_D5		0x00000020
#define 	_D6		0x00000040
#define 	_D7		0x00000080

/*****************************************************************************/
/****************************************************************************
* 名称:Lcd_PinSet_PINSEL2() 内部函数
* 功能:设置ARM7的功能管脚__PINSEL2
* 说明:每次初始化电路系统,都要调用此函数,
*       对于每块电路板此函数都不相同。需要根据应用需要修改此函数
* 项目:本次修改是为了应用于"LCD接口调试"而设计的 2007.4.13
* 入口参数:无
* 出口参数:无
****************************************************************************/
void Lcd_PinSet_PINSEL2(void)
{
	//#define 	_RS			0x00000001	//A0	P3.0	//1:指令寄存器	0:数据寄存器
	PINSEL2 = PINSEL2 & 0xFF7FFFFF; //.23   =0   P3.0       is GPIO        not A0

	//#define 	_RW 		0x08000000	//WE	P3.27	//1:读取 0:写入
	PINSEL2 = PINSEL2 & 0xFFFFFEFF; //.8=0      P3.27       is GPIO        not WE  

	//#define 	_EN 		0x00000002	//OE	P1.1	//1:有效,0 无效 (使能端)
	//LCD: P2.0-P2.7	_D0-D7 
	//#define 	_Busy		0x40000000	//D30	P2.30	//
	//#define 	_LightOn	0x02000000	//D25	P2.25
	PINSEL2 = PINSEL2 | 0x00000030; //.4.5=11 : P2.30 -P2.0  is GPIO        not D30 - D0
									//          P1.0        is GPIO        not CS0 				
									//          P1.1        is GPIO        not OE  (RD)
									//          P3.31       is GPIO        not BLS0
									//          P3.30       is GPIO        not BLS1
									//          P3.29 P3.28 is GPIO / AIN  not BLS[2:3]

	//#define 	_CS1 		0x02000000	//CS1	P3.25	//片选1 
	PINSEL2 = PINSEL2 & 0xFFFF3FFF; //.15.14=00 P3.25       is GPIO        not CS2   
	//#define 	_CS1_A21 	0x00200000	//A21	P3.21	//片选2 片选1和片选2不同时为0时有效,否则无效
	PINSEL2 = PINSEL2 & 0xF1FFFFFF; //.25.27=000 P3.23-P3.2 is GPIO        not A23 - A2

	//#define 	_RST		0x00080000	//P019			//低电平复位 (低电平不少于100ms)
	PINSEL1 = PINSEL1 & 0xFFFFFF3F; //.7.6=00   P0.19       is GPIO        not  
	//#define 	_BusDIR		0x00100000	//P020			//0:写出 1 读入
	PINSEL1 = PINSEL1 & 0xFFFFFCFF; //.9.8=00   P0.20       is GPIO        not  
}
/****************************************************************************
* 名称:Lcd_PinSet_Dir() 内部函数
* 功能:设置ARM7的功能管脚__GPIO的方向:即输入输出
* 说明:每次初始化电路系统,都要调用此函数,
*       对于每块电路板此函数都不相同。需要根据应用需要修改此函数
* 项目:本次修改是为了应用于"LCD接口调试"而设计的 2007.4.13
* 入口参数:无
* 出口参数:无
****************************************************************************/
void Lcd_PinSet_Dir(void)
{
	// 0:输入:	1:输出
	//#define 	_RS			0x00000001	//A0	P3.0	//1:指令寄存器	0:数据寄存器
	IO3DIR = IO3DIR | _RS;
	//#define 	_RW 		0x08000000	//WE	P3.27	//1:读取 0:写入
	IO3DIR = IO3DIR | _RW;
	//#define 	_EN 		0x00000002	//OE	P1.1	//1:有效,0 无效 (使能端)
	IO1DIR = IO1DIR | _EN;
	//#define 	_CS1 		0x02000000	//CS1	P3.25	//片选1 
	IO3DIR = IO3DIR | _CS1;
	//#define 	_CS1_A21 	0x00200000	//A21	P3.21	//片选2 片选1和片选2不同时为0时有效,否则无效
	IO3DIR = IO3DIR | _CS1_A21;
	//#define 	_Busy		0x40000000	//D30	P2.30	//
	IO2DIR = IO2DIR & 0xDFFFFFFF;
	//#define 	_RST		0x00080000	//P019			//低电平复位 (低电平不少于100ms)
	IO0DIR = IO0DIR | _RST;
	//#define 	_BusDIR		0x00100000	//P020			//0:写出 1 读入
	IO0DIR = IO0DIR | _BusDIR;
	//#define 	_LightOn	0x02000000	//D25
	IO2DIR = IO2DIR | _LightOn;
	// D0-D7	P2.0-P2.7	设为输出
	IO2DIR = IO2DIR | 0x000000FF;
	
}

/****************************************************************************
* 名称:testLCD_interface() 内部函数
* 功能:测试ARM7的管脚
* 入口参数:无
* 出口参数:无
****************************************************************************/
uint32 u32PinIn;

void testLCD_interface(void)
{
	//#define 	_Busy		0x40000000	//D30	P2.30	//
	u32PinIn = IO2PIN;

	//#define 	_RS			0x00000001	//A0	P3.0	//1:指令寄存器	0:数据寄存器
	IO3SET = _RS;
	IO3CLR = _RS;
	//#define 	_RW 		0x08000000	//WE	P3.27	//1:读取 0:写入
	IO3SET = _RW;
	IO3CLR = _RW;
	//#define 	_EN 		0x00000002	//OE	P1.1	//1:有效,0 无效 (使能端)
	IO1SET = _EN;
	IO1CLR = _EN;
	//#define 	_CS2 		0x02000000	//CS2	P3.25	//片选1 
	IO3SET = _CS1;
	IO3CLR = _CS1;
	//#define 	_CS2_A21 	0x00400000	//A21	P3.21	//片选2 片选1和片选2同时为0时有效,否则无效
	IO3SET = _CS1_A21;
	IO3CLR = _CS1_A21;
	//#define 	_RST		0x00080000	//P019			//低电平复位 (低电平不少于100ms)
	IO0SET = _RST;
	IO0CLR = _RST;
	//#define 	_BusDIR		0x00100000	//P020			//0:写出 1 读入
	IO0SET = _BusDIR;
	IO0CLR = _BusDIR;
	//#define 	_LightOn	0x02000000	//D25
	IO2SET = _LightOn;	//1,0=灯亮
	IO2CLR = _LightOn;	//1,0=灯亮
	// D0-D7	P2.0-P2.7	设为输出
	IO2SET = _D0;
	IO2CLR = _D0;

	IO0SET = _BusDIR;
	IO2SET = _D0;
	IO2CLR = _D0;

	IO0CLR = _BusDIR;
	IO2SET = _D1;
	IO2CLR = _D1;

	IO2SET = _D2;
	IO2CLR = _D2;

	IO2SET = _D3;
	IO2CLR = _D3;

	IO2SET = _D4;
	IO2CLR = _D4;

	IO2SET = _D5;
	IO2CLR = _D5;

	IO2SET = _D6;
	IO2CLR = _D6;

	IO2SET = _D7;
	IO2CLR = _D7;


	//
	//#define 	_RS			0x00000001	//A0	P3.0	//1:指令寄存器	0:数据寄存器
	//#define 	_RW 		0x08000000	//WE	P3.27	//1:读取 0:写入
	//#define 	_EN 		0x00000002	//OE	P1.1	//1:有效,0 无效 (使能端)
	//#define 	_CS2 		0x02000000	//CS2	P3.25	//片选1 
	//#define 	_CS2_A21 	0x00400000	//A21	P3.21	//片选2 片选1和片选2同时为0时有效,否则无效
	//#define 	_Busy		0x40000000	//D30	P2.30	//
	//#define 	_RST		0x00080000	//P019			//低电平复位 (低电平不少于100ms)
	//#define 	_BusDIR		0x00100000	//P020			//0:写出 1 读入
	//#define 	_LightOn	0x02000000	//D25
	IO3SET = _RS;		//1=指向"指令寄存器"
	IO3SET = _RW;		//1=读
	IO1CLR = _EN;		//0 not enable
	IO3CLR = _CS1;		//0,0=片选1
	IO3CLR = _CS1_A21;	//0,0=片选2
	IO0SET = _RST;		//1,不复位
	IO0CLR = _BusDIR;	//0=数据方向为写出
	IO2SET = _LightOn;	//1,0=灯亮
}

/****************************************************************************
* 名称:LcdBusDelay() 内部函数
* 功能:延时子程序
* 入口参数:int t 设置时间值t
* 出口参数:无
****************************************************************************/
void LcdBusDelay(int t)
{
	int i=0;
	int n;
 
	for(i=0;i<t;i++)
	{
		for(n=0;n<20;n++){}
	}
}
/****************************************************************************
* 名称:OutPutData() 内部函数
* 功能:ARM7 输出的一个字节数据
* 入口参数:要输出的数据:u8Data
* 出口参数:无
****************************************************************************/
void OutPutData(uint8 u8Data)
{	
	uint8 u8Temp;
	
	u8Temp = u8Data;
	if(u8Temp % 2)
		IO2SET = _D0;
	else
		IO2CLR = _D0;
	
	u8Temp = u8Temp / 2;
	if(u8Temp % 2)
		IO2SET = _D1;
	else
		IO2CLR = _D1;
		
	u8Temp = u8Temp / 2 ;
	if(u8Temp % 2)
		IO2SET = _D2;
	else
		IO2CLR = _D2;
		
	u8Temp = u8Temp / 2 ;
	if(u8Temp % 2)
		IO2SET = _D3;
	else
		IO2CLR = _D3;
			
	u8Temp = u8Temp / 2 ;
	if(u8Temp % 2)
		IO2SET = _D4;
	else
		IO2CLR = _D4;
			
	u8Temp = u8Temp / 2 ;
	if(u8Temp % 2)
		IO2SET = _D5;
	else
		IO2CLR = _D5;
			
	u8Temp = u8Temp / 2 ;
	if(u8Temp % 2)
		IO2SET = _D6;
	else
		IO2CLR = _D6;
			
	u8Temp = u8Temp / 2 ;
	if(u8Temp % 2)
		IO2SET = _D7;
	else
		IO2CLR = _D7;
}
/****************************************************************************
* 名称:InputData() 内部函数
* 功能:ARM7 读入一个字节数据
* 入口参数:无
* 出口参数:返回一个字节的数据
****************************************************************************/
uint8 InputData()
{
	uint8  u8Return;
	uint32 u32PinIn;
	
	IO2DIR = IO2DIR & 0xFFFFFF00;
	IO2SET = _BusDIR;
	u32PinIn = IO2PIN;
	u8Return = u32PinIn & 0x000000FF;

	IO2DIR = 0xFFFFFFFF;
	IO2CLR = _BusDIR;
	return u8Return;
}
/****************************************************************************
* 名称:ResetLCD() 内部函数
* 功能:对LCD模块输出复位信号,使模块复位
* 入口参数:无
* 出口参数:无
*********************************************************** *****************/
void ResetLCD()
{
	//#define 	_RS			0x00000001	//A0	P3.0	//1:指令寄存器	0:数据寄存器
	//#define 	_RW 		0x08000000	//WE	P3.27	//1:读取 0:写入
	//#define 	_EN 		0x00000002	//OE	P1.1	//1:有效,0 无效 (使能端)
	//#define 	_CS1 		0x02000000	//CS1	P3.25	//片选1 
	//#define 	_CS1_A21 	0x00200000	//A21	P3.21	//片选2 片选1和片选2不同时为0时有效,否则无效
	//#define 	_Busy		0x40000000	//D30	P2.30	//
	//#define 	_RST		0x00080000	//P019			//低电平复位 (低电平不少于100ms)
	//#define 	_BusDIR		0x00100000	//P020			//0:写出 1 读入
	//#define 	_LightOn	0x02000000	//D25

	IO2CLR = _BusDIR;	//0=数据方向为写出
	IO3SET = _RS;		//1=指向"指令寄存器"
	IO3SET = _RW;		//1,1=读,0=写
	IO1CLR = _EN;		//0,1=Enable
	IO3CLR = _CS1_A21;	//保持一直为0
	IO3CLR = _CS1;		//1,0=片选
	IO0SET = _RST;		//1,0=复位
	IO2CLR = _LightOn;	//1,0=灯亮
	
	LcdBusDelay(5);
	IO0CLR = _RST;
	LcdBusDelay(1000);
	IO0SET = _RST;
	LcdBusDelay(5);
	IO2SET = _LightOn;	//1,0=灯亮
}
/****************************************************************************
* 名称:DataEnablePlus() 内部函数
* 功能:对LCD模块输出Enable脉冲,使模块接受bus的数据,或让模块输出数据到bus上
* 入口参数:无
* 出口参数:无
****************************************************************************/
void DataEnablePlus()
{
	//#define 	_EN 		0x00000002	//OE	P1.1	//1:有效,0 无效 (使能端)
    IO1SET = _EN;//0x00000200;	//P3_3=1;     //E=1;
    LcdBusDelay(10);
	IO1CLR = _EN;//0x00000200;	//P3_3=0;     //E=0;	
}
/****************************************************************************
* 名称:SetReadMode() 内部函数
* 功能:使LCD模块处于读状态,让模块准备输出数据到bus上
* 入口参数:无
* 出口参数:无
****************************************************************************/
void SetReadMode()
{
	//#define 	_RW 		0x08000000	//WE	P3.27	//1:读取 0:写入
	IO3SET = _RW;//0x00000400; //   R/W
}
/****************************************************************************
* 名称:SetWriteMode() 内部函数
* 功能:使LCD模块处于写状态,使模块准备接受bus的数据
* 入口参数:无
* 出口参数:无
****************************************************************************/
void SetWriteMode()
{
	//#define 	_RW 		0x08000000	//WE	P3.27	//1:读取 0:写入
	IO3CLR = _RW;//0x00000400;
}
/****************************************************************************
* 名称:DataChanelOpen() 内部函数
* 功能:使LCD模块处于读写数据的状态,
* 入口参数:无
* 出口参数:无
****************************************************************************/
void DataChanelOpen()
{
	//#define 	_RS			0x00000001	//A0	P3.0	//1:指令寄存器	0:数据寄存器
	//#define 	_CS1 		0x02000000	//CS1	P3.25	//片选1; 1=被选中
	IO3CLR = _RS;//0x08000000; // RS	0:数据寄存器
	IO3CLR = _CS1;//0x00000100; // CS1  1=被选中
}
/****************************************************************************
* 名称:CommandChanelOpen() 内部函数
* 功能:使LCD模块处于读写指令的状态,

⌨️ 快捷键说明

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