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

📄 lcd_1602.c

📁 基于MSP430F14X单片机的红外接收程序
💻 C
字号:
/*****************************************************************************
* 文件名:   LCD_1602.c
* Copyright (c) 2008 *********武汉理工大学信息工程学院电信系
* 创建人:   王康
* 日 期:   2008.7.29
* 修改人:   王康
* 日 期:
* 描 述:   本文件定义了供调用的用户外部函数,函数名以Lcd开头
* 接口定义: D7~D0--P4
*           RS--P5.0
*           RW--P5.1
*           E--P5.2
* 版 本:   IAR V4.11
******************************************************************************/


//头文件
#include "config.h"


/*****************************************************************************
* 函数名:   LCD_Write_CMD
* 输 入:   cmd
* 输 出:   无
* 功能描述: 本函数为LCD_1602写命令子函数
* 全局变量: 无
* 调用模块: LCD_Test_Busy
* 作 者:   王康
* 日 期:   2008.7.29
* 修 改:   王康
* 日 期:
* 版  本:   IAR V4.11
******************************************************************************/
void LCD_Write_CMD(uchar cmd)
{  
    LCD_Test_Busy();                        //检测忙信号
    CLR_RW;         
    CLR_RS;                                 //写命令
    _NOP();                                 //延时1个系统时钟周期,即为125ns
    
    LCD_1602_DAT_CHL = cmd;                 //将命令字送入LCD数据端口
    _NOP();
    
    SET_EN;                                 //在使能端E产生一个高脉冲,时间大于150ns
    _NOP();
    _NOP();
    
    CLR_EN; 
}


/*****************************************************************************
* 函数名:   LCD_Write_DAT
* 输 入:   data
* 输 出:   无
* 功能描述: 本函数为LCD_1602写数据子函数
* 全局变量: 无
* 调用模块: LCD_Test_Busy
* 作 者:   王康
* 日 期:   2008.7.29
* 修 改:   王康
* 日 期:
* 版  本:   IAR V4.11
******************************************************************************/
void LCD_Write_DAT(uchar data)
{
    LCD_Test_Busy();                        //检测忙信号  
    CLR_RW;
    SET_RS;                                 //写数据
    _NOP();                                 //延时1个系统时钟周期,即为125ns
    
    LCD_1602_DAT_CHL = data;                //将数据送入LCD数据端口
    _NOP();
    
    SET_EN;                                 //在使能端E产生一个高脉冲,时间大于150ns
    _NOP();
    _NOP();
    
    CLR_EN;  
}


/*****************************************************************************
* 函数名:   LCD_1602_RST
* 输 入:   无
* 输 出:   无
* 功能描述: 本函数为LCD_1602的(初始化)复位子函数,严格按照1602的复位时序编写
* 全局变量: 无
* 调用模块: LCD_Write_CMD,LCD_Test_Busy,LCD_Delay
* 作 者:   王康
* 日 期:   2008.7.29
* 修 改:   王康
* 日 期:
* 版  本:   IAR V4.11
******************************************************************************/
void LCD_1602_RST(void)
{
    LCD_Delay();
    LCD_Delay();
    LCD_Delay();                            //延时15ms
    LCD_Write_CMD(0x38);                    //写指令38H,(不检测忙信号)
    LCD_Delay();                            //延时5ms
    LCD_Write_CMD(0x38);                    //写指令38H,(不检测忙信号)
    LCD_Delay();                            //延时5ms
    LCD_Write_CMD(0x38);                    //写指令38H,(不检测忙信号)
    LCD_Test_Busy();                        //检测忙信号
    LCD_Write_CMD(0x38);                    //写指令38H,显示模式设置
    LCD_Test_Busy();                        //检测忙信号
    LCD_Write_CMD(0x08);                    //写指令08H,关显示
    LCD_Test_Busy();                        //检测忙信号
    LCD_Write_CMD(0x01);                    //写指令01H,显示清屏
    LCD_Test_Busy();                        //检测忙信号
    LCD_Write_CMD(0x06);                    //写指令06H,写字符时整体不移动,光标加1
    LCD_Test_Busy();                        //检测忙信号
    LCD_Write_CMD(0x0c);                    //写指令0cH,显示开,不显示光标,光标不闪烁
}


