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

📄 lcd_1602.h

📁 基于MSP430F149的1602液晶显示驱动程序
💻 H
字号:
/**************************Designed by 徐节涛************************************/
/******************************二院科协******************************************/
/********************************************************************************/

#ifndef LCD1602
#define LCD1602

 	#include <msp430x14x.H>
	//#include <intrinsics.h>
	
	#define BYTE unsigned char 
	#define WORD unsigned int
	#define uchar unsigned char
	#define uint unsigned int

/*DDRAM显示数据RAM,     CGRAM字符生成RAM,  AC用于DD和CGRAM地址的地址计数器*/
/////////////////////////////////////////////////////////////////////////////////////////
	/* 液晶管脚连线 */

        #define LCDRS  BIT7	                                                // 寄存器选择 1:数据;0:指令
	#define LCDRW  BIT6	                                                // 读写操作选择  1:读;0:写
	#define LCDE  BIT5	                                                // 使能信号		下降沿处理任务
        #define DATAPORT  P2OUT                                                 //更改指令控制位,则相应的数据或指令控制位要改变 
        #define COMMANDPORT  P1OUT
        #define DATADIRECTION P2DIR
        #define COMMANDDIRECTION  P1DIR

//////////////////////////////////////////////////////////////////////////////////////////

	void LCDDelay(WORD count);            		// 时间延迟
	void Wait();                          		// 等待函数

	void WriteLCD(BYTE style, BYTE input);   	// 向LCD写入命令或数据
			/* style取值 */
		#define COMMAND 		0x00			        // 指令操作
		#define DATA 			0x80		                // 数据操作

			/* 衍生的函数 */
		#define PutChar(x) 	 WriteLCD(DATA,x) 	                //宏定义

///////////////////////////////////////////////////////////////////////////////////////////
			/*编译预处理函数*/
	void PrintString(BYTE *s);					        // 显示字符串 s为指向字符串的指针

	void ClearScreen();   				// 清DDRAM和AC值
			/*L L L L L L L H */
		#define CLEAR_SCREEN	0x01      		                // 清屏.置AC为0

	void BackHome();
			/*L L L L L L H × */				        //设DDRAM地址为零,显示回原位,DDRAM内容不变
		#define HOMING  		0x02      		        // 光标返回原点

	void SetDisplay(BYTE DisplayMode);    		// 设置显示模式
			/* L L L L H D C B */
		#define SHOW			0x04      		        //D整体显示开关
		#define HIDE			0x00      		        // default	  

		#define CURSOR			0x02 			        //C光标显示开关
		#define NO_CURSOR		0x00      		        // default		     

		#define FLASH			0x01      		        //B光标闪动
		#define NO_FLASH		0x00      		        // 光标不闪
		 

	void SetInput(BYTE InputMode);        		// 设置输入模式
			/* L L L L L H I/D S */
		#define AC_UP			0x02			        //光标及地址自加
		#define AC_DOWN			0x00     	 	        //光标及地址自减

		#define MOVE			0x01      		        //画面可平移
		#define NO_MOVE			0x00      		        //画面不可移动
		
/************************************************************************/
//	void Move(BYTE object, BYTE direction); 	// 移动光标或屏幕 
			/* L L L H S/C R/L × × */
//		#define CURSOR_MOVE		0x08			        //S/C光标平移
//		#define SCREEN_MOVE		0x00			        //S/C画面平移
			
//		#define LEFT			0x00			        //R/L左移
//		#define RIGHT			0x04			        //R/L右移
							  
/*************************************************************************/
	void SetFunction(BYTE FUNCTION);		// 功能设置
			/* L L H DL N F × × */
		#define EIGHT		0x10				        // 8位数据接口
		#define FOUR		0x00				        // 4位数据接口

		#define DOUBLE		0x08				        // 两行显示
		#define ALONE		0x00				        // 一行显示

		#define	LARGE		0x04				        // 5*10点阵显示
		#define	SMALL		0x00				        // 5*7点阵显示
		

	void GotoXY(BYTE X, BYTE Y); 			// 跳到LCD的某个坐标点
	
	void LCD_Initial();             		// 液晶初始化函数

	
/******************** 以下是具体的函数实现 *********************************/

/********************* 软件延时 1*m毫秒 ************************************/

	void LCDDelay(WORD count)
		{
			uchar i, j, k;
			for(k=count; k>0; k--)
				for(i=2; i>0; i--)
					for(j=248; j>0; j--);
		}

/********************* 等待写操作结束函数 ***********************************/

	void Wait()                                                             //建议不用,很不好用
		{
			uchar ntemp;
                        DATADIRECTION=0;
                        COMMANDPORT &= ~LCDRS;
			COMMANDPORT |= LCDRW;   _NOP();
			COMMANDPORT |= LCDE;    _NOP();				
			LCDDelay(10);
                        do
				{
				     ntemp=P2IN;	                        //
                                     ntemp>>=7;                                 // 读忙标志和AC码时,LCDE高电平
				}
			while(ntemp == 1);					// 写操作忙,等待
                        
			      COMMANDPORT |= ~LCDE; 
                              DATADIRECTION=0XFF;			       
		}

