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

📄 1602驱动程序.txt

📁 液晶屏1602驱动程序
💻 TXT
字号:
LCD1602液晶驱动程序 
//-----------------------------------------------------
//     lcd_1602
// 创建者:黄茶勇  时间:2006年4月22日
// 说明:
//-----------------------------------------------------
//  0x01      //清屏指令
//  0x02  //光标复位指令 
//  0x04  //字符不移,光标左移
//  0x06  //字符不移,光标右移

//  0x05  //字符移,光标左移
//  0x07  //字符移,光标右移

//      0x10   //移动光标
//  0x18   //移动字符

             //显示开关控制 ,以下几条(指令)按位或,就可得组合
//  0x0e  //整体显示开,光标开
//   0x08  //整体显示关
//   0x0c  //整体显示开,光标关
//   0x0f   //整体显示开,光标开,光标闪烁
//   0x0e  //整体显示开,光标开,光标不闪烁

 

//   0x20  //4位总线,1行显示,5*7字符
//   0x28  //4位总线,2行显示,5*7字符
//   0x24  //4位总线,1行显示,5*10字符
//   0x2c  //4位总线,2行显示,5*10字符
//   0x30  //8位总线,1行显示,5*7字符
//   0x38  //8位总线,2行显示,5*7字符
//   0x34  //8位总线,1行显示,5*10字符
//   0x27  //8位总线,2行显示,5*10字符

 

//------------------------------------------

#i nclude "reg51.h"
#i nclude <string.h>
#define uchar unsigned char 
#define uint unsigned int

#define LCD_CLR     0x01      //清屏指令

#define CURSOR_REST   0x02  //光标复位指令

              //光标和显示模式设置,以下几条(指令)按位或,就可得组合
#define CURSOR_MOV_L   0x04  //光标左移
#define CURSOR_MOV_R   0x06  //光标右移
#define CHAR_MOV_N   0x04  //字符不移
#define CHAR_MOV_Y   0x05  //字符移

#define CURSOR_MOV   0x10   //移动光标
#define CHAR_MOV    0x18   //移动字符

             //显示开关控制 ,以下几条(指令)按位或,就可得组合
#define ALL_ON     0x0c  //整体显示开
#define ALL_OFF     0x08  //整体显示关
#define CURSOR_ON    0x0a  //光标开
#define CURSOR_OFF   0x08  //光标关
#define CURSOR_SS    0x09  //光标闪烁
#define CURSOR_BS    0x08  //光标不闪烁
//功能设置命令
#define BUS_4BIT    0x20  //4位总线
#define BUS_8BIT    0x30  //8位总线
#define LINE_1     0x20  //1行显示
#define LINE_2     0x28  //2行显示
#define CHAR5_7     0x20  //5*7字符
#define CHAR5_10    0x24  //5*10字符
//-----------------引脚接线图-------------
#define data_out P0
sbit LCD_E=P3^2;
sbit LCD_RW=P3^1;
sbit LCD_RS=P3^0; 
sbit BF=P0^7;

uchar code tab_du[]={0x16,0x09,0x18,0x18,0x18,0x09,0x06,0x00,}; //℃符号
//-----------------函数定义----------------
void delay(uint);     //延时
void  LCD_init(void);    //液晶初始化
void w_LCD_comm(uchar);    //写入命令子程序
void w_LCD_dat(uchar);    //写入数据
void LCD_busy(void);     //判忙
void write_LCD_char(uchar,uchar,uchar); //写字符
void write_LCD_str(uchar,uchar,uchar); //写字符串
uchar num_to_char(uchar);
//----------------------------------------
//函数名称: delay
//功能描述:延时(N*8+6)μs
//----------------------------------------
void delay(uint N)
{
  uint i;
  for(i=0;i<N;i++);
}  

  
//----------------------------------------
//函数名称:LCD_busy
//功能描述:判忙函数
//---------------------------------------- 
void LCD_busy(void)
{
   while(1)
   {
    data_out=0xff;
    LCD_RS=0;
    LCD_RW=1;
    LCD_E=1;
    if(!BF)break;  //如果BF忙标志位为1,则忙,则等待 
    LCD_E=0;
   }
   
  
    
} 
//----------------------------------------
//函数名称:w_LCD_command
//功能描述:写入命令
//---------------------------------------- 
void w_LCD_comm(uchar comm)
{
   LCD_busy();
   
   data_out=comm;
   LCD_RS=0;
   LCD_RW=0;
   LCD_E=0;   //E,下降沿触发
   
}

