找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2543|回复: 1
打印 上一主题 下一主题
收起左侧

1602液晶51单片机驱动程序

[复制链接]
跳转到指定楼层
楼主
ID:26188 发表于 2015-2-18 01:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//引脚定义
#define LCD_RS      P21    // RS针,LCD数据/命令(H/L)选择端
#define LCD_RW      P22    // R/W针,LCD读/写(H/L)选择端
#define LCD_EN      P23    // E针,LCD使能信号高有效
#define LCD_DATA    P0     // DB0~DB7针,LCD并行数据线
#define LCD_BUSY    P07    // DB7针,LCD忙信号位
#define LCD_GO_HOME               0x02         //AC=0,光标、画面回HOME位
//输入方式设置
#define LCD_AC_AUTO_INCREMENT     0x06         //数据读、写操作后,AC自动增一
#define LCD_AC_AUTO_DECREASE      0x04         //数据读、写操作后,AC自动减一
#define LCD_MOVE_ENABLE           0x05         //数据读、写操作,画面平移
#define LCD_MOVE_DISENABLE        0x04         //数据读、写操作,画面不动
//设置显示、光标及闪烁开、关
#define LCD_DISPLAY_ON            0x0C         //显示开
#define LCD_DISPLAY_OFF           0x08         //显示关
#define LCD_CURSOR_ON             0x0A         //光标显示
#define LCD_CURSOR_OFF            0x08         //光标不显示
#define LCD_CURSOR_BLINK_ON       0x09         //光标闪烁
#define LCD_CURSOR_BLINK_OFF      0x08         //光标不闪烁
//光标、画面移动,不影响DDRAM
#define LCD_LEFT_MOVE             0x05         //LCD显示(整屏)右移一位 0x05
#define LCD_RIGHT_MOVE            0x07         //LCD显示(整屏)左移一位 0x07
#define LCD_CURSOR_LEFT_MOVE      0x10         //光标左移一位
#define LCD_CURSOR_RIGHT_MOVE     0x14         //光标右移一位
//工作方式设置
#define LCD_DISPLAY_DOUBLE_LINE   0x38         //两行显示
#define LCD_DISPLAY_SINGLE_LINE   0x30         //单行显示
/***************************************************************************************
** 函数名称: void LCD_BUSY_Bit(void)
** 功能描述: 等待忙信号消失
****************************************************************************************/
void LCD_BUSY_Bit(void)   
{
    bit byteData;
    do
    {//循环开始
        LCD_EN   = 0;           //使能关
        LCD_RS   = 0;           //指令方式
        LCD_RW   = 1;           //读LCD
        LCD_DATA = 0xFF;        //拉高数据口电位
        LCD_EN   = 1;           //使能开
        byteData = LCD_BUSY;    //取忙信号
    }while(byteData);           //循环终点 读到 忙位为0退出,否则继续读忙。
    LCD_EN = 0;                 //使能关
}
/***************************************************************************************
** 函数名称: void LCD_Write_Instruction(unsigned char byteData)
** 功能描述: 写指令
** 输   入: unsigned char byteData
** 调用模块: void LCD_BUSY_Bit(void)
****************************************************************************************/
void LCD_Write_Instruction(unsigned char byteData)
{
    LCD_BUSY_Bit();       //读忙
    Delay_us(30);         //微秒级延时
    LCD_EN = 0;           //使能关
    LCD_RS = 0;           //1:数据;0:指令
    LCD__RW = 0;          //1:读;0:写
    LCD_DATA = byteData;  //指令写入数据口
    LCD_EN = 1;           //使能开
    Delay_us(30);         //微秒级延时
    LCD_EN = 0;           //使能关
}
/***************************************************************************************
** 函数名称: void LCD_Write_DATA(unsigned char byteData)
** 功能描述: 写数据
** 输   入: unsigned char byteData 写数据
** 调用模块: void LCD_BUSY_Bit(void)
****************************************************************************************/
void LCD_Write_DATA(unsigned char byteData)
{
    LCD_BUSY_Bit();       //读忙
    Delay_us(30);         //微秒级延时
    LCD_EN = 0;           //使能关
    LCD_RS = 1;           //1:数据;0:指令
    LCD_RW = 0;           //1:读;0:写
    LCD_DATA = byteData;  //数据写入数据口
    LCD_EN = 1;           //使能开
    Delay_us(30);         //微秒级延时
    LCD_EN = 0;           //使能关
}
/***************************************************************************************
** 函数名称: void LCD_1602_Setup(void)
** 功能描述: 初使化1602液晶
****************************************************************************************/
void LCD_1602_Setup(void)
{
    LCD_write_instruction(LCD_AC_AUTO_INCREMENT|LCD_MOVE_DISENABLE); //AC自动增1,读写时画面不移动
    LCD_write_instruction(LCD_DISPLAY_ON|LCD_CURSOR_OFF);            //显示开,光标不显示
    LCD_write_instruction(LCD_DISPLAY_DOUBLE_LINE);                  //双行显示
    LCD_Write_Instruction(1);                                        //清屏
}
/***************************************************************************************
** 函数名称: void LCD_1602_write_char(unsigned char x,unsigned char y,unsigned char dat )
** 功能描述: 单个字写入到第x(1,2)行y(0,15)列
** 输   入: unsigned char x 第x(1,2)行;unsigned char y(0,15)列;unsigned char *s要写ude字符
** 调用模块: LCD_write_instruction(),LCD_Write_DATA()
****************************************************************************************/
void LCD_1602_write_char(unsigned x,unsigned char y,unsigned char dat )
{
unsigned char i = 0;
x = (x-1)*0x40;   //第几行
y = x+y;   //第几列
LCD_write_instruction(0x80+y);  
LCD_Write_DATA(dat); //写入字符串值
}



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:43559 发表于 2015-3-4 22:44 | 只看该作者
看看。感谢分享。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表