📄 zls_001.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 + -