/**********************写命令或数据*******************************************/

	void WriteLCD(uchar style, uchar input)					// 向LCD写入命令或数据
		{	
                       if(style==0x00)
			  COMMANDPORT = style;					//style:1:指令;0:数据
                        else COMMANDPORT |= style;
                        
			COMMANDPORT &= ~LCDRW;	        _NOP();
			COMMANDPORT |= LCDE; 	        _NOP();			// LCDE下降沿写入
			DATAPORT = input;	        _NOP();                        
			COMMANDPORT &= ~LCDE;	        _NOP();
                        LCDDelay(1);	
                       // Wait();		                                //忙处理函数不好用
		}

/***********************字符串处理函数*****************************************/

	void PrintString(uchar *s)
		{	
			while(*s != '\0')
				{
					WriteLCD(DATA, *s);
					s++;
				}
		}
/************************指定位置固定整型数据显示*******显示起始位置固定*******/
        
        void PrintInt(unsigned long int num)
                {
                        unsigned char i=0,j=0,k,flag;
			unsigned long int temp,temp1=1;
			temp=num;
                        if(temp!=0)
                          {
			      while(temp!=0)			
				{
					temp=temp/10;										
					i++;				
				}			
			      temp=num;
			      for(j=i;j>1;j--)
				{ 
                                        for(k=j;k>1;k--)
                                            {temp1=temp1*10;}
					  flag=temp/temp1;					  
					  temp=temp%temp1;
                                          temp1=1;
                                        WriteLCD(DATA,flag+'0');					
				}
                              WriteLCD(DATA,temp+'0');
                          }
                        else WriteLCD(DATA,temp+'0');                          
                }
        
/*************************变化整型数据显示******显示结束位置固定***************/
        
        void PrintIntUndefine(unsigned long int input)
                {
                        unsigned char i=0,j=0,flag;
			unsigned long int temp;
			temp=input;
                        SetInput(AC_DOWN | NO_MOVE);
                        if(temp!=0)
                          {
			      while(temp!=0)			
				{
					temp=temp/10;										
					i++;				
				}			
			      temp=input;
			      for(j=i;j>1;j--)
				{ 
                                          flag=temp%10;					  
					  temp=temp/10;                                          
                                        WriteLCD(DATA,flag+'0');					
				}
                              WriteLCD(DATA,temp+'0');
                          }
                        else WriteLCD(DATA,temp+'0');
                        SetInput(AC_UP | NO_MOVE);
                }
/************************清除RAM和地址数据*************************************/

	void ClearScreen()							// 清DDRAM和AC值
		{	
			WriteLCD(COMMAND, CLEAR_SCREEN);
		}

/************************光标复位**********************************************/

	void BackHome()								// AC=0,光标和画面回HOME位置
		{
			WriteLCD(COMMAND, HOMING);
		}
/************************输入模式设置******************************************/

	void SetInput(uchar InputMode)						// 设置输入方式
		{	
		
			WriteLCD(COMMAND, 0x04|InputMode);
		}

/*************************显示设置*********************************************/

	void SetDisplay(uchar DisplayMode)					// 显示开关控制
		{
		
			WriteLCD(COMMAND, 0x08|DisplayMode);
		}

/**************************光标、画面设置***************************************/
/*	
	void Move(BYTE object, BYTE direction)					// 光标、画面移动,不影响DDRAM
		{

			if(object==CURSOR_MOVE)
				WriteLCD(COMMAND,0x10|direction);
			if(object==SCREEN_MOVE)
				WriteLCD(COMMAND,0x18|direction);
		}
 */
/***************************功能设置*********************************************/

	void SetFunction(uchar FUNCTION)					// 功能设置
		{
		
			WriteLCD(COMMAND, 0x20|FUNCTION);
		}

/****************************显示地址设置****************************************/

	void GotoXY(uchar X, uchar Y)						// 跳到LCD的某个坐标点
		{
			if(Y == 0)						// 第一行
				WriteLCD(COMMAND, 0x80|X);
			if(Y == 1)						// 第二行
				WriteLCD(COMMAND, 0x80|(X-0x40));		//加或减0x40一样
		}

/****************************初始化函数******************************************/
				/*初始化程序, 必须按照产品资料介绍的初始化过程进行*/
	void LCD_Initial()              					// 液晶初始化函数
	    {
    		COMMANDDIRECTION=0XFF;
                DATADIRECTION=0XFF;
                COMMANDPORT=0X00;
                DATAPORT=0X00;
    		LCDDelay(80);
    			SetFunction(EIGHT | DOUBLE | SMALL);    	        // 8位数据口,两行显示,5*7点阵
    		LCDDelay(10);
    			SetFunction(EIGHT | DOUBLE | SMALL);
    		LCDDelay(10);
    			SetFunction(EIGHT | DOUBLE | SMALL);
					
    			SetDisplay(SHOW |NO_CURSOR | NO_FLASH);    	        // 开显示,无光标

    			SetInput(AC_UP | NO_MOVE);      			// AC自动增一,画面不动
	    
			//	Move(CURSOR_MOVE,RIGHT);

    			ClearScreen();      					// 清屏
			BackHome();                        
	    }
#endif

⌨️ 快捷键说明

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