📄 lcd_control.c
字号:
/****************************************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 + -