原创 C51 1602液晶模块头文件

2008-12-13 21:31 3583 2 2 分类: MCU/ 嵌入式

1.写端口等待采取延时的方式
#ifndef LCD1602


#include <intrins.h>


/**********************************端口定义***********************************/
sbit LcdRs  = P2^4;
sbit LcdRw  = P2^5;
sbit LcdEn   = P2^6;
sbit LcdCs      = P2^3;
sfr  DBPort  = 0x80;  //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口



/*********************************延时子函数***********************************/
void Delay_1ms(unsigned int k)
{
 unsigned char i;
 while(k--)
  {
   for(i=0;i<125;i++);
  }
}
/****************************向LCD写入命令或数据******************************/
#define LCD_COMMAND   0      // 选择命令寄存器(RS)
#define LCD_DATA   1      // 选择数据寄存器
#define LCD_CLEAR_SCREEN 0x01   // 清屏
#define LCD_HOMING    0x02   // 光标返回原点
void LCD_Write(bit style, unsigned char input)
{
 DBPort=input;
 LcdCs=0;
 LcdRs=style;
 LcdRw=0;  
 LcdEn=0;  
 Delay_1ms(1);
 LcdEn=1;
 LcdCs=1;   
}
//*******************************设置显示模式**********************************/
#define LCD_SHOW   0x04    //显示开
#define LCD_HIDE   0x00    //显示关  


#define LCD_CURSOR   0x02  //显示光标
#define LCD_NO_CURSOR  0x00    //无光标      


#define LCD_FLASH   0x01    //光标闪动
#define LCD_NO_FLASH  0x00    //光标不闪动


void LCD_SetDisplay(unsigned char DisplayMode)
{
 LCD_Write(LCD_COMMAND, 0x08|DisplayMode); 
}


//*******************************设置输入模式**********************************/
#define LCD_AC_UP   0x02     //右移
#define LCD_AC_DOWN   0x00     //左移


#define LCD_MOVE   0x01     //移动有效
#define LCD_NO_MOVE   0x00     //移动无效


void LCD_SetInput(unsigned char InputMode)
{
 LCD_Write(LCD_COMMAND, 0x04|InputMode);
}


//********************************初始化LCD************************************/
void LCD_Initial()
{
 LcdEn=0;
 LCD_Write(LCD_COMMAND,0x38);            //8位数据端口,2行显示,5*7点阵
 LCD_Write(LCD_COMMAND,0x38);
 LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标
 //LCD_SetDisplay(LCD_HIDE);             //关闭显示
 LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);//清屏
 LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);    //右移,移动无效
}


//********************************定位显示地址*********************************/
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(unsigned char *str)
{
 while(*str!='\0')
  {
   LCD_Write(LCD_DATA,*str);
   str++;
  }
}
#endif


2.写端口等待采取采取忙标志位的方式


/*****************************************************************************/ 
#ifndef LCD1602


#include <intrins.h>


/**********************************端口定义***********************************/
sbit LcdRs  = P2^4;
sbit LcdRw  = P2^5;
sbit LcdEn   = P2^6;
sbit LcdCs      = P2^3;
sfr  DBPort  = 0x80;  //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口


/*******************************内部等待函数*********************************/
unsigned char LCD_Wait(void)
{
 LcdRs=0;//读忙信号
 LcdRw=1; _nop_();
 LcdEn=1; _nop_();
 while(DBPort&0x80);//忙,等待
 LcdEn=0;//EN由1-->0,数据写入
 return DBPort;       
}
/****************************向LCD写入命令或数据*****************************/
#define LCD_COMMAND   0      // 选择命令寄存器(RS)
#define LCD_DATA   1      // 选择数据寄存器
#define LCD_CLEAR_SCREEN 0x01   // 清屏
#define LCD_HOMING    0x02   // 光标返回原点
void LCD_Write(bit style, unsigned char input)
{
 LcdEn=0;
 LcdRs=style;
 LcdRw=0;  _nop_();
 DBPort=input; _nop_();
 LcdCs=0;
 LcdEn=1;  _nop_();
 LcdEn=0;  _nop_();
 LCD_Wait();
 LcdCs=1; 
}
/****************************向LCD写入命令或数据******************************/
#define LCD_COMMAND   0      // 选择命令寄存器(RS)
#define LCD_DATA   1      // 选择数据寄存器
#define LCD_CLEAR_SCREEN 0x01   // 清屏
#define LCD_HOMING    0x02   // 光标返回原点
void LCD_Write(bit style, unsigned char input)
{
 DBPort=input;
 LcdCs=0;
 LcdRs=style;
 LcdRw=0;  
 LcdEn=0;  
 Delay_1ms(1);
 LcdEn=1;
 LcdCs=1;   
}
//*******************************设置显示模式**********************************/
#define LCD_SHOW   0x04    //显示开
#define LCD_HIDE   0x00    //显示关  


#define LCD_CURSOR   0x02  //显示光标
#define LCD_NO_CURSOR  0x00    //无光标      


#define LCD_FLASH   0x01    //光标闪动
#define LCD_NO_FLASH  0x00    //光标不闪动


void LCD_SetDisplay(unsigned char DisplayMode)
{
 LCD_Write(LCD_COMMAND, 0x08|DisplayMode); 
}


//*******************************设置输入模式**********************************/
#define LCD_AC_UP   0x02     //右移
#define LCD_AC_DOWN   0x00     //左移


#define LCD_MOVE   0x01     //移动有效
#define LCD_NO_MOVE   0x00     //移动无效


void LCD_SetInput(unsigned char InputMode)
{
 LCD_Write(LCD_COMMAND, 0x04|InputMode);
}


//********************************初始化LCD************************************/
void LCD_Initial()
{
 LcdEn=0;
 LCD_Write(LCD_COMMAND,0x38);            //8位数据端口,2行显示,5*7点阵
 LCD_Write(LCD_COMMAND,0x38);
 LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标
 //LCD_SetDisplay(LCD_HIDE);             //关闭显示
 LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);//清屏
 LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);    //右移,移动无效
}


//********************************定位显示地址*********************************/
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(unsigned char *str)
{
 while(*str!='\0')
  {
   LCD_Write(LCD_DATA,*str);
   str++;
  }
}
#endif

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
2
关闭 站长推荐上一条 /3 下一条