锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

单片机多功能按键处理程序+视频

时间:2024-04-30 15:37:09



源程序:
/*-----------------------------------------------------------------------------
按键用变量定义
-----------------------------------------------------------------------------*/
volatile unsigned char idata KEY1=0;//多功能按键功能识别器。


volatile unsigned char idata KEY2=0;//多功能按键功能识别器。
volatile unsigned char idata KEYBZ2;
volatile unsigned char idata KEY3=0;//多功能按键功能识别器。
volatile unsigned char idata KEYBZ3;
volatile unsigned char idata KEY4=0;//多功能按键功能识别器。

volatile unsigned char idata KEY5=0;//多功能按键功能识别器。

volatile unsigned char idata KEY6=0;//多功能按键功能识别器。
volatile bit =0;
volatile bit FWBZ;


/*-----------------------------------------------------------------------------
三变量用于默认的速度,宽度,高度。
-----------------------------------------------------------------------------*/
volatile unsigned char idata b=100;//单位是rpm/min
volatile unsigned char idata BBZ;
volatile unsigned char idata c=2; //宽度单位是毫米
volatile unsigned char idata CBZ;
volatile unsigned char idata d=1;//高度单位是毫米
volatile unsigned char idata Z;


/*-------------------------------------------------------------
P0引脚定义: P0口有5种定义,每种定义根据P2口给定功能不同而不同。
每种功能不能同时实现,否则会出现混乱。

-------------------------------------------------------------*/

sbitLED_SD =P0^0; //指示灯
sbit LED_KD =P0^1;
sbitLED_HD =P0^2;
sbitLED_ =P0^3;
sbitLED_FW =P0^4; //按键1--第一路调光
sbit SM_BW =P0^5; //按键2--第一路开关
sbitSM_SW =P0^6; //按键3--第二路调光
sbitSM_GW =P0^7;

/*-------------------------------------------------------------
P1引脚定义 :P1口为限位检测口。

-------------------------------------------------------------*/
sbit BUZ=P1^0;
sbit ZZMC=P1^1;//主轴冲检测
sbitKEY_1=P1^2; // Z轴限位上 ,当高电平表示有限位
sbitKEY_2=P1^3; // Z轴限位下。当高电平表示有限位
sbitKEY_3=P1^4; //主轴中点限位。当高电平表示有限位
sbitKEY_4=P1^5; //角度限位左 。当高电平表示有限位
sbitKEY_5=P1^6; //角度限位右 。当高电平表示有限位
sbitKEY_6 =P1^7; //角度输入2
sbitKEY_7 =P2^7; //角度电机输入2



/* -------------------------------------------------------------
P3引脚定义:P3口为主轴电机调速端口和
主轴编码方向编码,还有中断。
-------------------------------------------------------------*/
sbit CLK = P3^0; //I通讯脉冲
sbitDATAS =P3^1; //SPI通讯数据
sbit B_I =P3^2 ; //SPI通讯反馈
sbitZZZD =P3^4; //主轴中点检测
sbitZDATA =P3^5; //主轴SPI通讯数据口
sbit LK =P3^6;//主轴SPI通讯脉冲口
sbitZSTB=P3^7; //SPI通讯使能口

/*-----------------------------------------------------------------------------
LED数显7段编码,调用时只需table[NUM]即可。
-----------------------------------------------------------------------------*/


unsigned char code table[]=
{
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,
0x71,0x00,0x40,0x00
};


/*-----------------------------------------------------------------------------
函数功能 : MS 毫秒 延迟函数
-----------------------------------------------------------------------------*/
void Delay(unsigned int i)
{
unsigned int j;
for(i;i>0;i--)
{
for(j=0;j<125;j++)
{;}
}
}


/*-----------------------------------------------------------------------------
函数功能 : us 微秒 延迟函数
-----------------------------------------------------------------------------*/
void MyDelay(unsigned int time)
{
while(time--)
{
_nop_();
}
}

/*-----------------------------------------------------------------------------
函数功能 : us 微秒 精确US延迟 12MHZ延迟6us
-----------------------------------------------------------------------------*/
void MyDelay2()
{
_nop_();
}


