/**********************带字库液晶显示模块LCM12864ZK*****************************/ #include <REG51.H> #include <STDIO.H>
/*********************************************************************/ #define Uchar unsigned char #define Uint unsigned int #define Ulong unsigned long sbit E=P3^0; //对应第8脚 sbit RW=P3^1; //对应第7脚 sbit RS=P3^2; //对应第6脚 sbit BG=P3^3; //背光源正极2脚 Uchar BUSY,hang,lie;
/********************************/ //定义字符串数组 */ /********************************/ code char STR2[]="单片机显示技术网"; code char STR3[]="网址:http://www.mcubbs.net";
/**************************定义函数原型********************************/ void Delayus(Ulong t) ; /*延时函数*/ void BUSYLOOP(); //*判忙函数*// void Write_command(Uchar CMD,Uchar bb); //*发控制字函数*// void Write_data(Uchar CMD); //*发数据函数*// void CHUSHIHUA(); //*初始化函数*// void CLEAR(); //*清屏*// void Display( Uchar *ptr,Uchar ddram); //**显字符串函数**//
/*********************************************延时**************************************/ void Delayus(Ulong t) {int i,j; for (i=0;i<t;i++) for (j=0;j<t;j++) ; }
//*********************判忙函数************************// void BUSYLOOP() { P1=0x0ff; RS=0; RW=1; do { E=1; BUSY=P1; E=0; } while(BUSY>0x7F); } //*********************写控制字函数****************************// void Write_command(Uchar CMD,Uchar bb) { if(bb) {BUSYLOOP();} RS=0; RW=0; E=1; P1=CMD; Delayus(1); E=0; }
//*********************写数据函数****************************// void Write_data(Uchar CMD) { BUSYLOOP(); RS=1; RW=0; E=1; P1=CMD; Delayus(1); E=0; }
//*************************液晶初始化********************************// void CHUSHIHUA() { Delayus(38); Write_command(0x30,0); Delayus(1); Write_command(0x30,0); Delayus(1); Write_command(0x0C,1); Delayus(1); Write_command(0x01,1); Delayus(20); Write_command(0x06,1); } /***************************清 屏*************************************/ void CLEAR() { RS=0; RW=0; E=1; P1=0x01; Delayus(1); E=0; } /**************************主函数开始***********************************/ main() { CLEAR(); CHUSHIHUA(); //初始化函数// Display(STR2,0x82); // 上面一行显示一个预定字符串 Display(STR3,0x88); Delayus(200); Write_command(0x9C,0); //将光标移到0x9C Write_command(0x0f,0); //光标处反白闪烁
// write_command(0x08,0); //进入睡眠状态 // delayus(200); // write_command(0x0C,0); //唤醒
while(1) { ; } } /*************************主函数结束*************************************/
/*======================================================= 显示字符串 =======================================================*/ void Display(Uchar *ptr,Uchar ddram) { Uchar l,i1,x; l=0; if(ddram<0x88) { hang=0; } //定位行地址:第一行 else if(ddram<0x90) { hang=2; } //定位行地址:第三行 else if(ddram<0x98) { hang=1; } //定位行地址:第二行 else { hang=3; } //定位行地址:第四行
lie=0x0f&ddram; //定位列地址 if(lie>0x07) { lie=lie-0x08;} x=lie*2; Write_command(ddram,0); // 定位显示起始地址 while ((ptr[l])!='\0') {l++;} for (i1=0;i1<l;i1++) { Write_data(ptr[i1]); //输出单个字符 x++; if (x ==0x10) { x=0; hang++; switch (hang) { case 0:Write_command(0x80,0); break; case 1:Write_command(0x90,0); break; case 2:Write_command(0x88,0); break; case 3:Write_command(0x98,0); } if (hang>3) { Write_command(0x80,0); hang=0; } } } } |