?? lcd_control.c
字號:
/****************************************Copyright (c)**************************************************
** 長春智君電子有限公司
**
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: LCD_control.c
**創(chuàng) 建 人: 查立軍
**最后修改日期: 2007年03月18日
**描 述: 帶漢字字庫的LCD模塊的接口程序
**
**--------------歷史版本信息----------------------------------------------------------------------------
** 創(chuàng)建人: 查立軍
** 版 本: 1.0
** 日 期: 2007年03月18日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
** 修改人: 查立軍
** 版 本: 2.0
** 日 期: 2007年04月13日
** 描 述: 為適應(yīng)新ARM7電路板而修改程序。
**
**--------------當前版本修訂------------------------------------------------------------------------------
** 修改人:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "config.h"
#define _RS 0x00000001 //A0 P3.0 //1:指令寄存器 0:數(shù)據(jù)寄存器
#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 //低電平復(fù)位 (低電平不少于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() 內(nèi)部函數(shù)
* 功能:設(shè)置ARM7的功能管腳__PINSEL2
* 說明:每次初始化電路系統(tǒng),都要調(diào)用此函數(shù),
* 對于每塊電路板此函數(shù)都不相同。需要根據(jù)應(yīng)用需要修改此函數(shù)
* 項目:本次修改是為了應(yīng)用于"LCD接口調(diào)試"而設(shè)計的 2007.4.13
* 入口參數(shù):無
* 出口參數(shù):無
****************************************************************************/
void Lcd_PinSet_PINSEL2(void)
{
//#define _RS 0x00000001 //A0 P3.0 //1:指令寄存器 0:數(shù)據(jù)寄存器
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 //低電平復(fù)位 (低電平不少于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() 內(nèi)部函數(shù)
* 功能:設(shè)置ARM7的功能管腳__GPIO的方向:即輸入輸出
* 說明:每次初始化電路系統(tǒng),都要調(diào)用此函數(shù),
* 對于每塊電路板此函數(shù)都不相同。需要根據(jù)應(yīng)用需要修改此函數(shù)
* 項目:本次修改是為了應(yīng)用于"LCD接口調(diào)試"而設(shè)計的 2007.4.13
* 入口參數(shù):無
* 出口參數(shù):無
****************************************************************************/
void Lcd_PinSet_Dir(void)
{
// 0:輸入: 1:輸出
//#define _RS 0x00000001 //A0 P3.0 //1:指令寄存器 0:數(shù)據(jù)寄存器
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 //低電平復(fù)位 (低電平不少于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 設(shè)為輸出
IO2DIR = IO2DIR | 0x000000FF;
}
/****************************************************************************
* 名稱:testLCD_interface() 內(nèi)部函數(shù)
* 功能:測試ARM7的管腳
* 入口參數(shù):無
* 出口參數(shù):無
****************************************************************************/
uint32 u32PinIn;
void testLCD_interface(void)
{
//#define _Busy 0x40000000 //D30 P2.30 //
u32PinIn = IO2PIN;
//#define _RS 0x00000001 //A0 P3.0 //1:指令寄存器 0:數(shù)據(jù)寄存器
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 //低電平復(fù)位 (低電平不少于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 設(shè)為輸出
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:數(shù)據(jù)寄存器
//#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 //低電平復(fù)位 (低電平不少于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,不復(fù)位
IO0CLR = _BusDIR; //0=數(shù)據(jù)方向為寫出
IO2SET = _LightOn; //1,0=燈亮
}
/****************************************************************************
* 名稱:LcdBusDelay() 內(nèi)部函數(shù)
* 功能:延時子程序
* 入口參數(shù):int t 設(shè)置時間值t
* 出口參數(shù):無
****************************************************************************/
void LcdBusDelay(int t)
{
int i=0;
int n;
for(i=0;i<t;i++)
{
for(n=0;n<20;n++){}
}
}
/****************************************************************************
* 名稱:OutPutData() 內(nèi)部函數(shù)
* 功能:ARM7 輸出的一個字節(jié)數(shù)據(jù)
* 入口參數(shù):要輸出的數(shù)據(jù):u8Data
* 出口參數(shù):無
****************************************************************************/
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() 內(nèi)部函數(shù)
* 功能:ARM7 讀入一個字節(jié)數(shù)據(jù)
* 入口參數(shù):無
* 出口參數(shù):返回一個字節(jié)的數(shù)據(jù)
****************************************************************************/
uint8 InputData()
{
uint8 u8Return;
uint32 u32PinIn;
IO2DIR = IO2DIR & 0xFFFFFF00;
IO2SET = _BusDIR;
u32PinIn = IO2PIN;
u8Return = u32PinIn & 0x000000FF;
IO2DIR = 0xFFFFFFFF;
IO2CLR = _BusDIR;
return u8Return;
}
/****************************************************************************
* 名稱:ResetLCD() 內(nèi)部函數(shù)
* 功能:對LCD模塊輸出復(fù)位信號,使模塊復(fù)位
* 入口參數(shù):無
* 出口參數(shù):無
*********************************************************** *****************/
void ResetLCD()
{
//#define _RS 0x00000001 //A0 P3.0 //1:指令寄存器 0:數(shù)據(jù)寄存器
//#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 //低電平復(fù)位 (低電平不少于100ms)
//#define _BusDIR 0x00100000 //P020 //0:寫出 1 讀入
//#define _LightOn 0x02000000 //D25
IO2CLR = _BusDIR; //0=數(shù)據(jù)方向為寫出
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=復(fù)位
IO2CLR = _LightOn; //1,0=燈亮
LcdBusDelay(5);
IO0CLR = _RST;
LcdBusDelay(1000);
IO0SET = _RST;
LcdBusDelay(5);
IO2SET = _LightOn; //1,0=燈亮
}
/****************************************************************************
* 名稱:DataEnablePlus() 內(nèi)部函數(shù)
* 功能:對LCD模塊輸出Enable脈沖,使模塊接受bus的數(shù)據(jù),或讓模塊輸出數(shù)據(jù)到bus上
* 入口參數(shù):無
* 出口參數(shù):無
****************************************************************************/
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() 內(nèi)部函數(shù)
* 功能:使LCD模塊處于讀狀態(tài),讓模塊準備輸出數(shù)據(jù)到bus上
* 入口參數(shù):無
* 出口參數(shù):無
****************************************************************************/
void SetReadMode()
{
//#define _RW 0x08000000 //WE P3.27 //1:讀取 0:寫入
IO3SET = _RW;//0x00000400; // R/W
}
/****************************************************************************
* 名稱:SetWriteMode() 內(nèi)部函數(shù)
* 功能:使LCD模塊處于寫狀態(tài),使模塊準備接受bus的數(shù)據(jù)
* 入口參數(shù):無
* 出口參數(shù):無
****************************************************************************/
void SetWriteMode()
{
//#define _RW 0x08000000 //WE P3.27 //1:讀取 0:寫入
IO3CLR = _RW;//0x00000400;
}
/****************************************************************************
* 名稱:DataChanelOpen() 內(nèi)部函數(shù)
* 功能:使LCD模塊處于讀寫數(shù)據(jù)的狀態(tài),
* 入口參數(shù):無
* 出口參數(shù):無
****************************************************************************/
void DataChanelOpen()
{
//#define _RS 0x00000001 //A0 P3.0 //1:指令寄存器 0:數(shù)據(jù)寄存器
//#define _CS1 0x02000000 //CS1 P3.25 //片選1; 1=被選中
IO3CLR = _RS;//0x08000000; // RS 0:數(shù)據(jù)寄存器
IO3CLR = _CS1;//0x00000100; // CS1 1=被選中
}
/****************************************************************************
* 名稱:CommandChanelOpen() 內(nèi)部函數(shù)
* 功能:使LCD模塊處于讀寫指令的狀態(tài),
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -