1、程序
// 试验景象:下载程序后,按下“独立按键”模块中K1键,管制D1指示灯亮灭 // ,按下“独立按键”模块中K2键,管制D2指示灯亮灭// ,按下“独立按键”模块中K3键,管制D3指示灯亮灭 // ,按下“独立按键”模块中K4键,管制D4指示灯亮灭 #include "reg52.h"typedef unsigned int uint16; //对系统默认数据类型进行重定义typedef unsigned char uint8;//定义独立按键管制脚sbit KEY1=P3^1; // K1sbit KEY2=P3^0; // K2sbit KEY3=P3^2; // K3sbit KEY4=P3^3; // K4//定义LED管制脚sbit LED1=P2^0; // D1sbit LED2=P2^1; // D2sbit LED3=P2^2; // D3sbit LED4=P2^3; // D4//应用宏定义独立按键按下的键值#define KEY1_PRESS 1#define KEY2_PRESS 2#define KEY3_PRESS 3#define KEY4_PRESS 4#define KEY_UNPRESS 0 /******************************************************************************** 函 数 名 : delay_10us* 函数性能 : 延时函数,ten_us=1时,大概延时10us* 输 入 : ten_us* 输 出 : 无*******************************************************************************/void delay_10us(uint16 ten_us) //消抖{ while(ten_us--); }/******************************************************************************** 函 数 名 : key_scan* 函数性能 : 检测独立按键是否按下,按下则返回对应键值* 输 入 : mode=0:单次扫描按键 mode=1:间断扫描按键* 输 出 : KEY1_PRESS:K1按下 KEY2_PRESS:K2按下 KEY3_PRESS:K3按下 KEY4_PRESS:K4按下 KEY_UNPRESS:未有按键按下*******************************************************************************/uint8 key_scan(uint8 mode){ static uint8 key=1; if(mode)key=1;//间断扫描按键 if(key==1&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0))//任意按键按下 { delay_10us(1000);//消抖10ms key=0; if(KEY1==0) return KEY1_PRESS; else if(KEY2==0) return KEY2_PRESS; else if(KEY3==0) return KEY3_PRESS; else if(KEY4==0) return KEY4_PRESS; } else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1) //无按键按下 { key=1; } return KEY_UNPRESS; }/******************************************************************************** 函 数 名 : main* 函数性能 : 主函数* 输 入 : 无* 输 出 : 无*******************************************************************************/void main(){ uint8 key=0; while(1) { key=key_scan(0); if(key==KEY1_PRESS)//检测按键K1是否按下 LED1=!LED1;//LED1状态翻转 else if(key==KEY2_PRESS)//检测按键K2是否按下 LED2=!LED2;//LED1状态翻转 else if(key==KEY3_PRESS)//检测按键K3是否按下 LED3=!LED3;//LED1状态翻转 else if(key==KEY4_PRESS)//检测按键K4是否按下 LED4=!LED4;//LED1状态翻转 } }
2、后果