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

📄 lcd1602.c

📁 用键盘来输入电压或电流。实现恒流
💻 C
字号:
/***************************************************
* LCM1602驱动函数
* 文件名;LCD1602.c
* 硬 件:LCM1602
* 时 钟:16MHz
* 2008-3-10
* WeiJ
* 主要功能 驱动LCM1602 
* 1602LCM接口
   P0.7-D7(BF)
   P0.6-D6
   P0.5-D5
   P0.4-D4
   P0.3-e
   P0.2-rw
   P0.1-rs
***************************************************/
sbit LCD_RS = P2^1;
sbit LCD_RW = P2^2;
sbit LCD_EN = P2^3;

#define LCD_DATA_PORT  P2


const unsigned char num[16]="0123456789ABCDEF";

/************************************************************************
* 名称          :void lcmDelay(unsigned long i)
* 功能          :为LCD设定一个延时
* 输入          :NULL
* 全局变量      :NULL  
* 返回值        :无
* 调用          :NULL
* 编写日期      :2008-2-29 
* 最后修改日期  :2008-2-29 
************************************************************************/
void lcmDelay(unsigned long i)
{
  unsigned int a;
  for(a=0;a<i;a++);
}
 
/************************************************************************
* 名称          :uchar readBusy
* 功能          :读忙,检查LCD1602内部是否正在执行操作
* 输入          :NULL
* 全局变量      :NULL  
* 返回值        :NULL
* 调用          :NULL
* 编写日期      :2008-2-29 
* 最后修改日期  :2008-2-29 
************************************************************************/
void readBusy(void)
{ 
  //_delay_ms(1000);//直接用延时代替读忙以防LCM出错导致的死机
  //return;

  lcmDelay(100);
 
  LCD_RS = 0;     //RS=0
  LCD_RW = 1;     //RW=1 
  LCD_EN = 1;     //EN=1 

  lcmDelay(20);
  while ( LCD_DATA_PORT  & 0x80) lcmDelay(20);
  
  LCD_EN =  0;     //EN=0 
  LCD_RW =  0;     //RW=0   
  LCD_RS =  0;     //RS=0

}

/*********************************************************
* 名称          :void writeByteLCD(uchar cmd;uchar dataOrCmd)
* 功能          :写命令到LCD,指令格式:EN=1 RS=0 RW=0
                  写数据到LCD,数据格式:EN=1 RS=1 RW=0
                  cmd = 1:写指令 cmd = 0:写数据
* 输入          :uchar dataOrCmd,要显示的数据或要控制LCD的命令
* 全局变量      :NULL  
* 返回值        :NULL
* 调用          :NULL
* 编写日期      :2008-2-29 
* 最后修改日期  :2008-2-29 
*********************************************************/
void writeByteLCD(uchar cmd,uchar dataOrCmd) //写入命令
{
   //_delay_us(500);             //用延时代替读忙 
   readBusy();
   
   lcmDelay(20);
   if( cmd )
   {
     LCD_RS = 0;     //RS=0,指令
   }
   else
   {
     LCD_RS = 1;     //RS=1,数据
   }

   LCD_EN = 0;     //EN=0 
   LCD_RW = 0;     //RW=0  
   
   LCD_DATA_PORT &= 0X0F;           //portc4~7=0,先清零数据口
   LCD_DATA_PORT |= dataOrCmd&0xF0; //send high 4bit
   LCD_EN = 1;                      //EN端产生一个由低电平变高电平,写LCD
   LCD_EN = 0;                      //EN端产生一个由高电平变低电平,为写低四位数据做准备
  
   LCD_DATA_PORT &= 0X0F;                //portc4~7=0,先清零数据口
   LCD_DATA_PORT |= (dataOrCmd<<4)&0xF0; //send low 4bit
   LCD_EN = 1;              //EN端产生一个由低电平变高电平,写LCD
   LCD_EN = 0;              //关闭使能信号,以免写入错误数据
}

