|
LCD.c文件:
#include "LPC11XX.h"
#include "gpio.h"
#include "main.h"
#include "Delay.h"
#include "LCD.h"
/*-----------設(shè)置D0-D7為輸出口-------------*/
void Set_GPIO_Output(void)
{
LPC_GPIO2->DIR |= (0x1<<0); //設(shè)置D0-D7為輸出
LPC_GPIO2->DIR |= (0x1<<1);
LPC_GPIO2->DIR |= (0x1<<2);
LPC_GPIO2->DIR |= (0x1<<3);
LPC_GPIO2->DIR |= (0x1<<4);
LPC_GPIO2->DIR |= (0x1<<5);
LPC_GPIO2->DIR |= (0x1<<6);
LPC_GPIO2->DIR |= (0x1<<7);
}
/*-----------設(shè)置D0-D7為輸入口-------------*/
void Set_GPIO_Input(void)
{
LPC_GPIO2->DIR &= ~(0x1<<0); //設(shè)置D0-D7為輸入
LPC_GPIO2->DIR &= ~(0x1<<1);
LPC_GPIO2->DIR &= ~(0x1<<2);
LPC_GPIO2->DIR &= ~(0x1<<3);
LPC_GPIO2->DIR &= ~(0x1<<4);
LPC_GPIO2->DIR &= ~(0x1<<5);
LPC_GPIO2->DIR &= ~(0x1<<6);
LPC_GPIO2->DIR &= ~(0x1<<7);
}
/*-----------LCD端口初始化-------------*/
void LCD_GPIO_Init(void)
{
//P2口可以用這種方式設(shè)置為GPIO,這種方式較合理正式。
LPC_IOCON->PIO2_0 &= (~0x07); //設(shè)置P2.0~P2.10為GPIO
LPC_IOCON->PIO2_1 &= (~0x07);
LPC_IOCON->PIO2_2 &= (~0x07);
LPC_IOCON->PIO2_3 &= (~0x07);
LPC_IOCON->PIO2_4 &= (~0x07);
LPC_IOCON->PIO2_5 &= (~0x07);
LPC_IOCON->PIO2_6 &= (~0x07);
LPC_IOCON->PIO2_7 &= (~0x07);
LPC_IOCON->PIO2_8 &= (~0x07);
LPC_IOCON->PIO2_9 &= (~0x07);
LPC_IOCON->PIO2_10 &=(~0x07);
LPC_GPIO2->DIR |= (0x1<<0); //設(shè)置D0-D7為輸出
LPC_GPIO2->DIR |= (0x1<<1);
LPC_GPIO2->DIR |= (0x1<<2);
LPC_GPIO2->DIR |= (0x1<<3);
LPC_GPIO2->DIR |= (0x1<<4);
LPC_GPIO2->DIR |= (0x1<<5);
LPC_GPIO2->DIR |= (0x1<<6);
LPC_GPIO2->DIR |= (0x1<<7);
LPC_GPIO2->DIR |= (0x1<<8); //RS 設(shè)為輸出
LPC_GPIO2->DIR |= (0x1<<9); //R/W 設(shè)為輸出
LPC_GPIO2->DIR |= (0x1<<10); //EN 設(shè)為輸出
LPC_GPIO3->DIR |= (0x1<<3); //BackLighting 液晶屏背光設(shè)為輸出
GPIOSetValue( 3, 3, 1 ); //BackLighting位寫1,開啟液晶屏背光,寫0關(guān)閉液晶屏背光
}
/*-----------寫數(shù)據(jù)到D0-D7-------------*/
void Write_Data_Port(unsigned char Data)
{
LPC_GPIO2->DATA &= ~(0xff);
LPC_GPIO2->DATA |=Data;
}
/*-----------讀D0-D7的數(shù)據(jù)-------------*/
unsigned char Read_Data_Port(void)
{
//unsigned char In_Data=0;
//In_Data=LPC_GPIO2->DATA;
//return In_Data;
return(LPC_GPIO2->DATA);
}
/*******************************************************************************
* 函 數(shù) 名: uchar Chk_LCD_busy(void)
* 函數(shù)功能: 讀液晶忙通道數(shù)據(jù)
* 入口參數(shù): 無
* 返 回: 無
*******************************************************************************/
unsigned char Chk_LCD_busy(void)
{
unsigned char gR_data;
unsigned char gwait_time=0xff; //設(shè)置忙超時數(shù)
Set_GPIO_Input(); //接收口設(shè)為輸入口
LCD_RS_Low(); //表示狀態(tài)
LCD_RW_High(); //選擇讀
LCD_EN_High();
Delay_Us(30);
gR_data=Read_Data_Port();
Delay_Us(10);
while(TESTBIT(gR_data,7)) //表示busy
{
--gwait_time;
if(!gwait_time)
{
LCD_EN_Low();
Set_GPIO_Output(); //恢復(fù)為輸出口
return 0;
}
}
LCD_EN_Low();
Set_GPIO_Output(); //恢復(fù)為輸出口
return 1;
}
/******************************************************************************
* 函 數(shù) 名: void Write_LCD_command(uchar gcmd,uchar gvalue)
* 函數(shù)功能: 寫指令
* 入口參數(shù): gcmd--指令 gvalue--是否查忙
* 返 回: 無
*******************************************************************************/
void Write_LCD_command(unsigned char gcmd,unsigned char gvalue)
{
if(gvalue) //寫命令時大部分情況下是在LCD空閑模式下寫
{
if(Chk_LCD_busy())
{
LCD_RS_Low(); //選擇指令
LCD_RW_Low(); //選擇寫
LCD_EN_High(); //使能
Write_Data_Port(gcmd); //賦指令
Delay_Us(15);
LCD_EN_Low();
}
}
else
{
LCD_RS_Low(); //選擇指令
LCD_RW_Low(); //選擇寫
LCD_EN_High(); //使能
Write_Data_Port(gcmd); //賦指令
Delay_Us(10);
LCD_EN_Low();
}
}
/******************************************************************************
* 函 數(shù) 名: void Write_LCD_data(uchar gdata)
* 函數(shù)功能: 寫數(shù)據(jù)
* 入口參數(shù): gdata--數(shù)據(jù)
* 返 回: 無
*******************************************************************************/
/*----------- 寫數(shù)據(jù) -------------*/
void Write_LCD_data(unsigned char gdata)
{
if(Chk_LCD_busy()) //寫數(shù)據(jù)必須是在LCD空閑模式下才能寫
{
LCD_RS_High(); //選擇數(shù)據(jù)
LCD_RW_Low(); //選擇寫
LCD_EN_High(); //使能
Write_Data_Port(gdata);
Delay_Us(15);
LCD_EN_Low();
}
}
/******************************************************************************
* 函 數(shù) 名: void INIT_LCD(void)
* 函數(shù)功能: 初始化1602LCD
* 入口參數(shù): 無
* 返 回: 無
*******************************************************************************/
/*-----------LCD初始化函數(shù)-------------*/
void INIT_LCD(void)
{
LCD_GPIO_Init();
Delay_Ms(15);
Write_LCD_command(0x38,0); //設(shè)置16X2顯示,5X7點陣,8位數(shù)據(jù)傳送,不檢測忙信號
Delay_Ms(5);
Write_LCD_command(0x38,0);
Delay_Ms(5);
Write_LCD_command(0x38,0); //設(shè)置16X2顯示,5X7點陣,8位數(shù)據(jù)傳送,不檢測忙信號
Delay_Us(100);
Write_LCD_command(0x38,1); //設(shè)置16X2顯示,5X7點陣,8位數(shù)據(jù)傳送,檢測忙信號
Write_LCD_command(0x08,1); //關(guān)閉顯示、無光標(biāo)、檢測忙信號
Write_LCD_command(0x01,1); //清屏、光標(biāo)歸位、AC=0、檢測忙信號
Delay_Ms(2);
Write_LCD_command(0x06,1); //顯示光標(biāo)右移位置、檢測忙信號
Write_LCD_command(0x0C,1); //顯示功能開、無光標(biāo)、檢測忙信號
}
/******************************************************************************
* 函 數(shù) 名: void Display_LCD_string(uchar gadd_start,uchar gline,uchar glength,uchar *pdata)
* 函數(shù)功能: 顯示字符串
* 入口參數(shù): gadd_start-列號,uchar gline-行號,glength-數(shù)據(jù)長度,pdata-數(shù)組元素
* 返 回: 無
*******************************************************************************/
/*-----------顯示字符串-------------*/
// 列號 行號 數(shù)據(jù)長度 數(shù)組元素
void Display_LCD_string(unsigned char gadd_start,unsigned char gline,unsigned char glength,const unsigned char *pdata)
{
unsigned char gaddress;
//uchar *pdat;
unsigned char gcount=0;
if(!gline) //第0行
{ gaddress=0x80+gadd_start; } //地址對應(yīng)
else
{ gaddress=0xc0+gadd_start; } //第一行
for(;gcount<glength;gcount++)
{
Write_LCD_command(gaddress,1); //設(shè)定數(shù)據(jù)地址
Write_LCD_data(*pdata); //取設(shè)定地址里的數(shù)據(jù)
gaddress++;
pdata++;
}
}
/******************************************************************************
* 函 數(shù) 名: void DispChar_XY_LCD(uchar x,uchar y,uchar gdata)
* 函數(shù)功能: 指定位置顯示字符
* 入口參數(shù): x-起始地址橫坐標(biāo),y-起始地址縱坐標(biāo),gdata-要顯示的字符
* 返 回: 無
*******************************************************************************/
void DispChar_XY_LCD(unsigned char x,unsigned char y,unsigned char gdata)
{
unsigned char gaddress;
if(!y)
{ gaddress=0x80+x; }
else
{ gaddress=0xc0+x; }
Write_LCD_command(gaddress,1); //設(shè)定數(shù)據(jù)地址
Write_LCD_data(gdata);
}
/******************************************************************************
* 函 數(shù) 名: void DispNum_XY_LCD(uchar x,uchar y,uchar gdata)
* 函數(shù)功能: 指定位置顯示數(shù)字
* 入口參數(shù): x-起始地址橫坐標(biāo),y-起始地址縱坐標(biāo),gdata-要顯示的數(shù)字
* 返 回: 無
*******************************************************************************/
void DispNum_XY_LCD(unsigned char x,unsigned char y,unsigned char gdata)
{
unsigned char gaddress;
if(!y)
{ gaddress=0x80+x; }
else
{ gaddress=0xc0+x; }
Write_LCD_command(gaddress,1); //設(shè)定數(shù)據(jù)地址
Write_LCD_data(gdata+0x30);
}
/*-----------清屏-------------*/
void Clear_Display(void)
{
Write_LCD_command(0x01,1);
Delay_Ms(5);
}
LCD.h文件:
#ifndef __LCD_H__
#define __LCD_H__
#define TESTBIT(a,b) ((a)&(1<<(b)))
#define LCD_RS_Low() LPC_GPIO2->DATA &=~(1<<8) //給P2.8位寫0
#define LCD_RS_High() LPC_GPIO2->DATA |=(1<<8) //給P2.8位寫1
#define LCD_RW_Low() LPC_GPIO2->DATA &=~(1<<9) //給P2.9位寫0
#define LCD_RW_High() LPC_GPIO2->DATA |=(1<<9) //給P2.9位寫1
#define LCD_EN_Low() LPC_GPIO2->DATA &=~(1<<10) //給P2.10位寫0
#define LCD_EN_High() LPC_GPIO2->DATA |=(1<<10) //給P2.10位寫1
void Set_GPIO_Output(void);
void Set_GPIO_Input(void);
void LCD_GPIO_Init(void);
void Write_Data_Port(unsigned char Data);
unsigned char Read_Data_Port(void);
unsigned char Chk_LCD_busy(void);
void Write_LCD_command(unsigned char gcmd,unsigned char gvalue);
void Write_LCD_data(unsigned char gdata);
void INIT_LCD(void);
void Display_LCD_string(unsigned char gadd_start,unsigned char gline,unsigned char glength,const unsigned char *pdata);
void DispChar_XY_LCD(unsigned char x,unsigned char y,unsigned char gdata);
void DispNum_XY_LCD(unsigned char x,unsigned char y,unsigned char gdata);
void Clear_Display(void);
#endif
|
|