/
LCD.c
153 lines (132 loc) · 3.71 KB
/
LCD.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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
//=========================================================================
//【版权】(C) COPYRIGHT 2009 天祥电子 WWW.TXMCU.COM ALL RIGHTS RESERVED
//【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!
//=========================================================================
//=============================================================
//维护记录:2009-8-23 v1.0 by xgc
// 2010-1-30 v1.1 by xgc 修改了LCD显示BUG
//
//代码作者: 相广超 xgc94418297.blog.163.com
//=============================================================
#include "LCD.h"
//====================================================================//
// 语法格式: void delay(uint z)
// 实现功能:毫秒级延时函数
// 参 数:z -- ms
// 返 回 值:无
//====================================================================//
void delay(uint z)
{
uint x, y;
for (x = z; x > 0; x--)
for(y = 110; y > 0; y--);
}
//====================================================================//
// 语法格式: static bit Lcd_Busy(void)
// 实现功能:检查LCD忙状态。为1时,忙,等待。为0时,闲,可写指令与数据。
// 参 数:无
// 返 回 值:忙状态
//====================================================================//
static bit Lcd_Busy(void)
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
DelayNOP();
result = (bit)(P0&0x80);
LCD_EN = 0;
return(result);
}
//====================================================================//
// 语法格式:void Lcd_WriteCmd(uchar cmd)
// 实现功能:写指令数据到LCD
// 参 数:要写入的指令
// 返 回 值:无
//====================================================================//
void Lcd_WriteCmd(uchar cmd)
{
while(Lcd_Busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
DelayNOP();
LCD_EN = 1;
DelayNOP();
LCD_EN = 0;
}
//====================================================================//
// 语法格式:void Lcd_WriteDat(uchar dat)
// 实现功能:写显示数据到LCD
// 参 数:要显示的数据
// 返 回 值:无
//====================================================================//
void Lcd_WriteDat(uchar dat)
{
while(Lcd_Busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
DelayNOP();
LCD_EN = 1;
DelayNOP();
LCD_EN = 0;
}
//====================================================================//
// 语法格式:void Lcd_Init(void)
// 实现功能:LCD初始化
// 参 数:无
// 返 回 值:无
//====================================================================//
void Lcd_Init(void)
{
LCD_PSB = 1; //并口方式
Lcd_WriteCmd(0x34); //扩充指令操作
delay(5);
Lcd_WriteCmd(0x30); //基本指令操作
delay(5);
Lcd_WriteCmd(0x0C); //显示开,关光标
delay(5);
Lcd_WriteCmd(0x01); //清除LCD的显示内容
delay(5);
}
//====================================================================//
// 语法格式:void Lcd_SetPos(uchar X,uchar Y)
// 实现功能:设定显示位置
// 参 数:X - 行,Y - 列
// 返 回 值:无
//====================================================================//
void Lcd_SetPos(uchar X,uchar Y)
{
uchar pos;
if (X==0)
{X=0x80;}
else if (X==1)
{X=0x90;}
else if (X==2)
{X=0x88;}
else if (X==3)
{X=0x98;}
pos = X+Y ;
Lcd_WriteCmd(pos); //显示地址
}
//====================================================================//
// 语法格式:void Lcd_DispLine(uchar line, uchar pos, uchar *str)
// 实现功能:显示一行字符
// 参 数:line - 指定行,pos - 指定位置(列) str - 字符串
// 返 回 值:无
//====================================================================//
void Lcd_DispLine(uchar line, uchar pos, uchar *str)
{
int i = 0;
Lcd_SetPos(line, pos);
while (str[i] != '\0')
{
Lcd_WriteDat(str[i]);
i++;
}
}