⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 key_ultmate.c

📁 本程序为单片机对四相步进电机的控制
💻 C
字号:
#include <reg51.h>
#include <stdio.h>
#define uchar unsigned char 
#include <math.h> 

uchar key_all=0;
uchar in_number=0;

uchar data12[9]={0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f};
int speed=4;int jieju;
const uchar data_void[9]={0x00,0x00,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f};
unsigned char anticlock[8]=  {	0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};
unsigned char     clock[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}; 

 uchar in_status;
   int temp;
   uchar m;

sbit DIN=P3^5;
sbit LOAD=P3^6;
sbit CLP=P3^7;
bit yes;
//sbit my=P1^7;


void delay(void);
void send(uchar add,uchar );
void s_seg(uchar *p);
void  keyscan(void);	  //键盘扫描函数
void clear_all(void);
void my_delay(void);

void zhengzhuan(int );
void fanzhuan(int ) ;
void key_process(void);


void main()
{  
 //uchar key_get=15;
  in_status=0;
while(1)
{
	keyscan();
	key_process();
	if(yes){	zhengzhuan(speed);	 yes=0;}

}
}

void key_process(void)
  {

	//  in_number=0;
  
  
  if((key_all==13	)||( key_all==14)) 
{
	 if(key_all==13) in_status=1;
	 else 	in_status= 2;  
	 clear_all();
 }
	if((in_status!=0)&&(key_all>=1)&&(key_all<=10)) 
	{
		for(m=8;m>1;m--)
	{
	    data12[m]=data12[m-1];
	}	
	 	  data12[1]=key_all-1;
	 
				 in_number++;

				s_seg(data12);


	if(	in_number >7 )	  in_number=0;

	}
	if(key_all==11) 
	{
	   	temp=0;
	for(m=1;m<=in_number;m++)
		{
	temp+=data12[m]*pow(10,(m-1));
		//	temp=data12[1];
		}
		switch(in_status)
		{
			case 1:	 speed=temp;break;
			case 2:  jieju=temp;break;
		}
	 yes=1;
		
	}
		if(key_all==12) 
		{
		clear_all();

		}

}
void clear_all(void)
{
  	 	uchar j;

	in_number=0;
	for( j=1;j<9;j++)
	{
		data12[j]=0x0f;	

	}	

		s_seg(data_void);

}
    void delay(void)	//延时函数
  {
        int i;
	    for (i=4800;i>0;i--);
   }

void keyscan(void)	  //键盘扫描函数
   {
         uchar scan,tep;
		 key_all=0;
		 P2=0xf0;
 	     if((P2&0xf0)!=0xf0)	  //若有键盘按下
		 {
			  delay();
		      if((P2&0xf0)!=0xf0)	  //若有键盘按下

			{
			 P2=0xfe;	           // 发全0扫描码
	 
	       if((P2&0xf0)!=0xf0)	  //若有键盘按下
	        { 
			  delay();
		      if((P2&0xf0)!=0xf0)	  //若有键盘按下
	            {
				   scan=P2&0xf0;
				   switch( scan)
				   {
				   case 0xe0:	 key_all= 1;break;
				   case 0xd0:	 key_all= 2;break;
				   case 0xb0:	 key_all= 3;break;
				   case 0x70:	 key_all= 4;break;
				   }
				 while((P2&0xf0)!=0xf0);

	  			 }
			return ;
			}

		 P2=0xfd;	           // 发全0扫描码
	 
	       if((P2&0xf0)!=0xf0)	  //若有键盘按下
	        { 
			  delay();
		      if((P2&0xf0)!=0xf0)	  //若有键盘按下
	            {
				   scan=P2&0xf0;
				   switch( scan)
				   {
				   case 0xe0:	 key_all= 5;break;
				   case 0xd0:	 key_all= 6;break;
				   case 0xb0:	 key_all= 7;break;
				   case 0x70:	 key_all= 8;break;
				   }
				  				    while(( P2&0xf0)!=0xf0);


	  			  }
				return ;
			}
		 P2=0xfb;	           // 发全0扫描码
	 
	       if((P2&0xf0)!=0xf0)	  //若有键盘按下
	        { 
			  delay();
		      if((P2&0xf0)!=0xf0)	  //若有键盘按下
	            {
				   scan=P2&0xf0;
				   switch( scan)
				   {
				   case 0xe0:	 key_all= 9;break;
				   case 0xd0:	 key_all= 10;break;
				   case 0xb0:	 key_all= 11;break;
				   case 0x70:	 key_all= 12;break;
				   }
									    while(( P2&0xf0)!=0xf0);

	  			 }
			return;
			}
		 P2=0xf7;	           // 发全0扫描码
	 
	       if((P2&0xf0)!=0xf0)	  //若有键盘按下
	        { 
			  delay();
		      if((P2&0xf0)!=0xf0)	  //若有键盘按下
	            {
				   scan=P2&0xf0;
				   switch( scan)
				   {
				   case 0xe0:	 key_all= 13;break;
				   case 0xd0:	 key_all= 14;break;
				   case 0xb0:	 key_all= 15;break;
				   case 0x70:	 key_all= 16;break;
				   }
					 				    while(( P2&0xf0)!=0xf0);

	  			 }
				 return;
			}
		  }
		  }
}

    void send(uchar add,uchar dat)
{
   	uchar ADS,i,j;
   	CLP=0;
	LOAD=0;
	DIN=0;
   	i=4;
   	while(i<16)
   	{
     	 if(i<8)
	  	{
	  		ADS=add;
		}
	  else
	  	{
			ADS=dat;
		}
	  for(j=8;j>=1;j--)
	  	{

			if((ADS&0x80)==0)
			{	DIN=0 ;}
			else 
			{	DIN=1;}
	  	  	ADS=ADS<<1;
		
		CLP=1;
		CLP=0;	
	 	 }
	  i=i+8;
   }
   LOAD=1;
}

void s_seg(uchar *p)
{
	 send(0x0c,0x01);//正常状态
   send(0x0b,0x07);//设置扫描范围DIG0-7
	 send(0x0a,0x05);//设置亮度11/32
   send(0x09,0xff);//采用译码方式

   send(0x01,p[8]);
   send(0x02,p[7]);
   send(0x03,p[6]);
   send(0x04,p[5]);
   send(0x05,p[4]);
   send(0x06,p[3]);
   send(0x07,p[2]);
   send(0x08,p[1]);	
}





/*void zhengzhuan(int step)
{
   int i; unsigned char pos;

   for (i=0;i<step;i++)
   {
      if(pos>7)	pos=0;
	  P1=clock[pos];
	  pos++;
	  my_delay();
	}
}
void fanzhuan(int step)
{
   int i; unsigned char pos;
		   	  my_delay();


   for (i=0;i<step;i++)
   {
      if(pos>7)	pos=0;
	  P1=anticlock[pos];
	  pos++;
	  my_delay();
	}
}
*/

void zhengzhuan(int step)
{
   int i; unsigned char pos;
 for (pos=0;pos<step;pos++)
   {

   for (i=0;i<8;i++)
   {
	  P1=clock[i];
	  my_delay();
	}
	}
}
void fanzhuan(int step)
{
   int i; unsigned char pos;
 for (pos=0;pos<step;pos++)
   {

   for (i=0;i<8;i++)
   {
	  P1=anticlock[i];
	  my_delay();
	}
	}
}




void my_delay(void)
{
    int i,j;
	for (i=0;i<10000;i++);
	{ 
	   for(j=0;j<10000;j++);
	}
}











⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -