📄 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 + -