LCD1602的MSP430驱动函数

C文件 LCD1602_Driver.c

View Code
   
     
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

View Code
   
     
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);

你可能感兴趣的:(函数)