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

📄 zls_001.c

📁 我做的按摸椅RS001的键盘部分的C51程序
💻 C
字号:

#include <reg52.h>
#include<intrins.h>
bit  free;
bit  keydown;
sbit MAX =P1^0;
sbit MID =P0^1;
sbit MIN =P0^2;
sbit CS  =P0^3;
sbit CLK =P0^4;
sbit DATA=P0^5;
sbit WARN=P0^6;
sbit ZERO=P0^7;//过零检测脚
/*键盘扫描端口*/
sbit D0 =P3^0;//行扫描线
sbit D1 =P3^1;
sbit D2 =P3^2;
sbit D3 =P3^3;
sbit D4 =P3^4;
sbit CS0=P3^5;//列扫描线
sbit CS1=P3^6;
sbit CS2=P3^7;
/*检测/控制端口*/
sbit REL_UPDW=P2^0;
sbit REL_C   =P2^1;
sbit P_UPDW  =P2^2;
sbit TRI_C   =P2^3;
sbit WDI     =P2^4;
sbit Q_DW    =P2^5;
sbit Q_UP    =P2^6;
sbit T_UPDW  =P2^7;

sbit  PD     =P0^0;
sbit  PC     =P0^1;
sbit  PB     =P0^2;
sbit  PA     =P0^3;
sbit  XXC    =P0^4;
sbit  SXC    =P0^5;
sbit  TT1    =P0^6;
sbit  TT2    =P0^7;
unsigned char key;
unsigned char keynumber;

#define NOP()  _nop_()
                                                                                                                                                                                                                                                                                          
 
 void processknock();
 void whith();
 void top();
 void vibrasion();
 void roll();
 void mode();
 void fixposition();
 void bottom();
 void strength();
 void speed();
 void power();
 void timer();
 void fullautomatic();
 void rising();
 void descent();
 void(*pfunction)();     //------------函数指针

 void(*code tab[])()={  processknock, whith, top, vibrasion, roll,
                        mode, fixposition,bottom,strength,  speed,
		            power,timer,fullautomatic, rising, descent
					                                     };//------------函数数组
/*----------------------------WATCHDOG-------------------------------------------------------*/
void watchdog()
{
  WDI=0;
  NOP();NOP();
  WDI=1;
  NOP();NOP();
  WDI=0;
}
/*-----------------------------------delay()-------------------------*/
void delay(unsigned char m,unsigned char n)
{
  unsigned char i,j;
  watchdog();
  for(i=0;i<m;i++)
  { for(j=0;j<n;j++);}
}

/*-------------------------Key Scan  Procedure-----------------------*/
unsigned char keyscan()
 {
  unsigned char scancode;
  unsigned char keycode;
  P3=0xff;	            //初始化
  scancode=0xdf;        //置扫描码
  while(scancode!=0xff)
    {
	   P3 =scancode;              //输入扫描码 ,扫描CS0列
	   keycode =P3;		      //读键值
	   if((keycode&0x1f)!=0x1f)
	   delay(10,10);
	   if((keycode&0x1f)!=0x1f) //去抖
	   { 
           free=1;keydown=1;
           keynumber=keycode;//扫描到按下的键,退出扫描
	     break;
	   }			                 
	   scancode=(keycode<<1)|0x1f;	//更新扫描码,左移一位
	 
    }
   	
  while((P3&0x1f)!=0x1f)//等待按键释放
      {
        TR0=1;
        while(!TF0);        //50ms定时       
        TR0=0;
        TH0=0XA5;TL0=0X67;
        break;              //超过50MS为连续键
      }
  if((P3&0x1f)==0x1f)delay(2,10);
  if((P3&0x1f)==0x1f)    //键释放及按下标志,按下为1,释放为0   
     {
      free=0;keydown=0;
     }

  keynumber=~keynumber;//键值取反,获取简明的最终键码值 
  switch(keynumber)
    {
	  case 0x21 :NOP();
	            return (key=0);	 //揉捏/敲打
				break;
	  case 0x22 :NOP();
	            return(key=1);	 //宽度调节
				break;
	  case 0x24 :NOP();
	            return(key=2);    //上
				break;
	  case 0x28 :NOP();
	            return(key=3);	 //捶击开关
				break;
	  case 0x30 :NOP();
	            return(key=4);	 //滚压
				break;
	  case 0x41 :NOP();
	            return(key=5);	 //模式
				break;
	  case 0x42 :NOP();
	            return(key=6);    //定位
				break;
	  case 0x44 :NOP();
	            return(key=7);	 //下
				break;
	  case 0x48 :NOP();
		        return(key=8);	 //强度
				break;
	  case 0x50 :NOP();
	            return(key=9);	 //速度
				break;
	  case 0x81 :NOP();
	            return(key=10);	 //总开关
				break;
	  case 0x82 :NOP();
	       
	            return(key=11);	 //定时
				break;

	  case 0x84 :NOP();
	            return(key=12);	 //全?
				break;
	  case 0x88 :NOP();
	            return(key=13);	 //上升
				break;
	      
      case 0x90:NOP();
	            return(key=14);    //下降
				break;
	  default:NOP();
	            return(key=16);
	            break;
	 }
}
/*-----------------取函数--------------------------------*/
void takefunc()
{
  pfunction=tab[key];
  if(key!=16)
  (*pfunction)();
  return;
}


/*------------------------------------------------*/
void rising()
{ 
while(1)
  {
     keyscan();
     REL_C=0;
     delay(30,255);
     REL_C=1;
     delay(30,255);
     if(keydown&&(key!=13))
     takefunc();
     //if(key==2|key==7)break;
  }
 return;
}
/*-------------------------------------------------*/
void descent()
{ 
  TRI_C=0;
  REL_C=0;
  delay(65,255);
  REL_C=1;
  delay(65,255);
}


/*-----------------------------------------------*/
void bottom()
{
    Q_UP=1;
    Q_DW=1;
    REL_UPDW=0;
    keyscan();
    if(keydown&(!Q_DW))
     {
      T_UPDW=0;
      return;
     }
    NOP();NOP();
    REL_UPDW=1;
    
}
/*--------------------------------------------*/
void top()
{
     Q_UP=1;
     Q_DW=1;
     REL_UPDW=1;
     keyscan();
     if(keydown&(!Q_UP))
      {
        T_UPDW=0; 
        return;
      }
     NOP();
     NOP();
     REL_UPDW=0;
LOOP:NOP();
 
} 
/*--------------------main-------------------------------*/			  


void main()
{ 	

        watchdog();
        TMOD=0X01;
        TH0=0XA5;
        TL0=0X67;
        TF0=0;
       
        SP=0x55;
        keyscan();
        takefunc();
}





































⌨️ 快捷键说明

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