📄 1602.lst
字号:
C51 COMPILER V7.06 1602 07/15/2007 14:28:26 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE 1602
OBJECT MODULE PLACED IN 1602.OBJ
COMPILER INVOKED BY: C:\Program Files\keil\C51\BIN\C51.EXE 1602.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 //**************************************************************************************
2 //硬件连接:1602VDD接5V,VO接地,BL1接5V,BL2接地,8根数据线接IOA口,RS RW E分别接IOB4-6口
3 //**************************************************************************************
4 sfr OEA = 0xB2;
5 sfr IOA = 0x80;
6 sfr IOD = 0xB0;
7 sfr IOB = 0x90;
8 sfr OED = 0xB5;
9 sfr OEB = 0xB3;
10 #include <string.h>
11 #define Busy 0x80 //用于检测LCM状态字中的Busy标识
12 #define LCM_Data IOA
13 sbit LCM_RS=IOB^4; //寄存器选择
14 sbit LCM_RW=IOB^5; //读/写控制
15 sbit LCM_E=IOB^6; //读/写使能
16 int i,j;
17
18 //自定义字符列表
19 //=====================================================================================
20 unsigned char character0[8] = {0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02}, //年
21 character1[8] = {0x0f,0x09,0x0f,0x09,0x0f,0x09,0x0b,0x11}, //月
22 character2[8] = {0x0f,0x09,0x09,0x09,0x0f,0x09,0x09,0x0f}, //日
23
24 characterN[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //日
25 //=====================================================================================
26
27
28 //=====================================================================================
29 //延时程序
30 //=====================================================================================
31 void Delay5Ms(void)
32 {
33 1 unsigned long int TempCyc = 5552;
34 1 while(TempCyc--);
35 1 }
36
37 void Delay400Ms(void)
38 {
39 1 unsigned char TempCycA = 5;
40 1 unsigned int TempCycB;
41 1 while(TempCycA--)
42 1 {
43 2 TempCycB=7269;
44 2 while(TempCycB--);
45 2 };
46 1 }
47
48
49 //=====================================================================================
50 //读写子程序
51 //=====================================================================================
52
53 //读数据
54 unsigned char ReadDataLCM(void)
55 {
C51 COMPILER V7.06 1602 07/15/2007 14:28:26 PAGE 2
56 1 LCM_RS = 1;
57 1 LCM_RW = 1;
58 1 LCM_E = 1;
59 1 LCM_E = 0;
60 1 for(i=0;i<100;i++);
61 1 LCM_E = 1;
62 1 return(LCM_Data);
63 1 }
64
65 //读状态
66 unsigned char ReadStatusLCM(void)
67 {
68 1 LCM_Data = 0xFF;
69 1 LCM_RS = 0;
70 1 LCM_RW = 1;
71 1 LCM_E = 1;
72 1 LCM_E = 0;
73 1 for(i=0;i<100;i++);
74 1 LCM_E = 1;
75 1 //while (LCM_Data & Busy); //检测忙信号
76 1 return(LCM_Data);
77 1 }
78 //写数据
79 void WriteDataLCM(unsigned char WDLCM)
80 {
81 1 ReadStatusLCM(); //检测忙
82 1 LCM_Data = WDLCM;
83 1 LCM_RS = 1;
84 1 LCM_RW = 0;
85 1 LCM_E = 1;
86 1 LCM_E = 0; //若晶振速度太高可以在这后加小的延时
87 1 for(i=0;i<100;i++);//延时
88 1 LCM_E = 1;
89 1 }
90
91 //写指令
92 void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
93 {
94 1 if (BuysC) ReadStatusLCM(); //根据需要检测忙
95 1 LCM_Data = WCLCM;
96 1 LCM_RS = 0;
97 1 LCM_RW = 0;
98 1 LCM_E = 1;
99 1 LCM_E = 0;
100 1 for(i=0;i<100;i++);
101 1 LCM_E = 1;
102 1 }
103
104 //=====================================================================================
105 //初始化子程序
106 //=====================================================================================
107
108 void LCMInit(void) //LCM初始化
109 {
110 1 LCM_Data = 0;
111 1 WriteCommandLCM(0x38,0); // 三次显示模式设置,不检测忙信号
112 1 Delay5Ms();
113 1 WriteCommandLCM(0x38,0);
114 1 Delay5Ms();
115 1 WriteCommandLCM(0x38,0);
116 1 Delay5Ms();
117 1 WriteCommandLCM(0x38,1); // 显示模式设置,开始要求每次检测忙信号
C51 COMPILER V7.06 1602 07/15/2007 14:28:26 PAGE 3
118 1 Delay5Ms();
119 1 WriteCommandLCM(0x08,1); // 关闭显示
120 1 Delay5Ms();
121 1 WriteCommandLCM(0x01,1); // 清屏
122 1 Delay5Ms();
123 1 WriteCommandLCM(0x06,1); // 显示光标移动设置
124 1 Delay5Ms();
125 1 WriteCommandLCM(0x0c,1); // 显示开及光标设置
126 1 Delay5Ms();
127 1 }
128
129
130 //=====================================================================================
131 //按指定位置显示一个字符
132 //=====================================================================================
133
134 void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
135 {
136 1 Y &= 0x1;
137 1 X &= 0xF; //限制X不能大于15,Y不能大于1
138 1 if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
139 1 X |= 0x80; //算出指令码
140 1 WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码
141 1 WriteDataLCM(DData);
142 1 }
143
144 //=====================================================================================
145 //按指定位置显示一串字符
146 //void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
147 //说明: x(0-15):x参数 y(0-1):y参数 DData(字符串):要显示的内容(英文、数字、符号)
148 //=====================================================================================
149
150 void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
151 {
152 1 unsigned char ListLength,j;
153 1 ListLength = strlen(DData);
154 1 Y &= 0x1;
155 1 X &= 0xF; //限制X不能大于15,Y不能大于1
156 1 if (X <= 0xF) //X坐标应小于0xF
157 1 {
158 2 for(j=0;j<ListLength;j++)
159 2 {
160 3 DisplayOneChar(X, Y, DData[j]); //显示单个字符
161 3 X++;
162 3 }
163 2 }
164 1 }
165
166 //=====================================================================================
167 //显示自定义字符
168 //void mychar(char xx,char yy,unsigned char *character,unsigned char saveto)
169 //说明:xx(0-15):为x参数.yy(0-1):y参数.character:要显示的字符的列表地址,在程序前面有定义
170 //saveto(1-7)为字符保存的RAM,每屏最多显示7个自定义字符
171 //(0x00-0x0h是自定义字符)
172 //=====================================================================================
173
174 void mychar(char xx,char yy,unsigned char *character,unsigned char saveto)
175 {
176 1 unsigned char add = (saveto<<3) | 0x40;
177 1 unsigned char t; //临时变量,每一行的值
178 1
179 1 t=*(character+0);
C51 COMPILER V7.06 1602 07/15/2007 14:28:26 PAGE 4
180 1 WriteCommandLCM(add, 0); //第1行
181 1 WriteDataLCM(t);
182 1 t=*(character+1);
183 1 WriteCommandLCM(add+1, 0); //第2行
184 1 WriteDataLCM(t);
185 1 t=*(character+2);
186 1 WriteCommandLCM(add+2, 0); //第3行
187 1 WriteDataLCM(t);
188 1 t=*(character+3);
189 1 WriteCommandLCM(add+3, 0); //第4行
190 1 WriteDataLCM(t);
191 1 t=*(character+4);
192 1 WriteCommandLCM(add+4, 0); //第5行
193 1 WriteDataLCM(t);
194 1 t=*(character+5);
195 1 WriteCommandLCM(add+5, 0); //第6行
196 1 WriteDataLCM(t);
197 1 t=*(character+6);
198 1 WriteCommandLCM(add+6, 0); //第7行
199 1 WriteDataLCM(t);
200 1 t=*(character+7);
201 1 WriteCommandLCM(add+7, 0); //第8行
202 1 WriteDataLCM(t);
203 1
204 1 DisplayOneChar(xx,yy,saveto); //显示字符
205 1 }
206 //=====================================================================================
207 //主函数
208 //=====================================================================================
209
210 main()
211 {
212 1 OEA=0xff;
213 1 OEB=0xff;
214 1 OED=0xff; //68013IO口初始化
215 1 Delay400Ms();
216 1 LCMInit();
217 1 Delay400Ms(); //1602初始化
218 1 while(1)
219 1 {
220 2 DisplayListChar(0,0,"This is ListChar");
221 2 DisplayListChar(0,1,"!");
222 2 for(j=0;j<30;j++)for(i=0;i<30000;i++);
223 2 WriteCommandLCM(0x01,1); //清屏
224 2 Delay5Ms();
225 2
226 2 DisplayListChar(0,0,"This is OneChar:");
227 2 DisplayOneChar(0,1,0x4f);
228 2 DisplayOneChar(1,1,0x6e);
229 2 DisplayOneChar(2,1,0x65);
230 2 DisplayOneChar(3,1,0x21);
231 2 for(j=0;j<30;j++)for(i=0;i<30000;i++);
232 2 WriteCommandLCM(0x01,1); //清屏
233 2 Delay5Ms();
234 2
235 2 DisplayListChar(0,0,"This is MyChar:");
236 2 mychar(0,1, character0,1);
237 2 mychar(1,1, character1,2);
238 2 mychar(2,1, character2,3);
239 2 for(j=0;j<30;j++)for(i=0;i<30000;i++);
240 2 WriteCommandLCM(0x01,1); //清屏
241 2 Delay5Ms();
C51 COMPILER V7.06 1602 07/15/2007 14:28:26 PAGE 5
242 2 }
243 1 }
244
245
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 844 ----
CONSTANT SIZE = 52 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 36 15
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 + -