📄 lcd1602.lst
字号:
C51 COMPILER V8.02 LCD1602 06/29/2007 20:03:16 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE LCD1602
OBJECT MODULE PLACED IN Lcd1602.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Lcd1602.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <c8051f020.h>
2 #include "lcd1602.h"
3 #define uchar unsigned char
4 #define uint unsigned int
5
6
7 //-----------------------------------------------------------------------------
8 // Adress Set
9 //-----------------------------------------------------------------------------
10 #define Data_Port P5 // P5作为数据通信口
11 #define Contro_Port P4 // P4作为控制端口时,只取0-2,P4.0-RS P4.1-R/W P4.2-E
12
13
14 //-----------------------------------------------------------------------------
15 // Mode Set
16 //-----------------------------------------------------------------------------
17
18
19 uchar column=1,row=1;
20
21 //-----------------------------------------------------------------------------
22 // Function PROTOTYPES
23 //-----------------------------------------------------------------------------
24 //void Dis_decode_data(uint decode_data );
25
26 void Lcd1602_Ini(void);
27 void Lcd1602_Check_Busy(void);
28
29 void Lcd1602_Write_Command(unsigned char Command_Code) reentrant; // 为了解决可重入函数,需加上reentrant
30 void Lcd1602_Write_Data(unsigned char Data) reentrant ;
31 void Lcd1602_Write_char(unsigned char i);
32 void Lcd1602_Write_String(unsigned char row,unsigned char column,unsigned char *dis_buffer)reentrant;
33
34 //void Lcd1602_Clear_Char(unsigned char row,unsigned char column);
35 void Lcd1602_Clear_Line(unsigned char line);
36 //void Lcd1602_Clear_All(void);
37
38 void delay1(uchar t1,t2);
39
40
41 void Lcd1602_Ini(void)
42 {
43 1
44 1 Lcd1602_Write_Command(0x38);
45 1 Lcd1602_Write_Command(0x0c);//开显示,不显示光标
46 1 Lcd1602_Write_Command(0x01);//显示清屏。
47 1 Lcd1602_Write_Command(0x06);//显示光标自动右移,整屏不移动。
48 1 Lcd1602_Write_Command(0x80);//将数据指针设置到第一行的第一个字符。
49 1 Lcd1602_Write_Command(0x02);
50 1 Lcd1602_Write_Command(0x0c);//开显示,不显示光标
51 1 Lcd1602_Write_Command(0x80);
52 1 }
53
54 //===========================
55 //LCD状态检测 该函数有改动?????
C51 COMPILER V8.02 LCD1602 06/29/2007 20:03:16 PAGE 2
56 //===========================
57 void Lcd1602_Check_Busy(void)
58 {
59 1 unsigned char bf,temp;
60 1
61 1 Contro_Port=0x02; //RS=0,RW=1
62 1 delay1(1,10);
63 1
64 1 temp=Data_Port; // 是否要打开LCD使能信号E????
65 1 bf = temp&0x80 ; //筛选最高位的标志位
66 1
67 1 while(bf==1);
68 1 }
69
70
71 //*********************************************
72 //以下几个函数为支持LCD数据传送和控制的底层函数
73 //*********************************************
74
75 //===========================
76 //写一个命令字节
77 //===========================
78 void Lcd1602_Write_Command(unsigned char Command_Code) reentrant // 为了解决可重入函数,需加上reentrant
79 {
80 1
81 1 Lcd1602_Check_Busy();
82 1
83 1 Contro_Port=0x00; //RS=0,RW=0
84 1 Data_Port=Command_Code;
85 1
86 1 delay1(10,10);
87 1 Contro_Port |=0x04; //EN=1 把Contro_Port.2 置1
88 1 delay1(10,10); // 延时产生一个脉冲
89 1 Contro_Port &=~0x04; //EN=0 把Contro_Port.2 置0
90 1 Contro_Port =0xef;
91 1 }
92
93
94 //===========================
95 //写一个字节数据 该函数中 Contro_Port |=0x04; 有改动?????
96 //===========================
97 void Lcd1602_Write_Data(unsigned char Data) reentrant
98 {
99 1
100 1 Lcd1602_Check_Busy();
101 1
102 1 Contro_Port=0x01; //RS=1,RW=0
103 1 Data_Port=Data;
104 1
105 1 delay1(10,10);
106 1 Contro_Port |=0x04; //EN=1 把Contro_Port.2 置1
107 1 delay1(10,10); // 延时产生一个脉冲
108 1 Contro_Port &=~0x04; //EN=0 把Contro_Port.2 置0
109 1 Contro_Port =0xef;
110 1 }
111
112
113
114 //===========================================
115 //写字符串到LCD,如果一行写不下,则写到下一行,
116 //如果一屏写不下,则只写一屏
117 //row的值从1-2,column的值从1-16,不进行值的
C51 COMPILER V8.02 LCD1602 06/29/2007 20:03:16 PAGE 3
118 //有效性检查,有调用者自己保证
119 //===========================================
120
121 void Lcd1602_Write_String(unsigned char row_str,unsigned char column_str,unsigned char *dis_buffer) reent
-rant
122 {
123 1 unsigned char i=0;
124 1 row=row_str; column=column_str;
125 1
126 1 switch(row)//这种结构保持以后升级到多行显示液晶
127 1 {
128 2 case 1:Lcd1602_Write_Command(0x80+column-1);break; //将数据地址指针定位到第一行
129 2 case 2:Lcd1602_Write_Command(0x80+0x40+column-1);break; //将数据地址指针定位到第二行
130 2 default: break;
131 2 }
132 1 while(dis_buffer[i]!='\0')
133 1 {
134 2 Lcd1602_Write_Data(dis_buffer[i]);
135 2 i++;
136 2 if(++column==17)
137 2 {
138 3 column=1;
139 3 if(++row==3)
140 3 return;
141 3 else
142 3 {
143 4 switch(row)//这种结构保持以后升级到多行显示液晶
144 4 {
145 5 case 1:Lcd1602_Write_Command(0x80);break;
146 5 case 2:Lcd1602_Write_Command(0x80+0x40);break;//重新调整数据地址指针
147 5 default:break;
148 5 }
149 4 }
150 3 }
151 2 }
152 1 }
153
154
155
156
157
158
159
160
161
162 void Lcd1602_Write_char(unsigned char i)
163 {
164 1
165 1 if(i==0)return;
166 1 switch(row) //这种结构保持以后升级到多行显示液晶
167 1 {
168 2 case 1:Lcd1602_Write_Command(0x80+column-1);break; //将数据地址指针定位到第一行
169 2 case 2:Lcd1602_Write_Command(0x80+0x40+column-1);break; //将数据地址指针定位到第二行
170 2 default:break;
171 2 }
172 1
173 1 Lcd1602_Write_Data(i);
174 1
175 1 if(++column==17)
176 1 {
177 2 column=1;
178 2 if(++row==3)
C51 COMPILER V8.02 LCD1602 06/29/2007 20:03:16 PAGE 4
179 2 row=1;
180 2 }
181 1 }
182
183
184
185
186 void delay1(uchar t1,t2)
187 {
188 1 uchar i,j;
189 1 for(i=0;i<t1;i++)
190 1 for(j=0;j<t2;j++);
191 1
192 1 }
193
194 //==========================================
195 //清除指定的行,光标返回最左边第一个字符位置
196 //==========================================
197 void Lcd1602_Clear_Line(unsigned char line)
198 {
199 1 Lcd1602_Write_String(line,1," ");
200 1
201 1 switch(line)// 将数据地址指针返回到起始位置 这种结构保持以后升级到多行显示液晶
202 1 {
203 2 case 1:Lcd1602_Write_Command(0x80);break; //将数据地址指针定位到第一行
204 2 case 2:Lcd1602_Write_Command(0x80+0x40);break; //将数据地址指针定位到第二行
205 2 default: break;
206 2 }
207 1 }
208 /*
209 void Dis_decode_data(uint decode_data )
210 {
211 uchar k[5],i;
212
213 k[0]=(uchar)(decode_data/10000);
214 k[1]=(uchar)((decode_data-k[0]*10000)/1000);
215 k[2]=(uchar)((decode_data-k[0]*10000-k[1]*1000)/100);
216 k[3]=(uchar)((decode_data-k[0]*10000-k[1]*1000-k[2]*100)/10);
217 k[4]=(uchar)((decode_data-k[0]*10000-k[1]*1000-k[2]*100)-k[3]*10/1);
218
219 for(i=0;i<5;i++)
220 { Lcd1602_Write_char(k[i]+'0');}
221 } */
222
223 /*
224 void Lcd1602_Clear_All(void)
225 {
226 Lcd1602_Write_Command(0x01);//显示清屏。
227 Lcd1602_Write_Command(0x80);//将数据指针设置到第一行的第一个字符。
228 }
229
230
231 //==================================================
232 //清除指定的位置的字符,光标返回最左边第一个字符位置
233 //==================================================
234 void Lcd1602_Clear_Char(unsigned char row,unsigned char column)
235 {
236 Lcd1602_Write_String(row,column,"");
237 } */
MODULE INFORMATION: STATIC OVERLAYABLE
C51 COMPILER V8.02 LCD1602 06/29/2007 20:03:16 PAGE 5
CODE SIZE = 393 ----
CONSTANT SIZE = 17 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 2 2
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -