还剩5页未读,继续阅读
文本内容:
#includereg
52.h#defineucharunsignedchar#defineuintunsignedint/****************端口定义***************/#defineLCD_dataP2//定义数据口__itLCD_RS=P0^0;//寄存器选择输入__itLCD_RW=P0^1;//液晶读写控制__itLCD_EN=P0^2;//液晶时能控制__itLCD_P__=P0^3;//串/并方式控制__itkey1=P1^0;//按键定义__itkey2=P1^1;__itkey3=P1^2;/****************定义变量***************/ucharspeed=11;//即时速度ucharkey;ucharkeynum=0;//功能键按下次数intqbweigshwei;/****************液晶显示字符串定义***************/ucharcodedis1[]=液滴控制;ucharcodedis2[]=设定速度:0000;ucharcodedis3[]=实时速度:;ucharcodedis4[]=向前进!向前进!;uchardis5
[3];/****************函数声明***************/voidlcd_init;//LCD初始化voidlcdinit_display;//LCD显示初始化bitlcd_busy;//遇忙检测voidwrite_cmducharcmd;//写命令voidwrite_datuchardat;//写数据voidlcd_posucharXucharY;//设置显示位置voidwrite_gshbucharadduchardat;//取位设置void__trixkeyscan;//键盘扫描voidMoment_speeducharspeed;//实时速度voidlcd_display;//LCD显示voiddelayuintn;//延时/****************主函数***************/void__in{lcdinit_display;while1{lcd_display;Moment_speedspeed;}}/************子程序************/voiddelayuintn{uintij;fori=n;i0;i--forj=110;j0;j--;}/***********************液晶子程序********************************************//*******************************************************************//**//*检查LCD忙状态*//*lcd_busy为1时,忙,等待lcd-busy为0时闲,可写指令与数据*//**//*******************************************************************/bitlcd_busy{bitresult;LCD_RS=0;LCD_RW=1;LCD_EN=1;delay5;result=bitP00x80;LCD_EN=0;returnresult;}/*********写指令数据到LCD**********//*RS=LRW=LE=高脉冲,D0-D7=指令码*/voidwrite_cmducharcmd{lcd_busy;LCD_RS=0;LCD_RW=0;LCD_EN=0;P2=cmd;delay5;LCD_EN=1;delay5;LCD_EN=0;}/**********写显示数据到LCD********//*RS=HRW=LE=高脉冲,D0-D7=数据.*/voidwrite_datuchardat{lcd_busy;LCD_RS=1;LCD_RW=0;LCD_EN=0;P2=dat;delay5;LCD_EN=1;delay5;LCD_EN=0;}/***********设定显示位置****************/voidlcd_posucharXucharY{ucharpos;ifX==1{X=0x80;}elseifX==2{X=0x90;}elseifX==3{X=0x88;}elseifX==4{X=0x98;}pos=X+Y;write_cmdpos;//显示地址}/*LCD初始化设定*/voidlcd_init{LCD_P__=1;//并口方式write_cmd0x34;//扩充指令操作delay5;write_cmd0x30;//基本指令操作delay5;write_cmd0x0C;//显示开关光标delay5;write_cmd0x01;//清除LCD的显示内容delay5;write_cmd0x06;//清除LCD的显示内容delay5;}/*********初始化显示程序********************/voidlcdinit_display{uchari;delay5;lcd_init;lcd_pos10;//设置显示位置为第一行的第一个字符i=0;whiledis1[i]!=\0{write_datdis1[i];i++;}lcd_pos20;//设置显示位置为第二行的第一个字符i=0;whiledis2[i]!=\0{write_datdis2[i];//显示字符i++;}lcd_pos30;//设置显示位置为第三行的第一个字符i=0;whiledis3[i]!=\0{write_datdis3[i];//显示字符i++;}lcd_pos40;//设置显示位置为第四行的第一个字符i=0;whiledis4[i]!=\0{write_datdis4[i];//显示字符i++;}}voidwrite_gshbucharadduchardat{ucharshige;shi=dat/10;ge=dat%10;write_cmd0x90+add;write_dat0x30+shi;write_dat0x30+ge;}/*******************键盘扫描**************************/void__trixkeyscan{ifkey1==0{delay10;ifkey1==0key=1;while!key1;}ifkey2==0{delay10;ifkey2==0key=2;while!key2;}ifkey3==0{delay10;ifkey3==0key=3;while!key3;}}/********实时速度显示程序********/voidMoment_speeducharspeed{ucharij;dis5
[0]=speed/100+0x30;dis5
[1]=speed/10%10+0x30;dis5
[2]=speed%10+0x30;fori=0j=5;i3;i++j++{lcd_pos3j;write_datdis5[i];delay5;}}/****显示子程序************/voidlcd_display{__trixkeyscan;ifkey==1//功能键按下{key=0;keynum++;switchkeynum{case1:lcd_pos25;write_cmd0x0f;break;case2:lcd_pos26;break;case3:keynum=0;write_cmd0x0c;break;}}ifkeynum!=0//只有key1键按下时,才检测键key2,key3{ifkey==2//加调节数值{key=0;switchkeynum{case1:qbwei++;ifqbwei==10qbwei=0;write_gshb5qbwei;lcd_pos25;break;case2:gshwei++;ifgshwei==99gshwei=0;write_gshb6gshwei;lcd_pos26;break;}}}ifkey==3//减调节数值{key=0;switchkeynum{case1:qbwei--;ifqbwei==-1qbwei=9;write_gshb5qbwei;lcd_pos25;break;case2:gshwei--;ifgshwei==-1gshwei=99;write_gshb6gshwei;lcd_pos26;break;}}}。