0%

单片机-显示设备

显示设备

LCD1602:

引脚定义:

引脚号符号引脚说明引脚号符号引脚说明
1VSS电源地9D2数据端口
2VDD电源正极10D3数据端口
3VO偏压信号11D4数据端口
4RS命令/数据12D5数据端口
5RW读/写13D6数据端口
6E使能14D7数据端口
7D0数据端口15A背光正极
8D1数据端口16K背光负极

基本操作:

  1. 读状态:输入RS=0,RW=1,E=1。输出:D0—D7为状态字。
  2. 读数据:输入RS=1,RW=1,E=1。输出:D0—D7为数据。用于读取busy标志。
  3. 写命令:输入RS=0,RW=0,E=正脉冲。输出:无。
  4. 写数据:输入RS=1,RW=0,E=正脉冲。输出:无。

E高脉冲的意思是你先向E写入低电平,然后写入RS,RW,然后向E写入高电平。

控制命令:

  1. 01H:清屏。
  2. 02H:光标返回。
  3. 输入方式设置(EnterModeSet),这些指令规定了两个方面:一是写入一个DDRAM单元后,地址指针如何改变(加一还是减一);二是屏幕上的内容是否滚动。 04H:写入DDRAM后,地址指针减一(光标左移一位),比如第一个字符写入8FH,则下一个字符会写入8EH;屏幕上的内容不滚动。 05H:写入DDRAM后,地址指针减一,同上一种情况;每一个字符写入以后,屏幕上的内容向右滚动一个字符位,光标显示的位置不动。 06H:写入DDRAM后,地址指针加一(光标右移一位),比如第一个字符写入80H,则下一个字符会写入81H;屏幕上的内容也是不滚动。这应该是最常用的一种显示方式。 07H:写入DDRAM后,地址指针加一,同上一种情况;每一个字符写入以后,屏幕上的内容向左滚动一个字符位,光标显示的位置不移动。
  4. 屏幕开关、光标开关、闪烁开关。 08H、09H、0AH、0BH:关闭显示屏,实质上是不把DDRAM中的内容对应显示在屏幕上,对DDRAM的操作还是在进行的,执行这条指令,接着对 DDRAM进行写入,屏幕上没有任何内容,但是接着执行下面的某条指令,就能看到刚才屏幕关闭期间,对DDRAM操作的效果了。 0cH:打开显示屏,不显示光标,光标所在位置的字符不闪烁。 0dH:打开显示屏,不显示光标,光标所在位置的字符闪烁。 0eH:打开显示屏,显示光标,光标所在位置的字符不闪烁。 0fH:打开显示屏,显示光标,光标所在位置的字符闪烁。 关于光标的位置:光标所在的位置指示了下一个被写入的字符所处的位置,假如在写入下一个字符前没有通过指令设置DDRAM的地址,那么这个字符就应该显示在光标指定的地方。
  5. 设置光标移动(本质就是AC的增加还是减少)、整体画面是否滚动。 10H:每输入一次该指令,AC就减一,对应了光标向左移动一格。整体的画面不滚动。 14H:每输入一次该指令,AC就加一,对应了光标向右移动一格。整体的画面不滚动。 18H:每输入一次该指令,整体的画面就向左滚动一个字符位。 1CH:每输入一次该指令,整体的画面就向右滚动一个字符位。画面在滚动的时候,每行的首尾是连在一起的,也就是每行的第一个字符,若左移25次,就会显示在该行的最后一格。在画面滚动的过程中,AC的值也是变化的。
  6. 显示模式设定指令,设定了显示几行,显示什么样的点阵字符,数据总线占用几位。 20H:4位总线,单行显示,显示5×7的点阵字符。 24H:4位总线,单行显示,显示5×10的点阵字符。 28H:4位总线,双行显示,显示5×7的点阵字符。 2CH:4位总线,双行显示,显示5×10的点阵字符。 30H:8位总线,单行显示,显示5×7的点阵字符。 34H:8位总线,单行显示,显示5×10的点阵字符。 38H:8位总线,双行显示,显示5×7的点阵字符。这是最常用的一种模式。 3CH:8位总线,双行显示,显示5×10的点阵字符。

代码实例:

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
#include <reg51.h>

#define uint unsigned int
#define uchar unsigned char
#define out P0

sbit LCD_RS=P2^1;
sbit LCD_RW=P2^2;
sbit LCD_E=P2^3;

void delayms(uint);
void check_busy();
void write_cmd(uchar);
void write_dat(uchar);
void string(uchar,uchar);
void lcd_initial();

void main(){
lcd_initial();
while(1){
string(0x85,"Hello");
string(0xc2,"The World");
delayms(100);
write_cmd(0x01);
delayms(100);
}
}

void delayms(uint n){
uint i;
while(n--){
for(i=0;i<113;i++);
}
}

void check_busy(){
uchar dt;
do{
dt=0xff;
LCD_E=0;
LCD_RS=0;
LCD_RW=1;
LCD_E=1;
dt=out;
}while(dt&0x80);
LCD_E=0;
}

void write_cmd(uchar com){
check_busy();
LCD_E=0;
LCD_RS=0;
LCD_RW=0;
out=com;
LCD_E=1;
_nop_();
LCD_E=0;
delayms(1);
}

void write_dat(uchar dat){
check_busy();
LCD_E=0;
LCD_RS=1;
LCD_RW=0;
out=dat;
LCD_E=1;
_nop_();
LCD_E=0;
delayms(1);
}

void string(uchar ad,uchar *s){
write_cmd(ad);
while(*s>0){
write_dat(*s++);
delayms(100);
}
}

void lcd_initial(){
write_cmd(0x38);
write_cmd(0x0c);
write_cmd(0x05);
write_cmd(0x01);
delayms(1);
}

八段数码管

段码表

1
2
3
4
5
//共阳不带点:
uchar code noDot[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
//共阴不带点:
uchar code noDot[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

恰饭,恰饭