📄 lcd1602.lst
字号:
C51 COMPILER V8.02 LCD1602 09/13/2007 16:35:02 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE LCD1602
OBJECT MODULE PLACED IN Lcd1602.OBJ
COMPILER INVOKED BY: d:\Keil3\C51\BIN\C51.EXE Lcd1602.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #define Lcd1602
2 #include <Lcd1602.h>
3
4 void Lcd1602_Ini(void)
5 {
6 1
7 1 Lcd1602_Write_Command(0x38);
8 1 Lcd1602_Write_Command(0x0f);//开显示,不显示光标
9 1 Lcd1602_Write_Command(0x01);//显示清屏。
10 1 Lcd1602_Write_Command(0x06);//显示光标自动右移,整屏不移动。
11 1 Lcd1602_Write_Command(0x80);//将数据指针设置到第一行的第一个字符。
12 1 Lcd1602_Write_Command(0x02);
13 1 Lcd1602_Write_Command(0x0f);//开显示,不显示光标
14 1 Lcd1602_Write_Command(0x80);
15 1 }
16
17 //===========================
18 //LCD状态检测 该函数有改动?????
19 //===========================
20 void Lcd1602_Check_Busy(void)
21 {
22 1 unsigned char bf,temp;
23 1
24 1 Contro_Port=0x02; //RS=0,RW=1
25 1 delay(1,10);
26 1
27 1 temp=Data_Port; // 是否要打开LCD使能信号E????
28 1 bf = temp&0x80 ; //筛选最高位的标志位
29 1
30 1 while(bf==1);
31 1 }
32
33
34 //*********************************************
35 //以下几个函数为支持LCD数据传送和控制的底层函数
36 //*********************************************
37
38 //===========================
39 //写一个命令字节
40 //===========================
41 void Lcd1602_Write_Command(unsigned char Command_Code) reentrant // 为了解决可重入函数,需加上reentrant
42 {
43 1
44 1 Lcd1602_Check_Busy();
45 1
46 1 Contro_Port=0x00; //RS=0,RW=0
47 1 Data_Port=Command_Code;
48 1
49 1 delay(10,10);
50 1 Contro_Port |=0x04; //EN=1 把Contro_Port.2 置1
51 1 delay(10,10); // 延时产生一个脉冲
52 1 Contro_Port &=~0x04; //EN=0 把Contro_Port.2 置0
53 1 Contro_Port =0xef;
54 1 }
55
C51 COMPILER V8.02 LCD1602 09/13/2007 16:35:02 PAGE 2
56
57 //===========================
58 //写一个字节数据 该函数中 Contro_Port |=0x04; 有改动?????
59 //===========================
60 void Lcd1602_Write_Data(unsigned char Data)
61 {
62 1
63 1 Lcd1602_Check_Busy();
64 1
65 1 Contro_Port=0x01; //RS=1,RW=0
66 1 Data_Port=Data;
67 1
68 1 delay(10,10);
69 1 Contro_Port |=0x04; //EN=1 把Contro_Port.2 置1
70 1 delay(10,10); // 延时产生一个脉冲
71 1 Contro_Port &=~0x04; //EN=0 把Contro_Port.2 置0
72 1 Contro_Port =0xef;
73 1 }
74
75
76
77 //===========================================
78 //写字符串到LCD,如果一行写不下,则写到下一行,
79 //如果一屏写不下,则只写一屏
80 //row的值从1-2,column的值从1-16,不进行值的
81 //有效性检查,有调用者自己保证
82 //===========================================
83
84 void Lcd1602_Write_String(unsigned char row_str,unsigned char column_str,unsigned char *dis_buffer) reent
-rant
85 {
86 1 unsigned char i=0;
87 1 row=row_str; column=column_str;
88 1
89 1 switch(row)//这种结构保持以后升级到多行显示液晶
90 1 {
91 2 case 1:Lcd1602_Write_Command(0x80+column-1);break; //将数据地址指针定位到第一行
92 2 case 2:Lcd1602_Write_Command(0x80+0x40+column-1);break; //将数据地址指针定位到第二行
93 2 default: break;
94 2 }
95 1 while(dis_buffer[i]!='\0')
96 1 {
97 2 Lcd1602_Write_Data(dis_buffer[i]);
98 2 i++;
99 2 if(++column==17)
100 2 {
101 3 column=1;
102 3 if(++row==3)
103 3 return;
104 3 else
105 3 {
106 4 switch(row)//这种结构保持以后升级到多行显示液晶
107 4 {
108 5 case 1:Lcd1602_Write_Command(0x80);break;
109 5 case 2:Lcd1602_Write_Command(0x80+0x40);break;//重新调整数据地址指针
110 5 default:break;
111 5 }
112 4 }
113 3 }
114 2 }
115 1 }
116
C51 COMPILER V8.02 LCD1602 09/13/2007 16:35:02 PAGE 3
117 void Lcd1602_Write_char(unsigned char i)
118 {
119 1
120 1 if(i==0)return;
121 1 switch(row) //这种结构保持以后升级到多行显示液晶
122 1 {
123 2 case 1:Lcd1602_Write_Command(0x80+column-1);break; //将数据地址指针定位到第一行
124 2 case 2:Lcd1602_Write_Command(0x80+0x40+column-1);break; //将数据地址指针定位到第二行
125 2 default:break;
126 2 }
127 1
128 1 Lcd1602_Write_Data(i);
129 1
130 1 if(++column==17)
131 1 {
132 2 column=1;
133 2 if(++row==3)
134 2 row=1;
135 2 }
136 1 }
137
138 void delay(uchar t1,t2)
139 {
140 1 uchar i,j;
141 1 for(i=0;i<t1;i++)
142 1 for(j=0;j<t2;j++);
143 1
144 1 }
145
146 //==========================================
147 //清除指定的行,光标返回最左边第一个字符位置
148 //==========================================
149 void Lcd1602_Clear_Line(unsigned char line)
150 {
151 1 Lcd1602_Write_String(line,1," ");
152 1
153 1 switch(line)// 将数据地址指针返回到起始位置 这种结构保持以后升级到多行显示液晶
154 1 {
155 2 case 1:Lcd1602_Write_Command(0x80);break; //将数据地址指针定位到第一行
156 2 case 2:Lcd1602_Write_Command(0x80+0x40);break; //将数据地址指针定位到第二行
157 2 default: break;
158 2 }
159 1 }
160 /*
161 void Dis_decode_data(uint decode_data )
162 {
163 uchar k[5],i;
164
165 k[0]=(uchar)(decode_data/10000);
166 k[1]=(uchar)((decode_data-k[0]*10000)/1000);
167 k[2]=(uchar)((decode_data-k[0]*10000-k[1]*1000)/100);
168 k[3]=(uchar)((decode_data-k[0]*10000-k[1]*1000-k[2]*100)/10);
169 k[4]=(uchar)((decode_data-k[0]*10000-k[1]*1000-k[2]*100)-k[3]*10/1);
170
171 for(i=0;i<5;i++)
172 { Lcd1602_Write_char(k[i]+'0');}
173 } */
174
175 /*
176 void Lcd1602_Clear_All(void)
177 {
178 Lcd1602_Write_Command(0x01);//显示清屏。
C51 COMPILER V8.02 LCD1602 09/13/2007 16:35:02 PAGE 4
179 Lcd1602_Write_Command(0x80);//将数据指针设置到第一行的第一个字符。
180 }
181
182
183 //==================================================
184 //清除指定的位置的字符,光标返回最左边第一个字符位置
185 //==================================================
186 void Lcd1602_Clear_Char(unsigned char row,unsigned char column)
187 {
188 Lcd1602_Write_String(row,column,"");
189 } */
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 393 ----
CONSTANT SIZE = 17 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 2 3
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 + -