/************************************************************
* 名称          :void  initLCD(void)
* 功能          :初始化液晶屏1602
* 调用          :void writeLCDCommand(uchar cmd)
* 全局变量      :NULL  
* 返回值        :NULL
* 调用          :NULL
* 编写日期      :2008-2-29 
* 最后修改日期  :2008-2-29 
************************************************************/
void  initLCD(void)
{
  writeByteLCD(1,0x30);
  writeByteLCD(1,0x30);
  writeByteLCD(1,0x02);
  writeByteLCD(1,0x30);   

  writeByteLCD(1,0x28); //显示模式设置以后都查测忙信号,设置4总线共有16*2字,每字有5*10(5*7)点阵
  writeByteLCD(1,0x01); //显示清屏
  writeByteLCD(1,0x02); //地址归位
  writeByteLCD(1,0x0C); //显示关闭
  writeByteLCD(1,0x14); //显示光标移动设置,光标移动,显示区不移动
}

/*************************************************
* 名称          :void LCDSetxy( uchar X, uchar Y )
* 功能          :定位要显示的数据在液晶屏上的位置       
* 输入          :unsigned char X, unsigned char Y
                  显示字符串的位置,X:0-15,Y:0-1
                  LCD第一行显示寄存器地址:0X80-0X8F
                  LCD第一行显示寄存器地址:0XC0-0XCF
* 全局变量      :NULL  
* 返回值        :NULL
* 调用          :void writeLCDCommand(uchar cmd)
* 编写日期      :2008-2-29 
* 最后修改日期  :2008-2-29
*************************************************/
void LCDSetxy( unsigned char X, unsigned char Y )
{
  unsigned char address;
  if (Y == 0) 
  {
	address = 0x80 + X;	   
  }
  else 
  {	  
    address = 0xC0 + X;	   
  }
  
  writeByteLCD(1,address);
}

/***************************************************************************
* 名称          :void LCDDisChar(uchar X,uchar Y,uchar data)
* 功能          :显示单个英文字符       
* 输入          :uchar X, uchar Y,char data
                  显示字符串的位置,X:0-15,Y:0-1
                  LCD第一行显示寄存器地址:0X80-0X8F
                  LCD第一行显示寄存器地址:0XC0-0XCF
				  data:要显示的字符的ACSI码
* 全局变量      :NULL  
* 返回值        :NULL
* 调用          :void LCD_set_xy( unsigned char X, unsigned char Y )
                  void writeLCDData(uchar dat)
* 编写日期      :2008-2-29 
* 最后修改日期  :2008-2-29		
***************************************************************************/
void LCDDisChar(uchar X,uchar Y,char dis_data)
{
  LCDSetxy( X, Y );
  writeByteLCD(0,dis_data);
} 


/*************************************************
* 名称          :void LCDDisString(unsigned char X,unsigned char Y,char *s)
* 功能          :显示英文字符串       
* 输入          :unsigned char X, unsigned char Y,char *s
                  显示字符串的位置,X:0-15,Y:0-1
                  LCD第一行显示寄存器地址:0X80-0X8F
                  LCD第一行显示寄存器地址:0XC0-0XCF
				  *s:英文字符串指针;
* 全局变量      :NULL  
* 返回值        :NULL
* 调用          :void LCD_set_xy( unsigned char X, unsigned char Y )
                  void writeLCDData(uchar dat)
* 编写日期      :2008-2-29 
* 最后修改日期  :2008-2-29
*************************************************/
void LCDDisString(unsigned char X,unsigned char Y,char *s)
{ 

  while ( *s ) 
  {
    //LCDSetxy( X, Y );
    //writeLCDData( *s );
	
	LCDDisChar( X, Y,*s);
	s ++;
    X ++;
	
	if (16 == X)  //显示超出一行时进行处理
	{
	  if (0 == Y) 
	  {
	    Y = 1;
		X = 0;
	  }
	  else  
	  {
	    Y = 0;
	    X = 0;
	  } //End of if (0 == Y)
	} // End of if (17 == X)
   }
}

⌨️ 快捷键说明

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