📄 lcd1602.c
字号:
/**********************************************************
成都模数科技
http://www.moshukeji.com
文 件 名: main.c
修改时间: 2007-09-14
版 本 号: v1.00
功能描述:
***********************************************************/
#include "config.h"
#define RS 0x00000800 //P0.11
#define RW 0x00001000 //P0.12
#define E 0x00002000 //P0.13
#define D 0x00FF0000 //P0.16-P0.23
//模拟总线--------------------------------------------
/****************************************************************************
* 名称:void LCDIO_init(void)
* 功能:设置LCD所使用的IO口
* 入口参数:无
* 出口参数:无
****************************************************************************/
void LCDIO_init(void)
{
PINSEL0 &= 0xF03FFFFF; //设置管脚连接GPIO,RS, RW, E
PINSEL1 &= 0xFFFF0000; //D0-D7
IODIR|=RS|RW|E|D;//输出方向设置
}
/****************************************************************************
* 名称:DelayNS()
* 功能:软件延时
* 入口参数:dly 延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
void DelayNS(uint32 dly)
{ uint32 i;
for(; dly>0; dly--)
for(i=0; i<5000; i++);
}
/******************************************************
* 名称:void LCD_RS(uint8 i)
* 功能:RS赋值函数
* 入口参数:i - '0'或'1'
* 出口参数:无
******************************************************/
void LCD_RS(uint8 i)
{
if(i==0) IOCLR=RS;
else IOSET=RS;
}
/***************************************
* 名称:void LCD_RW(uint8 i)
* 功能:RW赋值函数
* 入口参数:i - '0'或'1'
* 出口参数:无
***************************************/
void LCD_RW(uint8 i)
{
if(i==0) IOCLR=RW;
else IOSET=RW;
}
/***************************************
* 名称:void LCD_E(uint8 i)
* 功能:E赋值函数
* 入口参数:i - '0'或'1'
* 出口参数:无
***************************************/
void LCD_E(uint8 i)
{
if(i==0) IOCLR=E;
else IOSET=E;
}
/***************************************
* 名称:void LCD_D_Write(uint32 Data)
* 功能:写数据总线
* 入口参数:Data - LCD的数据总线
* 出口参数:无
***************************************/
void LCD_D_Write(uint32 Data)
{
IODIR|=D;
IOSET = Data << 16;
Data = ~Data;
IOCLR = Data << 16;
}
/***************************************
* 名称:uint8 LCD_D_Read(void)
* 功能:读数据总线
* 入口参数:无
* 出口参数:LCD数据总线上的数据
***************************************/
uint8 LCD_D_Read(void)
{
uint8 Data;
IODIR&=(~D);
Data=(uint8)(IOPIN>>16);
return(Data);
}
/***************************************
* 名称:void LCD_NOP(uint32 i)
* 功能:短延时
* 入口参数:i-设置延时时间
* 出口参数:无
***************************************/
void LCD_NOP(uint32 i)
{
for(;i>0;i--);
}
//LCD控制函数------------------------------------
/***************************************
* 名称:void LCD_Wait(void)
* 功能:查询LCD忙标志
* 入口参数:无
* 出口参数:无
***************************************/
void LCD_Wait(void)
{
LCD_RS(0);//RS输出'0'
LCD_RW(1);//RW输出'1'
LCD_NOP(11);//短延时
LCD_E(0); //E输出'0'
LCD_NOP(11);//短延时
LCD_E(1);//执行
while(0x80&LCD_D_Read());//读忙标志
}
/***************************************
* 名称:void LCD_Write(uint8 RSStyle, uint32 input)
* 功能:向LCD写入命令或数据
* 入口参数:RSStyle - '0' 命令,'1'数据
input - 命令字或数据
* 出口参数:无
***************************************/
void LCD_Write(uint8 RSStyle, uint32 input)
{
LCD_E(0);
LCD_RS(RSStyle);
LCD_RW(0);LCD_NOP(11);
LCD_D_Write(input);LCD_NOP(11);
LCD_E(1);LCD_NOP(11);
LCD_E(0);LCD_NOP(11);
LCD_Wait();LCD_NOP(11);
}
/***************************************
* 名称:void LCD_SetDisplay(uint8 DisplayMode)
* 功能:设置显示模式
* 入口参数:DisplayMode
LCD_SHOW 0x04 //显示开
LCD_HIDE 0x00 //显示关
LCD_CURSOR 0x02 //显示光标
LCD_NO_CURSOR 0x00 //无光标
LCD_FLASH 0x01 //光标闪动
LCD_NO_FLASH 0x00 //光标不闪动
* 出口参数:无
***************************************/
void LCD_SetDisplay(uint8 DisplayMode)
{
LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
LCD_NOP(11);
}
/***************************************
* 名称:void LCD_SetInput(uint8 InputMode)
* 功能:设置输入模式
* 入口参数:InputMode
LCD_AC_UP 0x02
LCD_AC_DOWN 0x00 // default
LCD_MOVE 0x01 // 画面可平移
LCD_NO_MOVE 0x00 //default
* 出口参数:无
***************************************/
void LCD_SetInput(uint8 InputMode)
{
LCD_Write(LCD_COMMAND, 0x04|InputMode);LCD_NOP(11);
}
/***************************************
* 名称:void LCD_Move(unsigned char object, unsigned char direction)
* 功能:移动光标或屏幕
* 入口参数:object - 对象设置: 屏幕或光标
direction - 方向:左或右
* 出口参数:无
***************************************/
void LCD_Move(unsigned char object, unsigned char direction)
{
if(object==LCD_CURSOR)
LCD_Write(LCD_COMMAND,0x10|direction);
if(object==LCD_SCREEN)
LCD_Write(LCD_COMMAND,0x18|direction);
}
/***************************************
* 名称:void LCD_Initial(void)
* 功能:初始化LCD
* 入口参数:无
* 出口参数:无
***************************************/
void LCD_Initial(void)
{
LCDIO_init();
LCD_NOP(11);
LCD_E(0);
LCD_NOP(11);
LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵
LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵
LCD_Write(LCD_COMMAND,0x0F); //开显示,开光标,光标闪烁
LCD_Write(LCD_COMMAND,0x02); //光标复位到地址0 ,AC递增
LCD_Write(LCD_COMMAND,0x1); //清显示
}
/***************************************
* 名称:void GotoXY(unsigned char x, unsigned char y)
* 功能:设置光标位置
* 入口参数:x - x坐标:0-15,y坐标:0-1
* 出口参数:无
***************************************/
void GotoXY(unsigned char x, unsigned char y)
{
if(y==0) LCD_Write(LCD_COMMAND,0x80|x);
if(y==1) LCD_Write(LCD_COMMAND,0x80|(x+0x40));
}
/***************************************
* 名称:void Print(uint8 *str)
* 功能:打印字符
* 入口参数:*str - 字符指针
* 出口参数:无
***************************************/
void Print(uint8 *str)
{
uint8 i=0;
while(*str!='\0')
{
LCD_Write(LCD_DATA,*str);
str++;
i++;
if(i==16)
{
GotoXY(0,1);
}
}
}
//----------------- end file -------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -