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

📄 lcd display.c

📁 基于C语言的LCD1602驱动程序
💻 C
字号:

//Editor: zhangmin
//Version: V1.0
//Description: LCD1602驱动程序
//Date:2008.11.10 

/**********************************************************
                   头文件定义 
**********************************************************/

#include<at89x51.h>

#include<intrins.h>

/**********************************************************
                   自变量定义 
**********************************************************/
#define uchar unsigned char
#define uint unsigned int
sbit RS=P3^0;  //数据/指令选择端 
sbit RW=P3^1;  //读写选择端 
sbit E=P3^2;  //使能信号,从低到高有效 
sbit busyFlag=P2^7;  //读忙标志位 

uchar date[]="2008";
  uchar mon[]="11";
  uchar day[]="16"; 
//uchar inputdata[]="Donghua University--Information Colledge--Zhangmin--Major in theRecognition^_^";
//待显示的内容 


/**********************************************************
函数名称: delay
函数描述: 延时ms (11.0592MHz) 
入口参数: uint i 
**********************************************************/

void delay(uint i) 
{ 
 uchar a;
 while(i--)
 {
   for(a=0;a<250;a++)
     {
      _nop_();_nop_();_nop_();_nop_();
          }
 }    
}
  
/**********************************************************
函数名称: testBusy 
函数描述: LCD检测是否忙碌函数
入口参数: 无
**********************************************************/


uchar testBusy(void)
{  
  bit flag;
  P2=0xff;
  RS=0;         //选择指令端 
  RW=1;         //选择读取 
  E=1;          //使能端由低到高有效  
  if (busyFlag==1) flag=1;
    else flag=0;
   E=0;
  return flag; 
     } 	 	
   

/**********************************************************
函数名称: writeCommand 
函数描述: LCD写入指令函数
入口参数: 指令参数command 
**********************************************************/
     
void writeCommand(uchar command)
{  while(testBusy());
  
   RS=0;   //选择指令端 
   RW=0;   //选择写入 
   E=1;    //下降沿读入 
   P2=command;
   E=0;
 }
  
/**********************************************************
函数名称: writeData
函数描述: LCD写入数据函数
入口参数: 指令参数writedata 
**********************************************************/
     
void writeData(uchar writedata)
{  
   while(testBusy());
   RS=1;    //选择数据端 
   RW=0;    //选择写入
   E=1;
   P2=writedata;
   E=0;
 }   
 
/**********************************************************
函数名称: initialLcd1602() 
函数描述: LCD写入指令函数
入口参数: 无
**********************************************************/
void initialLcd1602(void)
{ 
     
  /*delay(100);
  writeCommand(0x38);
  delay(10);
  writeCommand(0x38); 
  delay(10);
  writeCommand(0x38); 
  delay(10);	*/     //初次使用 
  
  writeCommand(0x38); //设置显示格式为:8位,双行显示,5X7点阵 
  writeCommand(0x80);
  writeCommand(0x01);                  
  writeCommand(0x0c);//设置显示状态:显示器开,有光标,关闪烁 writeCommand(0x0f)
                     //writeCommand(0x0c);writeCommand(0x0e)
  writeCommand(0x06);
  }
 
/**********************************************************
函数名称: display_xy
函数描述: LCD确定光标位置函数
入口参数: 列坐标x,行坐标y 
**********************************************************/

 void display_xy(uchar x,uchar y)
 {
    if(y==1)         //若第二行则光标地址加0x80 
   x+=0x40;         
   x+=0x80;
   writeCommand(x);
   }
   
/**********************************************************
函数名称: display_char
函数描述: 显示字符函数
入口参数: 列坐标x,行坐标y,输入数据 
**********************************************************/
 
 void display_char(uchar x,uchar y,uchar inputData) 
 {
   display_xy(x,y);  //确定光标位置
   writeData(inputData);  //输入字符数据 
   }
 
/**********************************************************
函数名称: display_string
函数描述: 显示字符串函数
入口参数: 列坐标x,行坐标y,输入数据串 
**********************************************************/
 
 void display_string(uchar x,uchar y,uchar *stringData)
 {
  uchar columnCoordinate=x; //定义列坐标 
  uchar rowCoordinate=y;    //定义行坐标 
 
   while(*stringData!='\0') //循环条件:字符串没有结束 
    { 
      display_char(columnCoordinate,rowCoordinate,*stringData);
      columnCoordinate++;
      stringData++;
     /* if(*stringData==0x60)   //设置是否回车显示 
      rowCoordinate++;
         if(rowCoordinate==2)
            rowCoordinate=0;  */
      if(columnCoordinate==16)
      {
        columnCoordinate=0;
        rowCoordinate++;  
         if(rowCoordinate==2)   //当前页面显示完,准备下一页显示 
           {
           delay(400); //翻页速度
           writeCommand(0x01); //显示完一页后清屏,下一页内容更新 
           rowCoordinate=0;    //重新在第一行显示 
           }
      }
    }  //一次显示结束 
   // delay(400);//停留时间,全部内容重新显示 
       
  } 
  
 /**********************************************************
函数名称: display_character()
函数描述:自定义汉字初始化函数 
入口参数: 无
**********************************************************/  
  
void initial_character(void)
{
   uchar i,j,cgRam;
   uchar zimo[]={0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,  // '年' 0x00
                 0x0F,0x09,0x0F,0x09,0x0F,0x09,0x11,0x00,  // '月' 0x01
                 0x1F,0x11,0x11,0x1F,0x11,0x11,0x1F,0x00};  // '日' 0x02
   cgRam=0x40;  //初始化CGRAM地址 
   for(j=0;j<3;j++)
   {   
     for(i=0;i<8;i++)
      { 
      writeCommand(cgRam+i);   //设置字符地址为:0x00,0x01,0x02 
      delay(2);
      writeData(zimo[8*j+i]);  //依次写入每行字字模 
      delay(2); 
      } 
     cgRam=cgRam+8;  //写入下一个地址 
    }
}
/***************以上均为驱动函数***************************/ 
 
 /**********************************************************
函数名称: main
函数描述:主函数
入口参数: 无 
**********************************************************/
 
 void main(void)
 { 
   delay(100);  //等待LCD进入工作状态 
   initialLcd1602();
  initial_character();
  
   while(1)  //循环显示内容 
   { 
   display_string(0,0,date);
   display_char(4,0,0x00);
   display_string(5,0,mon);
   display_char(7,0,0x01);
   display_string(8,0,day);
   display_char(10,0,0x02);
   //display_string(0,0,inputdata);  //起始显示位置 
   }
 }  

⌨️ 快捷键说明

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