/*-----------------------------------------------------------------------------
函数功能 :显示功能显示百位十位个位显示 工作参数
-----------------------------------------------------------------------------*/
void XSGN(unsigned char a)
{
unsigned char b,c,d;//百位、十位、个位,数显。
EA=0;//关中断等待全部数据送完
b=a/100;//求模运算,取A的百位到百位变量。
if(b==0)
{
P2=0xff;//百位没有数则没有显示
SM_BW=1;
}
else
{
P2=~table[b];//百位有显示则输出参数
SM_BW=1;
_nop_();
_nop_();
}
SM_BW=0; //关闭百位数显
c=a%100;//取余数运算,取得数为十位和个位。
d=c; //保存十位和个位数。
c=c/10; //求模运算 取十位数。
if(c==0&&b==0)
{
P2=0xff;
SM_SW=1;
}
else
{
P2=~table[c];
SM_SW=1;
_nop_();
_nop_();
}
SM_SW=0;
d=d%10; //取个位。
Delay(20);
if(d==0&&c==0&&b==0)
{
P2=0xff;
SM_GW=1;
}
else
{
P2=~table[d];
SM_GW=1;
_nop_();
_nop_();
}
SM_GW=0;
IE1=0;
IE0=0;
EA=1;//打开键盘中断
}


/*-----------------------------------------------------------------------------
函数功能 :运行状态指示LED指示灯,与送入参数。
-----------------------------------------------------------------------------*/



/*-----------------------------------------------------------------------------
函数功能 :SPI通讯(输出)16BIT输出,DH的高4位决定输出控制指令还是参数数据。当DH高4位且低4位全0那么输出为控制指令
当高4位全高,由低4位决定送出的数据是对应于哪一块的数据。 具体参数介绍 Control (0,0);系统关闭中。Control (0,1);电源开启中。
Control (0,2);系统复位中Control (0,3);系统运行中。Control (0,4);系统暂停中。 Control (0,5);系统从暂停开始运行。
送入数据示意:Control( 0xf0,b); 送入的参数是速度参数。Control( 0xf1,c); 送入的参数是宽带参数。 Control( 0xf2,d);
送入的数据是厚度参数。


-----------------------------------------------------------------------------*/

void Control(unsigned char DH,unsigned char DL)
{
unsigned int i,cmd;
EA=0;
EX0=0;
cmd=DL;
cmd|=DH<<8;
STB_I = 0;//拉低片选
Delay(1);
for(i=0;i<16;i++)
{
CLK = 0;

//这里大约是100us
if(cmd & 0x8000)DATAS = 1;//把datas的参数与16进制数8000进行位与运算把结果给datas(如果有数则DAT=1
else DATAS = 0;//否则DAT=0
MyDelay(50) ;

CLK = 1;
MyDelay(50) ;//这里大约是100us
cmd <<= 1;
}
DATAS = 1;
STB_I = 1;
CLK = 1;

IE1=0;
IE0=0;

EA=1;

}

/*-----------------------------------------------------------------------------
函数功能 :电源开启下屏闪烁功能

-----------------------------------------------------------------------------*/

/*-----------------------------------------------------------------------------
函数功能 : 数据集中处理
-----------------------------------------------------------------------------*/
void main(void)
{
BBZ=b; //b数据的判断代码 用于判断速度值的改变
CBZ=c; //c数据的判断代码
DBZ=d;
KEYBZ2= KEY2;
SM_BW=0; //数码管百位
SM_SW=0; //数码管十位
SM_GW=0; //数码管个位
BUZ=1; //关断
EX1=1; //开启按键响应
EA=1; //开启所有设备响应
IT1=1; //设定键盘响应为下降沿响应

IT0=1; //复位识别为下降沿识别

while(1)
{
if(KEY1==0){P2=0XFF;P0=0XFF; Control (0,0); }
while(KEY1==0){;}
if(KEY1==1) {Control( 0,1);}
while(KEY1==1)
{
SM_BW=1;
SM_SW=1;
SM_GW=1;
P2=0;
LED_SD=0;
LED_KD=0;
LED_HD=0;
LED_YX=0;
LED_FW=0;
BUZ=1;
Delay(500);
P2=0XFF;
LED_SD=1;
LED_KD=1;

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章