📄 lcd_k.c
字号:
/*************************************** Copyright (c) *************************************************
*
* POLAR STAR
* 北天星国际贸易(深圳)有限公司
* http://www.po-star.com
*
*文 件 名: LCD.C
*文件描述:实现对16X2点阵液晶屏模块的显示驱动,并动态显示字符串。
* 该模块的内部芯片是HD44780。内部集成部分简单字库
*
*说 明:将跳线器JP7的所有跳线短接至LCD控制的引脚。
* 将跳线器JP6的所有跳线短接;
*
********************************************************************************************************/
#include "..\inc\config.h"
#define LCD_DATAOUT IO0DIR |= 0xF<<4;
#define LCD_DATAIN IO0DIR &=(U8)(~(0xF<<4));
#define HD44780_INPUT_SET_MASK (U8)(~(0xf<<4))
#define HD44780_OUTPUT_SET_MASK ((0x0f<<4)|(7<<24))
/********************************************************************************************************
* 函数名称:HD44780_BUS_DLY(void)
* 功能描述:延时1uS,液晶模块的基本节拍时间。
* 入口参数:无
* 出口参数:无
********************************************************************************************************/
volatile void HD44780_BUS_DLY(void)
{
U8 dly;
for(dly = 0x2E;dly>0;--dly);
}
/********************************************************************************************************
* 函数名称:Delay100us( unsigned int n_100us )
* 功能描述:延时100uS
* 入口参数:无
* 出口参数:无
********************************************************************************************************/
volatile void Delay100us( U32 arg )
{
U32 tmp;
for(;arg>0;--arg)
for(tmp=0;tmp<760;tmp++);
}
/********************************************************************************************************
* 函数名称:U8 CheckStatus(void)
* 功能描述:状态查询
* 入口参数:无
* 出口参数:U8 status 当前LCD的状态
********************************************************************************************************/
U8 CheckStatus (void)
{
U8 data;
IO0SET = LCD_RW;
IO0CLR = LCD_RS;
IO0DIR&=0XFFFFFF0F;
IO0SET = LCD_E;
data = IO0PIN & 0xF0;
HD44780_BUS_DLY();
IO0CLR = LCD_E;
HD44780_BUS_DLY();
IO0SET = LCD_E;
data |= (IO0PIN >> 4) & 0x0F;
HD44780_BUS_DLY();
IO0CLR = LCD_E;
return data;
}
/********************************************************************************************************
* 函数名称:U8 BusyCheck(void)
* 功能描述:忙查询等待
* 入口参数:无
* 出口参数:U8 status 当前LCD的状态
********************************************************************************************************/
U8 BusyCheck(void)
{
U8 status = 0;
U16 counter = 0;
do
{
status = 0x80 & CheckStatus();
if((counter++) >= 0x3F)
{
status = 1;
break;
}
}while(status);
return status;
}
/********************************************************************************************************
* 函数名称:WriteData (U8 Data)
* 功能描述:发送一个字节到LCD
* 入口参数:Data 要发送的数据
* 出口参数:无
********************************************************************************************************/
void WriteData (U8 Data)
{
IO0CLR = LCD_RW;
IO0SET = LCD_RS;
IO0DIR|=0XF0;
IO0PIN = (IO0PIN & 0xFFFFFF0F)|(Data & 0xF0); //读取高4位数据
IO0SET = LCD_E;
HD44780_BUS_DLY();
IO0CLR = LCD_E;
HD44780_BUS_DLY();
IO0PIN = (IO0PIN & 0xFFFFFF0F)|((Data<<4) & 0xF0); //读取低4位数据
IO0SET = LCD_E;
HD44780_BUS_DLY();
IO0CLR = LCD_E;
HD44780_BUS_DLY();
BusyCheck();
}
/********************************************************************************************************
* 函数名称:U8 ReadData(void)
* 功能描述:读取一个字节
* 入口参数:无
* 出口参数:data 回读的数据
********************************************************************************************************/
U8 ReadData(void)
{
U8 data;
IO0SET = LCD_RW | LCD_RS;
IO0DIR&=0XFFFFFF0F; //输入模式
IO0SET = LCD_E;
HD44780_BUS_DLY();
data = IO0PIN & 0xF0;
IO0CLR = LCD_E;
HD44780_BUS_DLY();
IO0SET = LCD_E;
HD44780_BUS_DLY();
data |= (IO0PIN >> 4)&0x0F;
return data;
}
/********************************************************************************************************
* 函数名称:WriteCommand(U8 command)
* 功能描述:发送一个字节命令
* 入口参数:U8 command 发送的命令数据
* 出口参数:无
********************************************************************************************************/
void WriteCommand (U8 Command)
{
IO0CLR = LCD_RW | LCD_RS;
IO0DIR|=0XF0;
IO0PIN = (IO0PIN & 0xFFFFFF0F) |(Command & 0xF0);
IO0SET = LCD_E;
HD44780_BUS_DLY();
IO0CLR = LCD_E;
HD44780_BUS_DLY();
IO0PIN = (IO0PIN & 0xFFFFFF0F) |((Command<<4) & 0xF0);
IO0SET = LCD_E;
HD44780_BUS_DLY();
IO0CLR = LCD_E;
HD44780_BUS_DLY();
BusyCheck();
}
/********************************************************************************************************
* 函数名称:void ShowString(U8 Addr,const U8 *Str,U8 No)
* 功能描述:显示字符串
* 入口参数:U8 Addr -- 显示DDRAM地址
* const U8 *Str -- 源字符串指针
* U8 No -- 符串长度
* 出口参数:无
********************************************************************************************************/
void ShowString(int Addr,const U8 *Str,U8 No)
{
U8 tmp=0;
while(*Str)
{
WriteCommand((Addr + tmp) | 0x80);
WriteData(*Str);
tmp++;
Str++;
}
WriteCommand(0x0C);
}
/********************************************************************************************************
* 函数名称:void ShowHex(U8 Addr,U8 Data)
* 功能描述:显示十六进制数
* 入口参数:U8 Addr -- 要显示的地址
* U8 Data -- 要显示的值
* 出口参数:无
********************************************************************************************************/
void ShowHex(int Addr,U8 Data)
{
U8 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;
IO0DIR = HD44780_OUTPUT_SET_MASK|LCD_BL; // 设置所有控制引脚为输出口
IO0SET=LCD_BL;
Delay100us(1510); // 1.等待15.1mS
//WriteCommand(0x20); // 测试实验得知、该操作可省略
WriteCommand(0x28); // 四线操作、双行显示、5*8字体
WriteCommand(0x0C); // 设置显示模式:使能显示,关光标显示
WriteCommand(0x01); // 清屏
Delay100us(16); // 清屏操作等待
WriteCommand(0x06); // 12
}
/********************************************************************************************************
* 函数名称:void PLL_Init(void)
* 功能描述:PLL上电初始化。
* 入口参数:无
* 出口参数:无
********************************************************************************************************/
void PLL_Init(void)
{
PLLCON = 1;//启动PLL时钟
#if ((Fcclk / 4) / Fpclk) == 1
VPBDIV = 0;
#endif
#if ((Fcclk / 4) / Fpclk) == 2
VPBDIV = 2;
#endif
#if ((Fcclk / 4) / Fpclk) == 4
VPBDIV = 1;
#endif
#if (Fcco / Fcclk) == 2
PLLCFG = ((Fcclk / Fosc) - 1) | (0 << 5);
#endif
#if (Fcco / Fcclk) == 4
PLLCFG = ((Fcclk / Fosc) - 1) | (1 << 5);
#endif
#if (Fcco / Fcclk) == 8
PLLCFG = ((Fcclk / Fosc) - 1) | (2 << 5);
#endif
#if (Fcco / Fcclk) == 16
PLLCFG = ((Fcclk / Fosc) - 1) | (3 << 5);
#endif
PLLFEED = 0xaa;
PLLFEED = 0x55;
while((PLLSTAT & (1 << 10)) == 0);//等待锁定
PLLCON = 3;//启用PLL时钟作为系统时钟
PLLFEED = 0xaa;
PLLFEED = 0x55;
}
/********************************************************************************************************/
const U8 st1[]=" ";
const U8 st2[]=" P ";
const U8 st3[]=" Po r ";
const U8 st4[]=" Pol ar ";
const U8 st5[]=" Pola tar ";
const U8 st6[]=" Polar Star ";
const U8 st7[] =" ";
const U8 st8[] =" LK ";
const U8 st9[] =" LPEK ";
const U8 st10[]=" LPC-EK ";
const U8 st11[]=" LPC2x-EK ";
const U8 st12[]=" LPC210x-EK ";
const U8 st13[]="Polar Star";
const U8 st14[]="LPC210x-EK";
const U8* sr[6]={st1,st2,st3,st4,st5,st6};
const U8* sr2[6]={st7,st8,st9,st10,st11,st12};
/********************************************************************************************************
* 函数名称:main()
* 功能描述:显示字符串
* 入口参数:无
* 出口参数:无
********************************************************************************************************/
void main(void)
{
U8 tmp,tmp1;
const U8 **p1,**p2;
PLL_Init();
PowerUpInit();
while(1)
{
p1 = sr;
p2 = sr2;
for(tmp=0;tmp<6;tmp++) // 两边伸展显示操作控制
{
ShowString(0,p1[tmp],16);
ShowString(0x40,p2[tmp],16);
Delay100us(800);
WriteCommand(1);
Delay100us(40);
}
ShowString(0,p1[5],16); // 画面定格
ShowString(0x40,p2[5],16);
Delay100us(6000);
for(tmp=5;tmp>0;tmp--) // 中间收缩显示操作控制
{
ShowString(0,p1[tmp],16);
ShowString(0x40,p2[tmp],16);//2nd line
Delay100us(800);
WriteCommand(1);
Delay100us(40);
}
Delay100us(2000);
tmp1 = 0x10;
for(tmp=0;tmp<0x19;tmp++) // 两端相对运动操作控制
{
tmp1--;
ShowString(0+tmp-9,st13,9);
ShowString(0x40+tmp1,st14,9);
Delay100us(800);
if(tmp==12) // 对齐定格操作
Delay100us(6000);
WriteCommand(1);
Delay100us(40);
}
tmp1=0;
for(tmp=0xf;tmp1<0x19;tmp--) // 两端相对运动操作控制
{
ShowString(0+tmp,st13,9);
ShowString(0x40+tmp1-9,st14,9);
Delay100us(800);
if(tmp==3) // 对齐定格操作
Delay100us(6000);
WriteCommand(1);
Delay100us(40);
tmp1++;
}
Delay100us(12000);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -