📄 lcd_1602.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 + -