单片机 > 单片机程序设计 > 详情

[C51代码]LCD1602驱动

发布时间:2020-06-20 发布时间:
|
 /************************************************LCD1602.c*************************************************************************/

#include "Atmel/AT89X51.h"
#include "delay.h"
#include "lcd1602.h"

/*************声明变量****************/

uchar code table[]={0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,    //年
                    0x1f,0x11,0x1f,0x11,0x1f,0x11,0x11,0x00,    //月
                    0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00,    //日
                    0x10,0x18,0x1c,0x1e,0x1f,0x1c,0x18,0x10 };  //三角符号
 /****************************************************************
 *函数功能:初始化LCD
 *入口参数:无 
 *出口参数:无
 ****************************************************************/
void LCDInit(void)
{ LCDWriteCmd(DispMode);          //显示模示设置
  delay1ms(1);
  LCDWriteCmd(DispSet);           //显示/光标设置
  delay1ms(1);
  LCDWriteCmd(InputSet);         //输入设置
  delay1ms(1);
  LCDWriteCmd(DispClear);        //清除LCD的显示内容
  delay1ms(2);
  WriteMychar(table);
 }
 /****************************************************************
 *函数功能:写入指令数据到LCD
 *入口参数:指令数据uchar cmd 
 *出口参数:无
 ****************************************************************/
 void LCDWriteCmd(uchar cmd)
 { LCDBusy();
   RS=0;
   RW=0;
   P0=cmd;
   EP=1;
   delay1ms(1);;//延时1ms
   EP=0;
 }
/****************************************************************
 *函数功能:写入字符显示数据到LCD
 *入口参数:要显示字符的ASCII码uchar dat 
 *出口参数:无
 ****************************************************************/
void LCDWriteData(uchar dat)
{  LCDBusy();
   RS=1;
   RW=0;
   P0=dat;
   EP=1;
   delay1ms(1);//延时1ms
   EP=0;

}
/****************************************************************
 *函数功能:测试LCD忙碌状态
 *入口参数:无 
 *出口参数:1:忙;0 不忙
 ****************************************************************/
void LCDBusy(void)
{  RS=0;
   RW=1;
   while (1) 
   { 
    EP=1; 
    if (StatusBusy==0) EP=0;
                    delay1ms(1);
                    break;
    } 
}
/****************************************************************
 *函数功能:光标定位(x,y)
 *入口参数:地址指针x,y 
 *出口参数:无
 ****************************************************************/
void LCDGet_xy(uchar x,uchar y)
{  y&=0x1;   
   x&=0xf;//限制X不能大于15,Y不能大于1
   if (y==0) x+=0x80;//当要显示第二行时地址码+0x40;
   else      x+=0xc0;// 算出指令码
   LCDWriteCmd(x);

}
/****************************************************************
 *函数功能:输出单个字符
 *入口参数:数据SingalChar
 *出口参数:无
 ****************************************************************/
 void LCDDispOneChar(uchar x,uchar y,uchar SingalChar)
{      
       LCDGet_xy(x,y);

       LCDWriteData(SingalChar);
 
           
         
}
/****************************************************************
 *函数功能:输出字符串
 *入口参数:地址指针*p
 *出口参数:无
 ****************************************************************/
void LCDDispListChar(uchar x,uchar y,uchar *p)
{      
       LCDGet_xy(x,y); 
       while (*p!='\0')   
       {
        LCDWriteData(*p);
        p++;
       }   
           
         
}

/********************************************************************
 *函数功能:写入自定义字符到CGRAM,共64字节
 *入口参数:character:要显示的字符的列表地
            址,(0x00-0x07)为字符保存的RAM 
 *出口参数:无
 ********************************************************************/
void WriteMychar(uchar *s)
{  
    uchar m;
    LCDWriteCmd(0x40);             //设定CGRAM地址 
    for(m=0;m     { 
      LCDWriteData(*s);
      s++;           
    }

}

 /********************************************************************
 *函数功能:显示CGRAM的自定义字符
 *入口参数:k(0x00-0x07)为字符保存的RAM 
 *出口参数:无
 ********************************************************************/
void DispMychar(uchar x,uchar y,uchar k)
{  
   LCDGet_xy(x,y);
   LCDWriteData(k);
 }

 /****************************************************************************************************************************************/

 /************************************************LCD1602.h*************************************************************************/

 /****************************************************************************************************************************************/

#ifndef _LCD1602_h_
#define _LCD1602_h_
#include "link.h"

/*******************端口连接定义********************/
sbit RS=P2^0;
sbit RW=P2^1;
sbit EP=P2^2;

#define DataPort P0

/*******************初始化命令字定义********************/
#define N 24
#define DispMode 0x38                 // 8位数据线,16*2,5*8点阵 --0x38
                                      // DL-bit4: 1 8位显示;0 4位显示
                                      // N-bit3:  1 二行显示;0 一行显示
                                      // F-bit2:  1 5*11点阵显示;0 5*8点阵显示


#define DispSet 0x0c                 // 显示/光标设置 --0x0c
                                     // D-bit2:1 开显示;  0 关显示
                                     // C-bit1:1 显示光标;0 不显示光标
                                     // B-bit0:1 光标闪烁;0 光标不闪烁
#define InputSet 0x06                // 输入设置:    --0x06
                                     // I/D-bit1:1 读写一个字符后指针+1,且光标+1;0 读写一个字符后指针-1,且光标-1
                                     // S-bit0:1 当写一个字符后,整屏显示左移(N=1)或右移(N=0),以得到光标不动而屏幕移动的效果;
                                     //        0 写一个字后整屏显示不移动

#define DispMov  0x10|0<<3|1<<2      // S/C-bit3:1 画面平移一个字符位;0 光标平移一个字符位
                                     // R/L-bit2:1 右移;0 左移
#define DispClear 0x01               // 显示清屏

#define DispEnter 0x02               // 显示回车

#define StatusBusy P0^7              // bit7:1 忙状态


/*************声明函数****************/

extern void LCDInit(void);                     //初始化函数
extern void LCDWriteCmd(uchar cmd);            //写指令函数
extern void LCDWriteData(uchar dat);           //写数据函数
extern void LCDBusy(void);                     //检查忙函数
extern void LCDGet_xy(uchar x,uchar y);        //光标定位(x,y)
extern void LCDDispListChar(uchar x,uchar y,uchar *p);//显示字符串
extern void WriteMychar(uchar *s);
extern void DispMychar(uchar x,uchar y,uchar k);
extern void LCDDispOneChar(uchar x,uchar y,uchar SingalChar);

#endif

关键字:C51代码  LCD1602驱动 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM基础知识八