#include<reg52.h> #include<intrins.h> #define uchar unsigned char #define ulong unsigned long #define uint unsigned int sbit en=P2^6; sbit rs=P2^4; sbit rw=P2^5; sbit fmq=P2^0; sbit qd=P2^1; sbit LA=P3^0; //定义两相,选择P2口的低四位输 sbit LB=P3^1; //LA为A,LB为B,LC为C,LD为D sbit LC=P3^2; sbit LD=P3^3; sbit key2=P3^5;//定义按键3 sbit key1=P3^4;//定义按键4 /********函数声明*****/ void right(unsigned int Speed,unsigned int road);//正转 void left(unsigned int Speed,unsigned int road); //反转 void mDelay(unsigned int DelayTime);//延时函数 int MotorStep=0;//步进索引 /*****正转,两个参数代表转速和步进量**********/ void right(unsigned int Speed,unsigned int road) { //步进节拍:A-B-C-D while(road) { switch(MotorStep) { case 0:LB=0; LC=0; LD=0; LA=1;//A MotorStep=1;break; case 1:LA=0; LC=0; LD=0; LB=1;//B MotorStep=2;break; case 2:LA=0; LB=0; LD=0; LC=1;//C MotorStep=3;break; case 3:LA=0; LB=0; LC=0; LD=1;//D MotorStep=0;break; } mDelay(Speed);//这里的延时即控制转速 road--;//完成一步 } P2&=0XF0;//将四个脚复位0,停止 } /********反转,两个参数代表转速和步进量********/ void left(unsigned int Speed,unsigned int road) {//步进节拍:D-C-B-A while(road) { switch(MotorStep) { case 3:LA=0;LC=0;LD=0;LB=1;//B MotorStep=2;break; case 2:LB=0;LC=0;LD=0;LA=1; //A MotorStep=1;break; case 1:LA=0;LB=0;LC=0;LD=1; //D MotorStep=0; break; case 0:LA=0;LB=0;LD=0;LC=1;//C MotorStep=3;break; } mDelay(Speed);//这里的延时即控制转速 road--;//完成一步 } P2&=0XF0;//将四个脚复位0 } /***********延时函数***************/ void mDelay(unsigned int DelayTime) { unsigned char j=0; while(DelayTime--) { for(j=0;j<100;j++) {} } } void delay_1ms(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void delay() { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } bit busy(void) //读出函数是否处于忙状态 { bit busy_flag=0; rs=0; rw=1; en=1; delay(); busy_flag=(bit)(P0&0x80); en=0; return busy_flag; } void write_com(uchar com) //写指令函数 { while(busy()); rs=0; //选择指令寄存器 rw=0; //选择写操作 en=0; delay(); P0=com; delay(); en=1; delay(); en=0; } void write_data(uchar date) //写数据函数 { while(busy()); // rs=1; //选择数据寄存器 rw=0;//选择读操作 en=0; delay(); P0=date; delay(); en=1; delay(); en=0; } void l1602_init() // 初始化函数 { write_com(0x38); //显示模式设置 delay_1ms(5); //延时5ms write_com(0x08); //开显示 write_com(0x0f); //开光标显示且闪烁 write_com(0x01); //清屏 } void l1602_char(uchar hang,uchar lie,char sign) { uchar a; if(hang==1)a=0x80; if(hang==2)a=0xc0; a=a+lie-1; write_com(a); write_data(sign); } void l1602_string(uchar hang,uchar lie,uchar *p) { uchar a,b=0; if(hang==1)a=0x80; if(hang==2)a=0xc0; a=a+lie-1; while(1) {write_com(a++); b++; if((*p=='\0')||(b==16))break; write_data(*p); p++; } } uchar keyscan(void) //键盘函数 { uchar i,j,temp,buffer[4]={0xfe,0xfd,0xfb,0xf7} ; for(j=0;j<4;j++) { P1=buffer[j]; temp=0x10; for(i=0;i<4;i++) { if(!(P1&temp)) { return(i+j*4); } temp<<=1; } } return 10; } void main(void) { uint k=1; uchar i=6 ,j=0; uchar SLED[6]={0}; ulong key_value; ulong code6wei=0x123456; ulong codebijiao=0; l1602_init(); l1602_string(1,1,"The code is:"); fmq=0; qd=1; while(1) { key_value=10; P1=0xf0; if(P1!=0Xf0) {delay_1ms(70); if(P1!=0xf0) {delay_1ms(70); if(P1!=0Xf0) { key_value=keyscan(); } } } if(key_value<10) { l1602_char(2,i,key_value+48); codebijiao=codebijiao|(key_value<<((5-j)*4)); i++; j++; delay_1ms(200); } if(j==6) { if(codebijiao==code6wei) { qd=0; write_com(0x01); l1602_string(1,1,"right!"); l1602_string(2,1,"welcome back!"); P2&=0XF0;//因ULN2003A直接驱动,初始时为低电平 while(1) //循环 { if(((k==1)||(k==2))&&key1==0) //1键按下正转 { k=3; if(k==4) {P2=0X00; while(1){} } right(10,200);//两个参数代表转速和步进量,以10的速度进200步 P2=0X00; k=4; } if(((k==3)||(k==4))&&(key2==0))//2键按下反转 { k=1; if(k==2) {P2=0X00; while(1){} } left(10,200); P2=0X00; k=2; } } } else { fmq=1; delay_1ms(2000); write_com(0x01); l1602_string(1,1,"wrong!"); l1602_string(2,1,"Input again!"); delay_1ms(1000); j=0; i=6; write_com(0x01); l1602_string(1,1,"The code is:"); main(); } } } }
|