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

📄 lcd1602.c

📁 cortex-m0 LCD1602程序
💻 C
字号:
/*********************淘宝:http://quanmao.taobao.com **************************
程序名:    LCD1602.C
编写人:    李全茂 
编写时间:  2010年7月15日
硬件支持:  WJ-4.0开发板,单片机M0516,通过跳线连接
接口说明:  
修改日志:  
  NO.1-     移植到新塘的M0516上
*******************************************************************************
说明:
*****************技术论坛:http://www.wang1jin.com/bbs*************************/
#include "LCD1602.H"
//#include "M051Series.h"
#include "NUC1xx.h"
#include "DrvGPIO.h"

/*******************************************************************************
// 引脚定义 // (使用者根据实际更改)
******************************************************************************/
#define LCD_DB_Port E_GPA

//#define LCD_Ctr_Port E_PORT1
//#define LCD_PW_GND E_GPE,5,E_IO_OUTPUT	//接LCD1602 VSSPin,需要强制输出0,做GND用

#define LCD_RS 	 E_GPC,15
#define LCD_RW	 E_GPC,6
#define LCD_EN	 E_GPC,7

#define	LCD_POWER_ON	DrvGPIO_ClrBit(E_GPE,5);	  //接LCD1602 VSSPin,需要强制输出0,做GND用
#define 	LCD_VO_Adj		DrvGPIO_ClrBit(E_GPC,14); //对比度调节

#define 	LCD_RS_Data		DrvGPIO_SetBit(LCD_RS);	// 数据寄存器
#define	LCD_RS_Reg		DrvGPIO_ClrBit(LCD_RS);  // 指令寄存器

#define	LCD_RW_Read		DrvGPIO_SetBit(LCD_RW);	// 读
#define	LCD_RW_Write		DrvGPIO_ClrBit(LCD_RW);	// 写

#define	LCD_EN_Set		DrvGPIO_SetBit(E_GPC,7);	// 高
#define	LCD_EN_Clr		DrvGPIO_ClrBit(E_GPC,7);	// 低 

//sbit	LCD_RS = P1^0;		//寄存器选择:1 数据;0 指令
//sbit 	LCD_RW = P1^1;		//读写选择:1 读;0 写
//sbit 	LCD_EN = P1^2;		//使能,读时为高电平,写时为高脉冲
//sbit	LCD_Bsy= P0^7;		//LCD DB7为忙检测端,1为忙,0为空闲
/*******************************************************************************
// 定义LCD1602指令集 // (详细请见技术手册)
******************************************************************************/
#define			CMD_clear		0x01             // 清除屏幕
#define			CMD_back		0x02             // DDRAM回零位
#define			CMD_dec1		0x04             // 读入后AC(指针)减1,向左写
#define			CMD_add1		0x06             // 读入后AC(指针)加1,向右写
#define			CMD_dis_gb1		0x0f             // 开显示_开光标_开光标闪烁
#define			CMD_dis_gb2		0x0e             // 开显示_开光标_关光标闪烁
#define			CMD_dis_gb3		0x0c             // 开显示_关光标_关光标闪烁
#define			CMD_OFF_dis		0x08             // 关显示_关光标_关光标闪烁
#define			CMD_set82		0x38             // 8位总线_2行显示

/*============================================================
液晶指令说明:
0x01-------------->清除屏幕,置AC为0,光标回位。
0x02-------------->DDRAM 地址为0,显示回原位,DDRAM内容不变.
0x03-------------->DDRAM 地址为0,显示回原位,DDRAM内容不变.
**********MODE指令************
0x04-------------->设置光标移动方向减量方式,并指定显示不移动。
0x05-------------->设置光标移动方向减量方式,并指定显示移动。
0x06-------------->设置光标移动方向增量方式,并指定显示不移动。
0x07-------------->设置光标移动方向增量方式,并指定显示移动。
**********DSPOFF指令************
0x08-------------->设置显示关、光标关、光标所在字符不闪烁.
**********DSPON指令************
0x0c-------------->显示开
0x0e-------------->显示开,光标开
0x0f-------------->显示开,光标开,光标闪烁
0x10-------------->光标移位,左移
0x14-------------->光标移位,右移
0x18-------------->显示移位,左移
0x1c-------------->显示移位,右移
**********INIT指令************
0x20-------------->4BIT模式,显示一行,5x7字体
0x24-------------->4BIT模式,显示一行,5x10字体
0x28-------------->4BIT模式,显示两行,5x7字体
0x2c-------------->4BIT模式,显示两行,5x10字体
0x30-------------->8BIT模式,显示一行,5x7字体
0x34-------------->8BIT模式,显示一行,5x10字体
0x38-------------->8BIT模式,显示两行,5x7字体
0x3c-------------->8BIT模式,显示两行,5x10字体
============================================================*/



unsigned char Table[] = {0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00   // 日
};
static void LCD_GPIO_Init()
{
	//DrvGPIO_Open(LCD_PW_GND); 	// 1602上电
	LCD_POWER_ON;
	LCD_VO_Adj;
}

void delaynms(unsigned char n)
{
 	unsigned char i,j;
	unsigned int  k;
  	i=2;							//主频多少i就多少
									//延时用这个很无奈,不同的系统有不同的方法
									//好在只有初始化时使用,对系统影响不大
	for(;i>0;i--)
	   {
	     for(j=0;j<n;j++)
	      {
	        for(k=0;k<980;k++);
	      }
	   }
}

/**********************************************************************
延时
**********************************************************************/
void delay_nus(unsigned int t)
{
 unsigned int i=0;
 while(t--)
   {
    for(i=0;i<1;i++);
    }
}

