//---------------------------------------------------------------------- /*SHENZHEN SURENOO TECHNOLOGY CO,.LTD.*/ // Module : Surenoo_Character_LCD_Series Demo Code // Lanuage : C51 Code // Create : Potter // Date : Oct-25-2008 // Drive IC : HD44780/KS0066/SPLC780D/31066 // INTERFACE : 6800_8bit/4bit // MCU : STC89C52 // VDD : 5V //---------------------------------------------------------------------- #include #include #define uchar unsigned char sbit dc=P3^5; /*P2.0 LCD_RS 21*/ sbit rw=P3^6; /*P2.1 LCD_R/W 22*/ sbit cs=P3^7; /*P2.4 LCD_E 25*/ sbit selspeed=0xa2; /*P2.2 Speed 23*/ sfr lcdbus=0xA0; /*P0 LCD Data D0=P0.0*/ bit flagspeed; unsigned int sys10mscounter; unsigned char syslimitcounter; char path1[8]={0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f}; char path2[8]={0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00}; char pats1[8]={0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15}; char pats2[8]={0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a}; //uchar code riwen[]={0xb0,0xb1}; /*空操作*/ void soft_nop() { register int i; for(i=0;i<20;i++); } void soft_nop_50() { register int i; for(i=0;i<100;i++); } /***********12MHZ: 10MS Software Delay************/ void soft_10ms(){ register int i; for(i=0;i<10000;i++); } /***********12MHZ: 20MS Software Delay************/ void soft_20ms(){ soft_10ms(); soft_10ms(); } /*Based on 10MS Hardware Delay*/ void hard_10ms(unsigned int delaytime){ sys10mscounter=delaytime; while(sys10mscounter); } unsigned char data lcdcounter; bit lcdusing1,lcdusing2; /*Check LCD Busy*/ bit lcd_checkbusy(){ register lcdstate; dc=0; /*dc=1 Data,=0 Control.*/ rw=1; /*rw=1 Read,=0 Write.*/ cs=1; /*cs=1 Selection.*/ lcdbus=0x00; soft_nop(); lcdstate=lcdbus; cs=0; soft_nop(); return((bit)(lcdstate&0x80)); } /*Write LCD Order*/ void lcd_wrcmd(unsigned char lcdcmd){ lcdusing1=1; while(lcd_checkbusy()); lcdbus=lcdcmd; cs=0; dc=0; /*dc=1为数据,=0为命令.*/ rw=0; /*rw=1为读,=0为写.*/ cs=1; /*cs=1选通.*/ soft_nop(); soft_nop(); soft_nop(); cs=0; soft_nop(); soft_nop(); soft_nop(); lcdbus=0xff; lcdusing1=0; soft_nop(); } /*移动光标到指定位.0-79*/ void lcd_moveto(char position){ register cmd=0x80; lcdcounter=position; // if (position > 59) // position += 0x18; // else // { // if (position > 39) // position -= 0x14; // else // { // if (position > 19) // position += 0x2c; /**/ // } // } if (position > 39)position += 0x18; cmd=cmd|position; lcd_wrcmd(cmd); } /*在当前显示位置显示数据*/ void lcd_wrdata(char lcddata){ //char i; lcdusing2=1; while(lcd_checkbusy()); // if(lcdcounter==20){ // lcd_moveto(20); // while(lcd_checkbusy()); // } if(lcdcounter==40){ lcd_moveto(40); while(lcd_checkbusy()); } // if(lcdcounter==60){ // lcd_moveto(60); // while(lcd_checkbusy()); // } if(lcdcounter==80){ lcd_moveto(0); while(lcd_checkbusy()); lcdcounter=0; } lcdcounter++; lcdbus=lcddata; cs=0; dc=1; /*dc=1为数据,=0为命令.*/ rw=0; /*rw=1为读,=0为写.*/ cs=1; /*cs=1选通.*/ soft_nop(); soft_nop(); soft_nop(); cs=0; soft_nop(); soft_nop(); soft_nop(); lcdbus=0xff; lcdusing2=0; } /*在当前显示位置显示LCD字符串*/ void lcd_string(char *strpoint){ register i=0; while(strpoint[i]!=0){ lcd_wrdata(strpoint[i]); i++; } } /*初始化*/ void lcd_init(){ lcd_wrcmd(0x38); /*设置8位格式,2行,5*7*/ soft_10ms(); lcd_wrcmd(0x0c); /*整体显示,关光标,不闪烁*/ soft_10ms(); lcd_wrcmd(0x06); /*设定输入方式,增量不移位*/ soft_10ms(); lcd_wrcmd(0x01); /*清除显示*/ soft_20ms(); soft_20ms(); lcdcounter=0; } /*初始化*/ //void lcd_init1(){ // lcd_wrcmd(0x38); /*设置8位格式,2行,5*7*/ // lcd_wrcmd(0x0c); /*整体显示,关光标,不闪烁*/ // lcd_wrcmd(0x06); /*设定输入方式,增量不移位*/ // lcd_wrcmd(0x01); /*清除显示*/ // lcdcounter=0; //} /*清除显示*/ void lcd_cls(){ lcd_wrcmd(0x01); lcdcounter=0; } void timer0(void) interrupt 1 { /*T0中断*/ TH0=0xd8; /*12M,10ms*/ TL0=0xf6; TR0=1; if(sys10mscounter!=0)sys10mscounter--; /*定时器10ms*/ if(syslimitcounter!=0)syslimitcounter--; /*定时器10ms*/ } void display_cc() { unsigned char j,k; for(j=0;j<40;j++) { lcd_wrdata(0xb0+j); } } main() { unsigned char j; while(1) { /*初始化T*/ //IE=0; P0=0xff; P1=0xff; P2=0xff; P3=0xff; lcd_init(); TMOD=0x51; TH0=0xd8; /*12M,10ms*/ TL0=0xf6; TR0=1; ET0=1; EA=1; flagspeed=1; /*全黑、横一、横二、竖一、竖二、U、Q、ABCD...,*/ lcd_init(); /*全黑*/ for(j=0;j<80;j++) {lcd_wrdata(0xff);} hard_10ms(40); // if(selspeed==0)flagspeed=!flagspeed; // if(!flagspeed)hard_10ms(50); lcd_init(); /*横一*/ lcd_wrcmd(0x40); for(j=0;j<8;j++)lcd_wrdata(path1[j]); lcd_wrcmd(0x80); lcdcounter=0; for(j=0;j<80;j++)lcd_wrdata(0); hard_10ms(40); // if(selspeed==10)flagspeed=!flagspeed; // if(!flagspeed)hard_10ms(50); lcd_init(); /*横一*/ lcd_wrcmd(0x40); for(j=0;j<8;j++)lcd_wrdata(path2[j]); lcd_wrcmd(0x80); lcdcounter=0; for(j=0;j<100;j++)lcd_wrdata(0); hard_10ms(40); // if(selspeed==10)flagspeed=!flagspeed; // if(!flagspeed)hard_10ms(50); lcd_init(); /*竖一*/ lcd_wrcmd(0x40); for(j=0;j<8;j++)lcd_wrdata(pats1[j]); lcd_wrcmd(0x80); lcdcounter=0; for(j=0;j<100;j++)lcd_wrdata(0); hard_10ms(40); // if(selspeed==0)flagspeed=!flagspeed; // if(!flagspeed)hard_10ms(50); lcd_init(); /*竖二*/ lcd_wrcmd(0x40); for(j=0;j<8;j++)lcd_wrdata(pats2[j]); lcd_wrcmd(0x80); lcdcounter=0; for(j=0;j<100;j++)lcd_wrdata(0); hard_10ms(40); // if(selspeed==0)flagspeed=!flagspeed; // if(!flagspeed)hard_10ms(50); lcd_init(); hard_10ms(10); lcd_wrcmd(0x80); lcdcounter=0; for(j=0;j<40;j++)lcd_wrdata(0x30+j); lcd_wrcmd(0xc0); lcdcounter=0; for(j=0;j<40;j++)lcd_wrdata(0xb0+j); hard_10ms(40); // if(selspeed==0)flagspeed=!flagspeed; // if(!flagspeed)hard_10ms(100); lcd_init(); lcd_wrcmd(0x80); lcdcounter=0; lcd_string("Surenoo LCD-Test"); lcd_wrcmd(0xc0); lcdcounter=0; lcd_string("13631524276"); hard_10ms(100); lcd_init(); lcd_wrcmd(0x80); lcdcounter=0; lcd_string("WWW.SURENOO.COM"); lcd_wrcmd(0xc0); lcdcounter=0; lcd_string("SURENOO-DISPLAY"); hard_10ms(100); // lcd_init(); // lcd_string("QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ"); // hard_10ms(100); // if(selspeed==0)flagspeed=!flagspeed; // if(!flagspeed)hard_10ms(100); // // // // // lcd_init(); // lcd_string("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz0123456789+-!#$%&?"); // hard_10ms(100); // if(selspeed==0)flagspeed=!flagspeed; // if(!flagspeed)hard_10ms(100); // } // lcd_init(); // display_cc(); // hard_10ms(150) // hard_10ms(100); // if(selspeed==0)flagspeed=!flagspeed; // if(!flagspeed)hard_10ms(100); // while(1); } }