📄 340_lcd.lst
字号:
218
219 void writecode(uchar ins) //向液晶控制模块写命令
220 {
221 1 uchar xdata t;
222 1 uint xdata j;
223 1
224 1 for(j=0;j<500;j++);
225 1 virt_port|=ins&0xf0; //取高字节向1602写数据
226 1 writelcd(virt_port); //先写高4位后再写低4位 这是在选择四个数据线的时候
227 1
228 1 virt_port|=0x08;
229 1 writelcd(virt_port); //使能E脚为高电平
230 1 virt_port&=~0x08;
231 1 writelcd(virt_port); //使能E脚为低电平
232 1
233 1 t=ins<<4;
234 1 virt_port|=t&0xf0; //取低字节向1602写数据
235 1 writelcd(virt_port);
236 1 virt_port|=0x08; //使能E脚为高电平
237 1 writelcd(virt_port);
238 1 virt_port&=~0x08; //使能E脚为低电平
239 1 writelcd(virt_port);
C51 COMPILER V8.05a 340_LCD 05/16/2009 15:36:50 PAGE 5
240 1 virt_port=0;
241 1 writelcd(virt_port);
242 1 }
243
244 void writedata(uchar d) //写数据到1602
245 {
246 1 uchar xdata i,t;
247 1 uint xdata j;
248 1
249 1 for(j=0;j<500;j++);
250 1 virt_port|=0x02; //光标返回指令
251 1 writelcd(virt_port);
252 1 virt_port|=d&0xf0; //取高字节数据给数据寄存器
253 1 writelcd(virt_port);
254 1 virt_port|=0x08; //使能E脚为高电平
255 1 writelcd(virt_port);
256 1 virt_port&=0xf7; //使能E脚为低电平
257 1 writelcd(virt_port);
258 1 virt_port&=0x07; //设置光标右移,文字也右移
259 1 writelcd(virt_port);
260 1
261 1 t=d&0x0f;
262 1 virt_port|=t<<4; //取低字节数据给数据寄存器
263 1 writelcd(virt_port);
264 1
265 1 virt_port|=0x08; //使能E脚为高电平
266 1 writelcd(virt_port);
267 1 for(i=3;i>0;i--);
268 1 virt_port&=0xf7; //使能E脚为低电平
269 1 writelcd(virt_port);
270 1 virt_port=0; //数据清零
271 1 writelcd(virt_port);
272 1 }
273 void lcdchar (void)
274 {
275 1 uint xdata i,j,k;
276 1 for(j=0;j<5000;j++); //数据读、写操作,画面不动
277 1 for(k=0;k<5000;k++);
278 1 for(i=0;i<2;i++)
279 1 {
280 2 writedata(time_data[i]);
281 2 for(j=0;j<5000;j++); //数据读、写操作,画面不动
282 2 for(k=0;k<5000;k++);
283 2
284 2 }
285 1
286 1
287 1 }
288
289
290 void lcdinit()
291 {
292 1 uint xdata i;
293 1
294 1 virt_port=0x00;
295 1 writelcd(virt_port); //RS脚为零写指令寄存器 RW为低电平
296 1 virt_port|=0x08; //使能脚E=1
297 1 writelcd(virt_port);
298 1 virt_port&=0xf7; //使E=0使能脚发生跳变高--低
299 1 writelcd(virt_port);
300 1 for(i=1000;i>0;i--); //3次延时,重要!
301 1 for(i=8000;i>0;i--); //用延时代替查询
C51 COMPILER V8.05a 340_LCD 05/16/2009 15:36:50 PAGE 6
302 1
303 1
304 1 virt_port=0; //写入20码,设置为4位总线方式,非常重要!!!!!
305 1 writelcd(virt_port);
306 1 virt_port|=0x20; //只写高字节
307 1 writelcd(virt_port);
308 1 virt_port|=0x08; //E=1
309 1 writelcd(virt_port);
310 1 for(i=20;i>0;i--); //使命令执行
311 1 virt_port&=0xf7; //E=0
312 1 writelcd(virt_port);
313 1 for(i=10;i>0;i--);
314 1 virt_port=0;
315 1 writelcd(virt_port);
316 1
317 1
318 1
319 1 writecode(0x38); //设两行显示,4线方式5*10字符显示
320 1 for(i=50;i>0;i--);
321 1 writecode(0x06); //光标右移
322 1 for(i=50;i>0;i--);
323 1
324 1
325 1 writecode(0x0c); //开显示指令
326 1 for(i=50;i>0;i--);
327 1
328 1
329 1 writecode(0x02); //光标返回指令
330 1 for(i=50;i>0;i--);
331 1
332 1 writecode(0x01); //清屏指令
333 1 for(i=50;i>0;i--);
334 1 }
335 void port_init()
336 {
337 1 P0MDOUT=0xff;
338 1 XBR0 = 0x02;
339 1 XBR1 = 0x40;
340 1 P1MDOUT|= 0xDf; // /WR and /RD are push-pull
341 1 P2MDOUT|= 0xFF;
342 1 P3MDOUT =0xFD;
343 1 P4MDOUT |= 0xFF;
344 1
345 1
346 1 }
347
348 void main(void)
349 {
350 1 uint j;
351 1
352 1 PCA0MD &= ~0x40; //关闭看门狗定时器
353 1 OSCICN |= 0x03; //内部高频振荡器12M晶振做为系统时钟
354 1 port_init(); //端口初始化
355 1 EMIF_Init ();
356 1 ether_reset_low();
357 1 for(j=0;j<5000;j++);
358 1 ether_reset_high ();
359 1 INT0EN = 0x00;
360 1 INT1EN = 0x00;
361 1 SPI_Init();
362 1 time_int_DS1302();
363 1 IE = 0x40;
C51 COMPILER V8.05a 340_LCD 05/16/2009 15:36:50 PAGE 7
364 1 EA=1;
365 1 lcdinit();
366 1 //while(1) {
367 1
368 1 //液晶初始化
369 1 while(1)
370 1 { //
371 2 EA=0;
372 2 time_display_DS1302();
373 2 EA=1;
374 2 lcdchar();
375 2 delay(60000);
376 2 delay(60000);
377 2 delay(60000);
378 2 delay(60000);
379 2 delay(60000);
380 2 delay(60000);
381 2 delay(60000);
382 2 delay(60000);
383 2 delay(60000);
384 2 delay(60000); delay(60000); delay(60000); delay(60000); delay(60000); delay(60000); delay(60000)
-; delay(60000);
385 2 //time_display_DS1302();
386 2 }
387 1
388 1 }
389
390 //}
391
392 void spi_isr(void) interrupt 6
393 {
394 1 if(SPIF)
395 1 {
396 2 SPIF=0;
397 2 SPI_BUSY=0;
398 2 }
399 1
400 1
401 1 if(WCOL)
402 1 {
403 2 WCOL=0;
404 2 }
405 1 }
406
407
408 void ether_reset_low()
409 {
410 1 P1 &= ~0x01; // Pull reset low
411 1 }
412 void ether_reset_high (void)
413 {
414 1 P1 |= 0x01; // Allow /RST to rise
415 1 while(!(P1 & 0x01)); // Wait for /RST to go high
416 1
417 1 }
418
419 void EMIF_Init (void)
420 {
421 1 EMI0CF = 0x1B; // non-muxed mode; split mode
422 1 // with bank select
423 1 EMI0TC = EMIF_TIMING; // This constant may be modified
424 1 // according to SYSCLK to meet the
C51 COMPILER V8.05a 340_LCD 05/16/2009 15:36:50 PAGE 8
425 1 // timing requirements for the CP2200
426 1 EMI0CN = BASE_ADDRESS; // Page of XRAM accessed by EMIF
427 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1353 ----
CONSTANT SIZE = 8 ----
XDATA SIZE = 18 20
PDATA SIZE = ---- ----
DATA SIZE = 27 8
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 + -