/*****************************************************************************
* 函数名:   LCD_Test_Busy
* 输 入:   无
* 输 出:   无
* 功能描述: 本函数为LCD_1602读忙子函数,通过对LCD1602的状态字的读取得知LCD是否忙
* 全局变量: 无
* 调用模块: 无
* 作 者:   王康
* 日 期:   2008.7.29
* 修 改:   王康
* 日 期:
* 版  本:   IAR V4.11
******************************************************************************/
void LCD_Test_Busy(void)
{
    LCD_1602_DAT_DIR = 0x00;                //LCD_1602数据通道方向定义为输入状态
    
    CLR_RS;
    SET_RW;                                 //读状态
    _NOP();
    
    SET_EN;
    _NOP();
    _NOP();
    
    while((P4IN & LCD_BUSY));               //如果LCD_BUSY为1,则等待
    
    CLR_EN;
    LCD_1602_DAT_DIR = 0xff;                //LCD_1602数据通道方向定义为输出状态
}


/*****************************************************************************
* 函数名:   LCD_Delay
* 输 入:   无
* 输 出:   无
* 功能描述: 本函数为LCD_1602的延时子函数,延时月为5ms
* 全局变量: 无
* 调用模块: 无
* 作 者:   王康
* 日 期:   2008.7.29
* 修 改:   王康
* 日 期:
* 版  本:   IAR V4.11
******************************************************************************/
void LCD_Delay(void)
{
    uint t = 40000;
    while(t--);
}


/*****************************************************************************
* 函数名:   LCD_LocateXY
* 输 入:   x--位置的列坐标
*           y--位置的行坐标
* 输 出:   无
* 功能描述: 本函数是向LCD_1602输入要显示字符的坐标值的子函数
* 全局变量: 无
* 调用模块: LCD_Write_CMD,LCD_Test_Busy
* 作 者:   王康
* 日 期:   2008.7.29
* 修 改:   王康
* 日 期:   
* 版  本:   IAR V4.11
******************************************************************************/
void LCD_LocateXY(uchar x,uchar y)
{
    x &= 0x0f;                              //限制x的值小于等于15
    y &= 0x01;                              //限制y的值小于等于1
    if(y)
            x |= 0x40;                      //显示第二行时,地址指针加0x40
//    LCD_Test_Busy();                        //检测忙信号
    LCD_Write_CMD(0x80 + x);                //设置数据地址指针
}


/*****************************************************************************
* 函数名:   LCD_Write_One_Char
* 输 入:   x--位置的列坐标
*           y--位置的行坐标
*           data--要写入的字符数据
* 输 出:   无
* 功能描述: 本函数为在指定的位置写一个字符的子函数
* 全局变量: 无
* 调用模块: LCD_Write_DAT,LCD_Test_Busy,LCD_LocateXY
* 作 者:   王康
* 日 期:   2008.7.29
* 修 改:   王康
* 日 期:
* 版  本:   IAR V4.11
******************************************************************************/
void LCD_Write_One_Char(uchar x,uchar y,uchar data)
{
    LCD_LocateXY(x,y);                      //设置数据地址指针
//    LCD_Test_Busy();                        //检测忙信号
    LCD_Write_DAT(data);                    //写数据
}


/*****************************************************************************
* 函数名:   LCD_Write_String
* 输 入:   x--位置的列坐标
*           y--位置的行坐标
*           ptr--指向字符串首地址的指针
* 输 出:   无
* 功能描述: 本函数为在指定的位置写一个字符串的子函数
* 全局变量: 无
* 调用模块: LCD_Write_One_Char
* 作 者:   王康
* 日 期:   2008.7.29
* 修 改:   王康
* 日 期:
* 版  本:   IAR V4.11
******************************************************************************/
void LCD_Write_String(uchar x,uchar y,uchar *ptr)
{
    uchar *temp;
    uchar i = 0;
    uchar strlen = 0;
    
    temp = ptr;
    while(*ptr++ != '\0')                   //计算字符串有效字符的个数
        strlen++;
    for(i=0;i<strlen;i++)
    {
        LCD_Write_One_Char(x++,y,temp[i]);
        if(x == 0x10)
        {
            x = 0;
            y ^=1;
        }        
    }
}


/*****************************************************************************
* 函数名:   LCD_Write_N_Char
* 输 入:   x--位置的列坐标
*           y--位置的行坐标
*           n--要写入字符的个数
*           ptr--指向字符存放位置的指针
* 输 出:   无
* 功能描述: 本函数为在指定的位置连续写N个字符的子函数
* 全局变量: 无
* 调用模块: LCD_Write_One_Char
* 作 者:   王康
* 日 期:   2008.7.29
* 修 改:   王康
* 日 期:
* 版  本:   IAR V4.11
******************************************************************************/
void LCD_Write_N_Char(uchar x,uchar y,uchar n,uchar *ptr)
{
    uchar i;
    for(i=0;i<n;i++)
    {
        LCD_Write_One_Char(x++,y,ptr[i]);
        if(x == 0x0f)
        {
            x = 0;
            y ^= 1;
        }
    }
}

⌨️ 快捷键说明

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