//----------------------------------------
//函数名称:input_data
//功能描述:写入数据
//---------------------------------------- 
void w_LCD_dat(uchar dat)
{
   LCD_busy();
  
   data_out=dat;
   LCD_RS=1;
   LCD_RW=0;
   LCD_E=1;
   LCD_E=0;   //E,下降沿触发
} 

//----------------------------------------
//函数名称: LCD_init
//功能描述:液晶初始化
//----------------------------------------
void LCD_init(void)
{
  LCD_RW=0;
  LCD_RS=0;
  LCD_E=0;  
  w_LCD_comm(BUS_8BIT|LINE_2|CHAR5_7);  //8位数据,二行,5*7
  delay(10);
  w_LCD_comm(ALL_ON|CURSOR_ON|CURSOR_SS);  //显示开,光标开,光标闪
  w_LCD_comm(CURSOR_MOV_R|CHAR_MOV_N);    //光标右移,字不移
  w_LCD_comm(LCD_CLR);            //清屏
  w_LCD_comm(0x80);             //地址0
  
}

  
//----------------------------------------
//函数名称:num_to_char
//功能描述:将数字转为字符
//---------------------------------------- 
uchar num_to_char(uchar num)
{
   return(num+'0'); 
} 


//----------------------------------------
//函数名称:write_char
//功能描述:写入字符
//---------------------------------------- 
void write_LCD_char(uchar x,uchar y,uchar dat)
{
 if(y==0)
  {
   w_LCD_comm(0x80+x);
  } 
   else 
        {
           w_LCD_comm(0xc0+x);
    }
   
  w_LCD_dat(dat);
}

//----------------------------------------
//函数名称:write_str
//功能描述:写入字符串,x为字,y为行
//---------------------------------------- 
void write_LCD_str(uchar x,uchar y,uchar *p_str)
{
 uchar i;
 i=strlen(p_str);
 while(i!=0)
  {
    if(x>=16)   //如果写完一行,下一行(首字)
    {
      y++; 
      x=0;
    } 
     
   if(y>=2)break;  //如果写了二行,不写了,
   write_LCD_char(x,y,*p_str);   //写
   x++;     //写下一个字
   i--;     //字数减1
   p_str++;    //字符串中下一个字符
  }  
}

//----------------------------------------
//函数名称:write_CGRAM
//功能描述:向CGRAM写入数据,add为首地址,size为字符的个数
//---------------------------------------- 
void write_CGRAM(unsigned char add,unsigned char *p_tab,unsigned char size)
{
 unsigned char lenth=0;   
 lenth=size*8;       //每个字符,8个码               
 add=0x40+8*add;         //CGRAM的地址D5位要为1                
 while(lenth!=0)   
 {
  if(add>=0x80)                   //CGRAM的地址到顶
   break;
  w_LCD_comm(add);          //写CGRAM地址
  w_LCD_dat(*p_tab);      //写CGRAM数据
  lenth--;      //下一个码
  add++;                          //下个地址                                  
  p_tab++;                     //下个字符
 }
}

//----------------------------------------
//函数名称:主函数
//功能描述:调用各子函数
//----------------------------------------
void main(void)
{
  LCD_init();
  num_to_char(0); 
  while(1)
  {
      write_CGRAM(0,tab_du,1); //写℃符号
   write_LCD_str(0,0,"By huangchayong    2006-03-30");  //x:0 y:0,第1行(y),第1个字(x)
     }
}



⌨️ 快捷键说明

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