#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(); } } } }
|