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

📄 键盘显示2.c

📁 在C环境下利用单片机来控制并显示电机的速度
💻 C
字号:
#include <reg52.h>
#include <absacc.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

sbit STR  =  P3^6;//定义CD4094各端口;
sbit DATA =  P3^0;
sbit CLK  =  P3^1;

void delays(uint);	  //延时函数
void Out_4094(uchar);//发送代码函数
uchar kbscan();		   //判断键是否按下
uchar keyadr();		   //得到键位置函数
uchar keyzhi(uchar);   //得到键值函数
void led_xs();

int xianshi[]={16,16,16,16};
//int xianshi[]={6,5,2,1};

void main()
{uchar key,get;
  int i=0,k=0;					 //k为按键计数
  int sudu=0;						//速度控制
  led_xs();				//调用4个数码管显示函数
   while(1)
    {  delays(15000);  //上一按键与下一按键间就有一时间差,此时间刚好
	   i=kbscan();               //判断键是否按下
         if(i==1)
	       { delays(600);                   //延时去抖动 
//	         led_xs();				//调用4个数码管显示函数
	       }
	   i=kbscan();               //再次判断键是否按下
      if(i==1) 					  //表明有键按下,并要清i为0(也可不清)
	   {   key=keyadr();			  //调用得到键位置函数
	       get=keyzhi(key);		  //调用得到键值函数		
         if(0<=get&&get<=9) 
		   {  xianshi[0]=xianshi[1];xianshi[1]=xianshi[2];
		      xianshi[2]=xianshi[3];xianshi[3]=get;
		        k++;
	         if(k==4)  k=0;
	          led_xs();				//调用4个数码管显示函数
           }
		 else if(get==10)
		   {  sudu=xianshi[3]*1000+xianshi[2]*100+xianshi[1]*10+xianshi[0];
			  xianshi[3]=sudu%10;
//			 led_xs();				//调用4个数码管显示函数
//		     printf("sudu=%d\n",sudu);
		   }
	     else if(get==11)
		   {xianshi[3]=0;xianshi[2]=0;xianshi[1]=0;xianshi[0]=0;
	         led_xs();				//调用4个数码管显示函数
		   }
//		 else {}
	   }
   }
}
 
void delays(uint a)     //延时子函数;
{uint b;
    for(b=0;b<a;b++);
} 

uchar kbscan()          //判断是否有键按下
{    P1=0xf0;	
   	  if((P1&0xf0)!=0xf0)         //若有键按下
	      return 1;
	  else   return 0;
}

uchar keyadr()		   //得到键位置函数
{
  uchar sccode,recode,keytemp=0;		 //取为0是为了keytemp|=(~sccode)+(~recode)不多加keytemp考虑
  int i=1;				  //控制循环
   sccode=0xfe;
     while(i==1) 
//     while((sccode|0xf0)!=0xff)    //	循环不好控制
//	   while(sccode!=0xef) 	   对	 //	循环不好控制
//     while((sccode&0xf0)!=0) 错
        {  P1=sccode;
//        if((P1&0xf0)!=0xf0)  错
//		  if(P1!=sccode)			 //应该也行
	      if((P1&sccode)!=sccode)
           {  recode=P1&0xf0|0x0f;
              keytemp|=(~sccode)+(~recode);
			  i=0;
//			  sccode=sccode<<1|0x01;  //得到键位置后继续扫描,使循环完成.与上控制对应
			}
           else 
		      sccode=sccode<<1|0x01;
         }
     return(keytemp);
}

uchar keyzhi(uchar key2)            //读键值
{uchar key1;
 switch(key2)
   {    case 0x11:key1 =7;break;	  //P10+P14
        case 0x21:key1 =8;break;	  //P10+P15
        case 0x41:key1 =9;break;	  //P10+P16
        case 0x81:key1 =10;break;	  //P10+P17
        case 0x12:key1 =4;break;	  //P11+P14
        case 0x22:key1 =5;break;	  //P11+P15
        case 0x42:key1 =6;break;	  //P11+P16
        case 0x82:key1 =11;break;	  //P11+P17
        case 0x14:key1 =1;break;	  //P12+P14
        case 0x24:key1 =2;break;	  //P12+P15
        case 0x44:key1 =3;break;	  //P12+P16
        case 0x84:key1 =12;break;	  //P12+P17
        case 0x18:key1 =13;break;	  //P13+P14
        case 0x28:key1 =0;break;	  //P13+P15
        case 0x48:key1 =14;break;	  //P13+P16
        case 0x88:key1 =15;break;	  //P13+P17
   }
   return(key1);
}

void led_xs()										//得到4个数码管字形,并调用函数显示									 
{  int i;
   uchar j;
   uchar codec[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,	 //共阴极数码管字形码,从高位开始发时用。
 			   0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e,0x00};
     for(i=0;i<4;i++)    
       {	   
         j=codec[xianshi[i]];
//       delays(5000);    //延时
   	   Out_4094(j);     //调用发送代码函数
//      delays(5000);    //延时
       }
}
void Out_4094(uchar data1) 
{    int j;
      STR=0;        //保持然来的状态不变;
      for(j=0;j<8;j++)
	   	{ DATA=(data1%2); data1>>=1;
		  CLK=0;       //形成上升延脉冲;
//			_nop_();
// 			_nop_();      //延时;
//			 _nop_();
 			CLK=1;
        }
      STR=1;       //数据送完;更新显示;
}

⌨️ 快捷键说明

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