/*******************************************************************************
描  述:忙检测 ,直到空闲时退出
参  数:无
返回值:无
备  注:LCD1602 DB7为1是,LCD1602忙,否则空闲。
******************************************************************************/
static void Checkbsy()
{
    unsigned char temp;
    do{
        temp = ReadRegister(Com_Reg);
    }while(temp & 0x80);

//	LCD_RS = Com_Reg;
//	LCD_RW = READ;
//	LCD_DB = 0xff;	 //通过往端口写1,使单片机进入读模式
//	LCD_EN = 1;
//	while(LCD_Bsy);	 //等到LCD1602空闲时退出
//	LCD_EN = 0;
}
/*******************************************************************************
描  述:写寄存器
参  数:_Register 要操作的寄存器(Com_reg 指令寄存器,Data_Reg 数据寄存器)
		_Data 要写入的数据
返回值:无
备  注:
******************************************************************************/
static void WriteRegister(unsigned char _Register,int32_t _Data)
{
	Checkbsy();

	if(_Register != Data_Reg){
		LCD_RS_Reg;
	}else{
		LCD_RS_Data;
	}
//	delay_nus(2);
	LCD_RW_Write;
//	delay_nus(2); 	
	// LCD_RS = _Register;
	// LCD_RW = WRITE;
	// LCD_EN = 1;

	DrvGPIO_SetPortBits(LCD_DB_Port,_Data<<2);
	LCD_EN_Set;
	//delay_nus(2);
//	delay_nus(2);
	//LCD_DB = _Data;		//送数据
	//LCD_EN = 0;
	LCD_EN_Clr;	
}

/*******************************************************************************
描  述:写CGROM
参  数:_len 要写入crgrom区的数据长度,_len最大为64
返回值:无
备  注:将预先定义好的字模写入cgram
******************************************************************************/
void CgramWrite(unsigned char _len)
{
	unsigned char i;
	WriteRegister(Com_Reg,0x06);	// 设置cgrom地址自动加1
	WriteRegister(Com_Reg,0x40);	// cgrom 起始地址
	for(i=0;i<_len;i++)
	{
		WriteRegister(Data_Reg,Table[i]); // 按数组写入数据
	}
}

/*******************************************************************************
描  述:初始化LCD1602
参  数:
返回值:
备  注:8位2行显示,显示光标,闪烁
*******************************************************************************/
void LCD1602_Init(void)
{
	LCD_GPIO_Init();
	delaynms(15);
	WriteRegister(Com_Reg,CMD_set82);//8位点阵模式
	//delaynms(150);
	WriteRegister(Com_Reg,CMD_set82);
	//delaynms(150);
	WriteRegister(Com_Reg,CMD_set82);//8位点阵模式
	//delaynms(150);
	WriteRegister(Com_Reg,CMD_set82);//8位点阵模式 
	WriteRegister(Com_Reg,CMD_clear);// 清屏
	delaynms(15);
	WriteRegister(Com_Reg,CMD_dis_gb1);// 开显示,显示光标,闪烁
	CgramWrite(8);	
	WriteRegister(Com_Reg,CMD_clear);// 清屏
	delaynms(15);
}

/*******************************************************************************
描  述:设置显示位置
参  数:x 列, y 行
返回值:
备  注:x和y均从0开始,y最大为1
*******************************************************************************/
static void LCD1602_SetXY(unsigned char x,unsigned char y)
{
	if(y == 0)
	{
		WriteRegister(Com_Reg,0x80+x);	// 第一行
	}else{
		WriteRegister(Com_Reg,0xC0+x);	// 第二行
	}
}

/*******************************************************************************
描  述:在指定位置显示一个字符
参  数:x 列, y 行 ,Data为要显示的字符
返回值:
备  注:x和y均从0开始,y最大为1
*******************************************************************************/
void LCD1602_WriteByte(unsigned char x,unsigned char y,unsigned char Data)
{
	LCD1602_SetXY(x,y);	// 设置地址
	WriteRegister(Data_Reg,Data); // 将要显示的字符写入数据寄存器
}

/*******************************************************************************
描  述:从指定位置开始显示字符串
参  数:x 列, y 行 ,*String为要显示的字符串
返回值:
备  注:x和y均从0开始,y最大为1
*******************************************************************************/
void LCD1602_WriteString(unsigned char x,unsigned char y,unsigned char *String)
{
	LCD1602_SetXY(x,y);
	while(*String)	// 判断是否已经写完
	{
		WriteRegister(Data_Reg,*String++); // 写入当前指向的字符,并将指针指向下一个字符
	}
}

/*******************************************************************************
描  述:读寄存器
参  数:_Register 要操作的寄存器(Com_reg 指令寄存器,Data_Reg 数据寄存器)
返回值:数据寄存器或指令寄存器的内容
备  注:
******************************************************************************/
unsigned char ReadRegister(unsigned char _Register)
{
	int32_t Data; //声明一个变量,用来保存从lcd1602读取到的值
    int32_t temp;
	if(_Register != Data_Reg){
		LCD_RS_Reg;
	}else{
		LCD_RS_Data;
	}
	//delay_nus(2);
	LCD_RW_Read;
	delay_nus(2);
	// LCD_RS = _Register;
	// LCD_RW = READ;
	//DrvGPIO_SetPortBits(LCD_DB_Port,0xff);
	//LCD_DB = 0xff;	 //通过往端口写1,使单片机进入读模式
	//LCD_EN = 1;
	LCD_EN_Set;
	delay_nus(2);
	Data = DrvGPIO_GetPortBits(LCD_DB_Port);
	//delay_nus(2);
	LCD_EN_Clr;
	//delay_nus(2);
    temp=Data>>2;
	return (int8_t)(Data>>2);	//返回到的值
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -