专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

LCD1602.H(51单片机LCD1602显示驱动程序)

作者:串亖の六花   来源:本站原创   点击数:  更新时间:2014年04月28日   【字体:

 

 
 
/*无敌高氯酸修改
 
  函数功能
  delay_ms(time)  延时time毫秒
  LCD_init()      初始化清空LCD屏
  LCD_print(x,y,str)在(x,y)坐标上显示str字符       0=<x=<15     y=0或者1
*/
/*定义端口*********************************************************/
#define Port P2 //数据端口
sbit Rs = P0^7;     /*LCD 第四脚*/
sbit Rw = P0^6;     /*LCD 第五脚*/
sbit En = P0^5;  /*LCD 第六脚*/
 
/*定义类型*/
#define uchar unsigned char
#define uint unsigned int
   
/*定义LCD控制字*****************************************************/
//清屏及光标归位
#define LCD_CLEAR 0x01 // 清屏
#define LCD_HOMING 0x02 // 光标返回左上角
//显示开关控制指令
#define LCD_SCREEN_ON 0x0C //显示开
#define LCD_SCREEN_OFF 0x08 //显示关
#define LCD_CURSOR_ON 0x0A //显示光标
#define LCD_CURSOR_OFF 0x08 //无光标
#define LCD_C_FLASH_ON 0x09 //光标闪动
#define LCD_C_FLASH_OFF 0x08 //光标不闪动
//进入模式设置指令
#define LCD_AC_UP 0x06 //新数据后光标右移
#define LCD_AC_DOWN 0x04 //新数据后光标左移
#define LCD_S_MOVE_ON 0x05 // 画面可平移
#define LCD_S_MOVE_OFF 0x04 //画面不可平移
//设定显示屏或光标移动方向指令
#define LCD_C_LEFT 0x10 //光标左移1格,且AC值减1
#define LCD_C_RIGHT 0x11 //光标右移1格,且AC值加1
#define LCD_CHAR_LEFT 0x18 //显示器上字符全部左移一格,但光标不动
#define LCD_CHAR_RIGHT 0x1C //显示器上字符全部右移一格,但光标不动
uchar code number[10]={"0123456789"};
/*所有函数声明*********************************************************/
void LCD_init(void);
void LCD_wdata(uchar wdata);
void LCD_wcommand(uchar lcd_cmd,busy_f);
void LCD_gotoxy(uchar x,uchar y);
void LCD_print(uchar x,uchar y,uchar *str);
uchar Rstatus(void);
uchar LCD_rdata(void);
void delay_ms(unsigned int n)  {
    unsigned int i=0,j=0;
    for (i=n;i>0;i--)
     for (j=0;j<1140;j++); 
}
  /*********************************************************************
函数名称:LCD_print()
功能描述:显示字符或字符串
入口参数:字符或字符串
返回值:无
**********************************************************************/
void LCD_print(uchar x,uchar y,uchar *str)
{
LCD_gotoxy(x,y);
while(*str!='\0')
{
LCD_wdata(*str);
str++;
}
}
 
/*
********************************************************************
函数名称:LCD_wcommand()
功能描述:LCD写指令
入口参数:uchar lcd_cmd:命令字,uchar busy_f:忙检测标志位
返回值:无
********************************************************************
*/
void LCD_wcommand(uchar lcd_cmd,busy_f)
{
if (busy_f) Rstatus(); //不忙才执行下个程序
Port = lcd_cmd;
Rs = 0;
Rw = 0;
En = 0;
En = 0;
En = 1;
}
/*********************************************************************
函数名称:LCD_wdata()
功能描述:LCD写数据
入口参数:uchar wdata:所写数据
返回值:无
*********************************************************************/
void LCD_wdata(uchar wdata)
{
Rstatus();
Port = wdata;
Rs = 1;
Rw = 0;
En = 0; //若晶振速度太高可以在这后加小的延时
En = 0; //延时
En = 1;
}
/*********************************************************************
函数名称:LCD_rdata()
功能描述:LCD读数据
入口参数:无
返回值:所读数据
*********************************************************************/
uchar LCD_rdata(void)
{
Rs = 1;
Rw = 1;
En = 0;
En = 0;
En = 1;
return Port;
}
/*********************************************************************
函数名称:Rstatus()
功能描述:LCD读忙状态
入口参数:无
返回值:若忙,则等待,不忙则返回Port
*********************************************************************/
uchar Rstatus(void)
{
Port = 0xFF;
Rs = 0;
Rw = 1;
En = 0;
En = 0;
En = 1;
while (Port & 0x80); //检测忙信号,不忙则退出等待
return(Port);
}
/*********************************************************************
函数名称:LCD_init()
功能描述:LCD初始化
入口参数:无
返回值:无
*********************************************************************/
void LCD_init(void)
{
Port = 0;
LCD_wcommand(0x38,0); //三次显示模式设置,不检测忙信号
delay_ms(3);
LCD_wcommand(0x38,0);
delay_ms(3);
LCD_wcommand(0x38,0);
delay_ms(3);
LCD_wcommand(0x38,1); //显示模式设置(0X38双行(5*7),0X34单行(5*10)),0X30单行(5*7);开始要求每次检测忙信号
LCD_wcommand(0x08,1); //关闭显示
LCD_wcommand(0x01,1); //显示清屏
LCD_wcommand(0x06,1); // 显示光标移动设置
LCD_wcommand(0x0C,1); // 显示开及光标设置
}
 
/*********************************************************************
函数名称:LCD_gotoxy()
功能描述:定位到(x,y)位置
入口参数:x为行(0~1),y为列(0~15)
返回值:无
*********************************************************************/
void LCD_gotoxy(uchar x, uchar y)
{
x &= 0x1; //限制x不能大于1,y不能大于15
y &= 0xF;
if(!x) LCD_wcommand(0x80|y,1);
else LCD_wcommand(0xC0|y,1);
}
 
关闭窗口

相关文章