C文件 LCD1602_Driver.c
1 /**************引用头文件***************/
2 #include <msp430F149.h> //视具体单片机型号引用不同头文件
3 #include "LCD1602_Driver.h"
4 #define uchar unsigned char
5 #define uint unsigned int
6
7 /**************接口定义***************/
8 #define DataDir P4DIR //8位数据线=P4口
9 #define DataPort P4OUT
10 #define DataIn P4IN
11 #define Busy 0x80 //Busy信号为数据线最高位BIT7
12 #define CtrlDir P3DIR
13 #define CLR_RS P3OUT&=~BIT0; //RS = P3.0
14 #define SET_RS P3OUT|=BIT0;
15 #define CLR_RW P3OUT&=~BIT1; //RW = P3.1
16 #define SET_RW P3OUT|=BIT1;
17 #define CLR_EN P3OUT&=~BIT2; //EN = P3.2
18 #define SET_EN P3OUT|=BIT2;
19
20 /*******************************************
21 函数名称:LcdWriteCommand
22 功 能:向液晶模块写入命令
23 参 数:cmd--命令,
24 chk--是否判忙的标志,1:判忙,0:不判
25 返回值 :无
26 ********************************************/
27 void LcdWriteCommand(uchar cmd,uchar chk)
28 {
29
30 if (chk) CheckBusy(); // 检测忙信号?
31
32 CLR_RS;
33 CLR_RW;
34 _NOP();
35
36 DataPort = cmd; //将命令字写入数据端口
37 _NOP();
38
39 SET_EN; //产生使能脉冲信号
40 _NOP();
41 _NOP();
42 CLR_EN;
43 }
44
45 /*******************************************
46 函数名称:LcdWriteData
47 功 能:向液晶显示的当前地址写入显示数据
48 参 数:data--显示字符数据
49 返回值 :无
50 ********************************************/
51 void LcdWriteData( uchar DataByte )
52 {
53 CheckBusy(); //等待液晶不忙
54
55 SET_RS;
56 CLR_RW;
57 _NOP();
58
59 DataPort = data; //将显示数据写入数据端口
60 _NOP();
61
62 SET_EN; //产生使能脉冲信号
63 _NOP();
64 _NOP();
65 CLR_EN;
66 }
67 /*******************************************
68 函数名称:CheckBusy
69 功 能:检测1602是否忙,等待1602液晶完成内部操作
70 参 数:无
71 返回值 :无
72 ********************************************/
73 void CheckBusy(void)
74 {
75 DataDir &= 0x00; //将P4口切换为输入状态
76
77 CLR_RS;
78 SET_RW;
79 _NOP();
80 SET_EN;
81 _NOP();
82 _NOP();
83
84 while((DataIN & Busy)!=0); //检测忙标志
85
86 CLR_EN;
87
88 DataDir |= 0xFF; //将P4口切换为输出状态
89 }
90
91 /*******************************************
92 函数名称:Delay5ms
93 功 能:延时约5ms
94 参 数:无
95 返回值 :无
96 ********************************************/
97 void Delay5ms(void)
98 {
99 uint i=40000;
100 while (i != 0)
101 {
102 i--;
103 }
104 }
105
106 /*******************************************
107 函数名称:LcdReset
108 功 能:对1602液晶模块进行复位操作
109 参 数:无
110 返回值 :无
111 ********************************************/
112 void LcdReset(void)
113 {
114 CtrlDir |= 0x07; //控制线端口设为输出状态
115 DataDir = 0xFF; //数据端口设为输出状态
116
117 LcdWriteCommand(0x38, 0); //规定的复位操作
118 Delay5ms();
119 LcdWriteCommand(0x38, 0);
120 Delay5ms();
121 LcdWriteCommand(0x38, 0);
122 Delay5ms();
123
124 LcdWriteCommand(0x38, 1); //显示模式设置
125 LcdWriteCommand(0x08, 1); //显示关闭
126 LcdWriteCommand(0x01, 1); //显示清屏
127 LcdWriteCommand(0x06, 1); //写字符时整体不移动
128 LcdWriteCommand(0x0c, 1); //显示开,不开游标,不闪烁
129 }
130 /*******************************************
131 函数名称:LocateXY
132 功 能:向液晶输入显示字符位置的坐标信息
133 参 数:x--位置的列坐标0-15
134 y--位置的行坐标0-1
135 返回值 :无
136 ********************************************/
137 void LocateXY(uchar x,uchar y)
138 {
139 uchar temp;
140
141 temp = x&0x0f;
142 y &= 0x01;
143 if(y) temp |= 0x40; //如果在第2行
144 temp |= 0x80;//第一行为0x80,第二行为0x80+0x40
145
146 LcdWriteCommand(temp,1);
147 }
148 /*******************************************
149 函数名称:Disp1Char
150 功 能:在某个位置显示一个字符
151 参 数:x--位置的列坐标0-15
152 y--位置的行坐标0-1
153 data--显示的字符数据
154 返回值 :无
155 ********************************************/
156 void Disp1Char(uchar x,uchar y,uchar DataByte)
157 {
158 LocateXY( x, y );
159 LcdWriteData( DataByte );
160 }
161 /***********************************************
162 函数名称:DispStr
163 功 能:让液晶从某个位置起连续显示一个字符串
164 参 数:x--位置的列坐标0-15
165 y--位置的行坐标0-1
166 ptr--指向字符串存放位置的指针
167 返回值 :无
168 ***********************************************/
169 void DispStr(uchar x,uchar y,uchar *ptr)
170 {
171 uchar *temp;
172 uchar i,n = 0;
173
174 temp = ptr;
175 while(*ptr++ != '\0') n++; //计算字符串有效字符的个数
176
177 for (i=0;i<n;i++)
178 {
179 Disp1Char(x++,y,temp[i]);
180 if (x == 0x0f)
181 {
182 x = 0;
183 y ^= 1;//异或操作,换行
184 }
185 }
186 }
187 /*******************************************
188 函数名称:DispNchar
189 功 能:让液晶从某个位置起连续显示N个字符
190 参 数:x--位置的列坐标0-15
191 y--位置的行坐标0-1
192 n--字符个数
193 ptr--指向字符存放位置的指针
194 返回值 :无
195 ********************************************/
196 void DispNChar(uchar x,uchar y, uchar n,uchar *ptr)
197 {
198 uchar i;
199
200 for (i=0;i<n;i++)
201 {
202 Disp1Char(x++,y,ptr[i]);
203 if (x == 0x0f)
204 {
205 x = 0;
206 y ^= 1;
207 }
208 }
209 }
相应头文件 LCD1602_Driver.h
1 #define uchar unsigned char
2 #define uint unsigned int
3 /**************底层函数***************/
4 void LcdWriteCommand(uchar cmd,uchar chk);
5 void LcdWriteData( uchar DataByte );
6 void CheckBusy(void);
7 void Delay5ms(void);
8 /**************功能函数***************/
9 void LcdReset(void);
10 void LocateXY(uchar x,uchar y);
11 void Disp1Char(uchar x,uchar y,uchar DataByte);
12 void DispStr(uchar x,uchar y,uchar *ptr);
13 void DispNChar(uchar x,uchar y, uchar n,uchar *ptr);
|