?? lcd_drive.c
字號:
/*************************************** Copyright (c) *************************************************
*
* POLAR STAR
* 北天星國際貿易(深圳)有限公司
* http://www.po-star.com
*
* 文 件 名: LCD_DRIVE.C
* 文件描述:實現對16X2點陣液晶屏模塊的顯示驅動,并動態顯示字符串。
* 該模塊的內部芯片是HD44780。內部集成部分簡單字庫
*
* 說 明:將跳線器JP7的所有跳線短接至LCD控制的引腳。
* 將跳線器JP6的所有跳線短接;
*
********************************************************************************************************/
#include "config.h"
#include "LCD_DRIVE.H"
#define LCD_DATAOUT IODIR |= 0xF<<4;
#define LCD_DATAIN IODIR &=(uint8)(~(0xF<<4));
#define LCD_E 1<<24
#define LCD_RW 1<<25
#define LCD_RS 1<<26
#define BEEP 1<<21
#define HD44780_INPUT_SET_MASK (uint8)(~(0xf<<4))
#define HD44780_OUTPUT_SET_MASK ((0x0f<<4)|(7<<24))
/********************************************************************************************************
*
* 函數名稱:HD44780_BUS_DLY(void)
*
* 功能描述:延時1uS,液晶模塊的基本節拍時間。
*
* 入口參數:無
* 出口參數:無
*
* 全局變量: 無
* 調用模塊: 無
*
********************************************************************************************************/
void HD44780_BUS_DLY(void)
{
uint16 dly;
for(dly = 0x2E;dly>0;--dly);
}
/********************************************************************************************************
*
* 函數名稱:Delay100us( unsigned int n_100us )
*
* 功能描述:延時100uS
*
* 入口參數:無
* 出口參數:無
*
* 全局變量: 無
* 調用模塊: 無
*
********************************************************************************************************/
static void Delay100us( uint32 arg ) //Timer0,Delay (100*n_100us)us
{
uint32 tmp;
for(;arg>0;--arg)
for(tmp=0;tmp<760;tmp++);
}
/********************************************************************************************************
*
* 函數名稱:uint8 CheckStatus(void)
*
* 功能描述:狀態查詢
*
* 入口參數:無
* 出口參數:uint8 status 當前LCD的狀態
*
* 全局變量: 無
* 調用模塊: 無
*
********************************************************************************************************/
uint8 CheckStatus (void)
{
uint8 data;
IOSET = LCD_RW;
IOCLR = LCD_RS;
//LCD_DATAIN;
IOSET = LCD_E;
data = IOPIN & 0xF0;
HD44780_BUS_DLY();
IOCLR = LCD_E;
HD44780_BUS_DLY();
IOSET = LCD_E;
data |= (IOPIN >> 4) & 0x0F;
HD44780_BUS_DLY();
IOCLR = LCD_E;
//LCD_DATAOUT;
return data;
}
/********************************************************************************************************
*
* 函數名稱:uint8 BusyCheck(void)
*
* 功能描述:忙查詢等待
*
* 入口參數:無
* 出口參數:uint8 status 當前LCD的狀態
*
* 全局變量: 無
* 調用模塊: 無
*
********************************************************************************************************/
uint8 BusyCheck(void)
{
uint8 status = 0;
uint16 counter = 0;
do
{
status = 0x80 & CheckStatus();
if((counter++) >= 0x3F)
{
status = 1;
break;
}
}while(status);
return status;
}
/********************************************************************************************************
*
* 函數名稱:WriteData (uint8 Data)
*
* 功能描述:發送一個字節到LCD
*
* 入口參數:Data 要發送的數據
* 出口參數:無
*
* 全局變量: 無
* 調用模塊: 無
*
********************************************************************************************************/
void WriteData (uint8 Data)
{
IOCLR = LCD_RW;
IOSET = LCD_RS;
IOSET = LCD_E;
IOPIN = (IOPIN & 0xFFFFFF0F)|(Data & 0xF0);
HD44780_BUS_DLY();
IOCLR = LCD_E;
HD44780_BUS_DLY();
IOSET = LCD_E;
IOPIN = (IOPIN & 0xFFFFFF0F)|((Data<<4) & 0xF0);
HD44780_BUS_DLY();
IOCLR = LCD_E;
HD44780_BUS_DLY();
BusyCheck();
}
/********************************************************************************************************
*
* 函數名稱:uint8 ReadData(void)
*
* 功能描述:讀取一個字節
*
* 入口參數:無
* 出口參數:data 回讀的數據
*
* 全局變量: 無
* 調用模塊: 無
*
********************************************************************************************************/
uint8 ReadData(void)
{
uint8 data;
IOSET = LCD_RW | LCD_RS;
IOSET = LCD_E;
HD44780_BUS_DLY();
data = IOPIN & 0xF0;
IOCLR = LCD_E;
HD44780_BUS_DLY();
IOSET = LCD_E;
HD44780_BUS_DLY();
data |= (IOPIN >> 4)&0x0F;
IOCLR = LCD_E;
return data;
}
/********************************************************************************************************
*
* 函數名稱:WriteCommand(uint8 command)
*
* 功能描述:發送一個字節命令
*
* 入口參數:uint8 command 發送的命令數據
* 出口參數:無
*
* 全局變量: 無
* 調用模塊: 無
*
********************************************************************************************************/
void WriteCommand (uint8 Command)
{
IOCLR = LCD_RW | LCD_RS;
IOSET = LCD_E;
IOPIN = (IOPIN & 0xFFFFFF0F) |(Command & 0xF0);
HD44780_BUS_DLY();
IOCLR = LCD_E;
HD44780_BUS_DLY();
IOSET = LCD_E;
IOPIN = (IOPIN & 0xFFFFFF0F) |((Command<<4) & 0xF0);
HD44780_BUS_DLY();
IOCLR = LCD_E;
HD44780_BUS_DLY();
BusyCheck();
}
/********************************************************************************************************
*
* 函數名稱:void ShowString(uint8 Addr,const uint8 *Str,uint8 No)
*
* 功能描述:顯示字符串
*
* 入口參數:uint8 Addr -- 顯示DDRAM地址
* const uint8 *Str -- 源字符串指針
* uint8 No -- 符串長度
* 出口參數:無
*
* 全局變量: 無
* 調用模塊: 無
*
********************************************************************************************************/
void ShowString(uint8 Addr,const uint8 *Str,uint8 No)
{
uint8 tmp;
for(tmp=0;tmp<=No;tmp++)
{
WriteCommand((Addr + tmp) | 0x80);
WriteData(*Str++);
}
}
/********************************************************************************************************
*
* 函數名稱:void ShowHex(uint8 Addr,uint8 Data)
*
* 功能描述:顯示十六進制數
*
* 入口參數:uint8 Addr -- 要顯示的地址
* uint8 Data -- 要顯示的值
* 出口參數:無
*
* 全局變量: 無
* 調用模塊: 無
*
********************************************************************************************************/
void ShowHex(uint8 Addr,uint8 Data)
{
uint8 DataH,DataL;
DataH=(Data/10)+'0';
DataL=(Data%10)+'0';
WriteCommand(Addr|0x80);
WriteData(DataH);
WriteCommand((Addr+1)|0x80);
WriteData(DataL);
}
/********************************************************************************************************
*
* 函數名稱:void PowerUpInit(void)
*
* 功能描述:上電初始化,請嚴格參照HD44780的四線寬度的初始化說明。
*
* 入口參數:無
* 出口參數:無
*
* 全局變量: 無
* 調用模塊: 無
*
********************************************************************************************************/
void PowerUpInit(void)
{
/* Init MCU IO */
PINSEL0 = 0x00000000; // 設置所有控制引腳為GPIO口
PINSEL1 = 0x00000000;
IODIR = HD44780_OUTPUT_SET_MASK; // 設置所有控制引腳為輸出口
Delay100us(1510); // 1.等待15.1mS
WriteCommand(0x30); // 2.8位接口
Delay100us(41); // 3.等待4.1mS
WriteCommand(0x30); // 4.8位接口
Delay100us(2); // 5
WriteCommand(0x30); // 6.
//WriteCommand(0x20); // 測試實驗得知、該操作可省略
WriteCommand(0x28); // 四線操作、雙行顯示、5*8字體
WriteCommand(0x0C); // 設置顯示模式:使能顯示,關光標顯示
WriteCommand(0x01); // 清屏
Delay100us(20); // 清屏操作等待
WriteCommand(0x06); // 12
}
/********************************************************************************************************/
const uint8 st1[]=" ";
const uint8 st2[]=" P ";
const uint8 st3[]=" Po r ";
const uint8 st4[]=" Pol ar ";
const uint8 st5[]=" Pola tar ";
const uint8 st6[]=" Polar Star ";
const uint8 st7[] =" ";
const uint8 st8[] =" LK ";
const uint8 st9[] =" LPEK ";
const uint8 st10[]=" LPC-EK ";
const uint8 st11[]=" LPC2x-EK ";
const uint8 st12[]=" LPC210x-EK ";
const uint8 st13[]="Polar Star";
const uint8 st14[]="LPC210x-EK";
const uint8* sr[6]={st1,st2,st3,st4,st5,st6};
const uint8* sr2[6]={st7,st8,st9,st10,st11,st12};
/********************************************************************************************************
*
* 函數名稱:main()
*
* 功能描述:顯示字符串
*
* 入口參數:無
* 出口參數:無
*
* 全局變量: 無
* 調用模塊: 無
*
********************************************************************************************************/
int main(void)
{
int8 tmp,tmp1;
const uint8 **p1,**p2;
PowerUpInit();
while(1)
{
p1 = sr;
p2 = sr2;
for(tmp=0;tmp<6;tmp++) // 兩邊伸展顯示操作控制
{
ShowString(0,p1[tmp],16);
ShowString(0x40,p2[tmp],16);
Delay100us(3000);
WriteCommand(1);
Delay100us(40);
}
ShowString(0,p1[5],16); // 畫面定格
ShowString(0x40,p2[5],16);
Delay100us(12000);
for(tmp=5;tmp>=0;tmp--) // 中間收縮顯示操作控制
{
ShowString(0,p1[tmp],16);
ShowString(0x40,p2[tmp],16);
Delay100us(3000);
WriteCommand(1);
Delay100us(40);
}
Delay100us(12000);
tmp1 = 0x10;
for(tmp=0;tmp<0x19;tmp++) // 兩端相對運動操作控制
{
tmp1--;
ShowString(0+tmp-9,st13,9);
ShowString(0x40+tmp1,st14,9);
Delay100us(3000);
if(tmp==12) // 對齊定格操作
Delay100us(12000);
WriteCommand(1);
Delay100us(40);
}
tmp1=0;
for(tmp=0xf;tmp1<0x19;tmp--) // 兩端相對運動操作控制
{
ShowString(0+tmp,st13,9);
ShowString(0x40+tmp1-9,st14,9);
Delay100us(3000);
if(tmp==3) // 對齊定格操作
Delay100us(12000);
WriteCommand(1);
Delay100us(40);
tmp1++;
}
Delay100us(12000);
}
return(0);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -