📄 cs23-2.lst
字号:
176 1 row=y1>>3; //y1右移3位后赋予row,获得y方向的页地址
177 1 Rddata(); //读取列(x)地址、页(y)地址处的数据
178 1 y=y1&0x07; //计算出该页(1字节)内的y轴点位置地址
179 1 x=0x01;
C51 COMPILER V7.06 CS23_2 02/21/2007 15:26:33 PAGE 4
180 1 x=x<<y; //移入所画点
181 1 Wrdata(cbyte|x); //画上屏幕
182 1 col=x1; //恢复x、y座标
183 1 row=y1;
184 1 } //画点子函数结束
185 /***************全屏幕清屏子函数**********************/
186 void Lcmcls(void) //函数名为Lcmcls的全屏幕清屏子函数
187 { //函数开始
188 1 for(row=0;row<8;row++)
189 1 {for(col=0;col<LCMLIMIT;col++)
190 2 Wrdata(0);} //将数据0写到屏幕
191 1 } //函数结束
192
193 /**********************全屏幕置黑子函数**********************/
194 void Lcmclsxx(void) //函数名为Lcmclsxx的全屏幕置黑子函数
195 { //函数开始
196 1 for(row=0;row<8;row++)
197 1 for(col=0;col<LCMLIMIT;col++)
198 1 Wrdata(255); //将8位数据全1(255)写到屏幕
199 1 } //函数结束
200 /*************读取液晶x列、y页座标处的数据至全局变量cbyte中************/
201 void Rddata(void) //函数名为Rddata的子函数
-
202 { //函数开始
203 1 Locatexy(); //座标定位
204 1 DataPort=0xff; //LCM口置全1
205 1 RS=1; //选择数据寄存器
206 1 RW=1; //选择读
207 1 EN=1; //使能
208 1 cbyte=DataPort; //虚读一次
209 1 EN=0; //禁能
210 1 Locatexy(); //座标定位
211 1 DataPort=0xff; //LCM口置全1
212 1 RS=1; //选择数据寄存器
213 1 RW=1; //选择读
214 1 EN=1; //使能
215 1 cbyte=DataPort; //读取数据(真读)
216 1 EN=0; //禁能
217 1 } //函数结束
218 /**************将数据X写入液晶x列、y页座标处***********/
219 void Wrdata(uchar X) //函数名为Wrdata 的子函数,定义X为无符号字符型变量
-
220 { //函数开始
221 1 Locatexy(); //座标定位
222 1 RS=1; //选择数据寄存器
223 1 RW=0; //选择写
224 1 DataPort=X; //将数据X写入LCM口
225 1 EN=1; //使能
226 1 EN=0; //禁能
227 1 } //函数结束
228 /******************写命令至左区********************/
229 void WrcmdL(uchar X) //函数名为WrcmdL 的子函数,定义X为无符号字符型变量
230 { //函数开始
231 1 lcdbusyL(); //调用左区判忙子函数
232 1 RS=0; //选择指令寄存器
233 1 RW=0; //选择写
234 1 DataPort=X; //数据输出至数据口
235 1 EN=1;EN=0; //使能,禁能
236 1 } //函数结束
237
238 /********************写命令至中区************************/
239 void WrcmdM(uchar X) //函数名为WrcmdM的子函数,定义X为无符号字符型变量
C51 COMPILER V7.06 CS23_2 02/21/2007 15:26:33 PAGE 5
240 { //函数开始
241 1 lcdbusyM(); //调用中区判忙子函数
242 1 RS=0; //选择指令寄存器
243 1 RW=0; //选择写
244 1 DataPort=X; //数据输出至数据口
245 1 EN=1;EN=0; //使能,禁能
246 1 } //函数结束
247 /**************写命令至右区****************
248 void WrcmdR(uchar X) //函数名为WrcmdR的子函数,定义X为无符号字符型变量
249 { //函数开始
250 lcdbusyR(); //调用右区判忙子函数
251 RS=0; //选择指令寄存器
252 RW=0; //选择写
253 DataPort=X; //数据输出至数据口
254 EN=1;EN=0; //使能,禁能
255 } //函数结束
256 ***********************左区判忙子函数***********************/
257 void lcdbusyL(void) //函数名为lcdbusyL 的左区判忙子函数
258 { //函数开始
259 1 CS1=1;CS2=0; //选中左区
260 1 wtcom(); //调用判忙等待子函数
261 1 } //函数结束
262
263 void lcdbusyM(void) //函数名为lcdbusyM的中区判忙子函数
264 { //函数开始
265 1 CS1=0;CS2=1; //选中中区
266 1 wtcom(); //调用判忙等待子函数
267 1 } //函数结束
268
269 /*void lcdbusyR(void) //函数名为lcdbusyR的右区判忙子函数(这里不用)
270 { //函数开始
271 CS1=?;CS2=?; //根据所用LCM器件决定取值
272 wtcom(); //调用判忙等待子函数
273 }*/ //函数结束
274 /***********公用判忙等待子函数********************/
275 void wtcom(void) //函数名为wtcom 的公用判忙等待子函数
276 { //函数开始
277 1 RS=0; //选择指令寄存器
278 1 RW=1; //选择读
279 1 DataPort=0xff; //数据0xff输出至数据口
280 1 EN=1; //使能
281 1 while(DataPort&Lcdbusy);// 若LCM忙则等待
282 1 EN=0; //禁能
283 1 } //函数结束
284 /************根据设定的col、row座标数据,定位LCM下一个操作单元************/
285 void Locatexy(void) //函数名为Locatexy 的子函数
286 { //函数开始
287 1 uchar x,y; //定义x,y为无符号字符型变量
288 1 switch(col&0xc0) //限定x列最大值为192
289 1 {
290 2 case 0:{lcdbusyL();break;} //判左区忙
291 2 case 0x40:{lcdbusyM();break;} //判中区忙
292 2 //case 0x80:{lcdbusyR();break;} //判右区忙(这里不用)
293 2 }
294 1
295 1 x=col&0x3f|SETX; //获得x列(0~63)地址
296 1 y=row&0x07|SETY; //获得y页(0~7)地址
297 1
298 1 wtcom(); //调用判忙等待子函数
299 1 RS=0; //选择指令寄存器
300 1 RW=0; //选择写
301 1 DataPort=y; //y页地址传送至LCM口
C51 COMPILER V7.06 CS23_2 02/21/2007 15:26:33 PAGE 6
302 1 EN=1;EN=0; //使能,禁能
303 1 wtcom(); //调用判忙等待子函数
304 1 RS=0; //选择指令寄存器
305 1 RW=0; //选择写
306 1 DataPort=x; //x列地址传送至LCM口
307 1 EN=1;EN=0; //使能,禁能
308 1 } //函数结束
309 /*******************液晶屏初始化******************************/
310 void Lcminit(void) //函数名为Lcminit的液晶屏初始化子函数
311 { //函数开始
312 1 reset(); //调用复位子函数
313 1 cbyte=DISPFIRST; //定义起始行为0行
314 1 WrcmdL(cbyte); //写命令至左区
315 1 WrcmdM(cbyte); //写命令至中区
316 1 //WrcmdR(cbyte); //写命令至右区(这里不用)
317 1 cbyte=DISPOFF; //关闭显示屏
318 1 WrcmdL(cbyte); //写命令至左区
319 1 WrcmdM(cbyte); //写命令至中区
320 1 //WrcmdR(cbyte); //写命令至右区(这里不用)
321 1 cbyte=DISPON; //打开显示屏
322 1 WrcmdL(cbyte); //写命令至左区
323 1 WrcmdM(cbyte); //写命令至中区
324 1 //WrcmdR(cbyte); //写命令至右区(这里不用)
325 1 Lcmcls(); //清屏
326 1 Delay(10000); //延时一会
327 1 Lcmclsxx(); //全屏置黑
328 1 Delay(10000); //延时一会
329 1 Lcmcls(); //清屏
330 1 Delay(30000); //延时一会
331 1 col=0; //定位x方向为0列
332 1 row=0; //定位y方向为0页
333 1 Locatexy(); //定位0列、0页为LCM下一个操作单元
334 1 } //函数结束
335 /*********************延时子函数**********************/
336 void Delay(unsigned long MS)
337 {
338 1 while(MS!=0)MS--;
339 1 }
340
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 877 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 3 20
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -