#include <reg51.h> #include <intrins.h> sbit RS = P3^0; sbit RW = P3^3; sbit E = P3^4; sbit PSB = P3^1; //串并口选择 sbit RES = P3^5; #define FIRST_ADDR 0 //定义字符/汉字显示起始位置 //延时子程序 void delay(unsigned int t) { unsigned int i,j; for(i=0;i<t;i++) for(j=0;j<10;j++) ; } //测忙 void chk_busy() { RS=0; RW=1; E=1; while((P1&0x80)==0x80); E=0; } //读数据 unsigned char lcdrd() { unsigned char i; P3=0xFB; _nop_(); E=1; delay(5); i=P1; _nop_(); E=0; return i; } //写数据 void lcdwd(unsigned char dispdata) { chk_busy(); _nop_(); RS=1; RW=0; E=1; P1=dispdata; delay(5); _nop_(); E=0; _nop_(); P1=0xff; } //写指令代码 void lcdwc(unsigned char cmdcode) { chk_busy(); _nop_(); RS=0; RW=0; E=1; P1=cmdcode; delay(5); _nop_(); E=0; _nop_(); P1=0xff; } //初始化 void lcdreset() { delay(2000); lcdwc(0x30); //选择基本指令集 lcdwc(0x30); //选择8bit数据流 delay(5); lcdwc(0x0c); //开显示(无游标、不反白) delay(5); lcdwc(0x01); //清除显示,并且设定地址指针为00H delay(5); lcdwc(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位 } void hzkdis(unsigned char code *s) { while(*s>0) { lcdwd(*s); s++; delay(500); } } void hzklib() { lcdwc(0x80+FIRST_ADDR); hzkdis("少小离家老大回,"); lcdwc(0x90+FIRST_ADDR); hzkdis("乡音无改鬓毛衰。"); lcdwc(0x88+FIRST_ADDR); hzkdis("儿童相见不相识,"); lcdwc(0x98+FIRST_ADDR); hzkdis("笑问客从何处来。"); } //整屏显示 //当ii=0时显示上面128×32 //当ii=8时显示下面128×32 void lcdfill(unsigned char disdata) { unsigned char x,y,ii; for(ii=0;ii<9;ii+=8) for(y=0;y<0x20;y++) for(x=0;x<8;x++) { lcdwc(0x36); lcdwc(y+0x80); //行地址 lcdwc(x+0x80+ii); //列地址 lcdwc(0x30); lcdwd(disdata); lcdwd(disdata); } } main() { RES=0; _nop_(); RES=1; while(1) { PSB=1; RW=0; lcdreset(); //初始化LCD屏 lcdwc(0x01); delay(1000); lcdfill(0xff); delay(6000); lcdfill(0); lcdwc(0x01); delay(1000); hzklib(); delay(4000); } } |