⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd1602.c

📁 应用于ARM单片机的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 + -