51单片机 LCD1602驱动显示(模板)+Proteus

51单片机 LCD1602驱动显示(模板)+Proteus


本项目工程篇,只展示LCD1602驱动显示,不涉及其他外设驱动使用,可以作为LCD1602显示的模板移植使用。
在这里插入图片描述

实例代码

  • main.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<reg51.h>
#include<LCD1602.h>



void main(void)
{
LCD\_initial();
LCD\_set\_position(0);//显示位置
LCD\_printc('a');//显示内容
LCD\_prints("Hello World!");
LCD\_set\_position(0x40);//显示位置
LCD\_printc('a');//显示内容
while(1)
{
;
}
}

  • LCD1602.H文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/\*---------------------------------------------------------------------
LCD1602.H文件 LCD1602的一些命令定义
----------------------------------------------------------------------\*/

#ifndef \_\_LCD\_H\_\_
#define \_\_LCD\_H\_\_

#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 0x18 //LCD显示左移一位
#define LCD\_RIGHT\_MOVE 0x1C //LCD显示右移一位
#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\_cls(void);
void LCD\_write\_data(unsigned char);
void LCD\_initial(void);
void LCD\_set\_position(unsigned char);
void LCD\_prints(unsigned char \*);
void LCD\_printc(unsigned char);

#endif


  • LCD1602.C文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/\*---------------------------------------------------------------------
LCD1602.C文件 LCD1602的函数

----------------------------------------------------------------------\*/

#include "hardware.h"
#include "lcd1602.h"

void LCD\_check\_busy(void) //检测LCD状态,看它是不是还在忙呢
{
while(1)
{
LCD_EN=0;
LCD_RS=0;
LCD_RW=1;
LCD_DATA=0xff;
LCD_EN=1;
if(!LCD_BUSY)break;
}
LCD_EN=0;
}

void LCD\_cls(void) //LCD清屏
{

LCD\_check\_busy();
LCD_RS=0;
LCD_RW=0;
LCD_DATA=1;
LCD_EN=1;
LCD_EN=0;

}

void LCD\_write\_instruction(unsigned char LCD_instruction) //写指令到LCD
{
LCD\_check\_busy();
LCD_RS=0;
LCD_RW=0;

LCD_DATA=LCD_instruction;
LCD_EN=1;
LCD_EN=0;
}

void LCD\_write\_data(unsigned char LCD_data) //输出一个字节数据到LCD
{
LCD\_check\_busy();
LCD_RS=1;
LCD_RW=0;

LCD_DATA=LCD_data;
LCD_EN=1;
LCD_EN=0;
}

void LCD\_set\_position(unsigned char x) //LCD光标定位到x处
{
LCD\_write\_instruction(0x80+x);
}

/\*
void LCD\_go\_home(void) //LCD光标归位
{
LCD\_write\_instruction(LCD\_GO\_HOME);
}
\*/

void LCD\_printc(unsigned char lcd_data) //输出一个字符到LCD
{
LCD\_write\_data(lcd_data);
}

void LCD\_prints(unsigned char \*lcd_string) //输出一个字符串到LCD
{
unsigned char i=0;
while(lcd_string[i]!=0x00)
{
LCD\_write\_data(lcd_string[i]);
i++;
}
}

void LCD\_initial(void) //初始化LCD
{
LCD\_write\_instruction(LCD_AC_AUTO_INCREMENT|LCD_MOVE_DISENABLE);
LCD\_write\_instruction(LCD_DISPLAY_ON|LCD_CURSOR_OFF);
LCD\_write\_instruction(LCD_DISPLAY_DOUBLE_LINE);
LCD\_cls();
}

  • hardwar.h文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/\*---------------------------------------------------------------------
hardwar.h
-----------------------------------------------------------------------\*/



#ifndef \_\_HARDWAR\_H\_\_
#define \_\_HARDWAR\_H\_\_

#include <reg51.H>

/\*---------------------------------------------------------
LCD数据、控制口定义
---------------------------------------------------------\*/
#define LCD\_DATA P1 //LCD的数据口

sbit LCD_BUSY=LCD_DATA^7; //LCD忙信号位

sbit LCD_RW=P2^0; //LCD读写控制
sbit LCD_RS=P2^1; //LCD寄存器选择
sbit LCD_EN=P2^2; //LCD使能信号


#endif

工程模板和仿真资源

1
2
3
链接:https://pan.baidu.com/s/17SolUWouYDrp-7qAkUjyDg 
提取码:2v7u