1、按键电路图
定义四个按键引脚
1、按键按下 为 输入为低电平
2、按键不按下 IO有上拉电阻,为高电平
// 定义 按键的 管教
sbit KEY1 = P3^1;
sbit KEY2 = P3^0;
sbit KEY3 = P3^2;
sbit KEY4 = P3^3;
2、LED灯电路图
LED 输出高电平为亮
// 定义LED灯 管教
sbit LED1 = P2^0;
sbit LED2 = P2^1;
sbit LED3 = P2^2;
sbit LED4 = P2^3;
3、编程思想设计
1、定义按键管教
2、定义LED灯管教
3、定义按键的键值
4、定义一个函数 来判断按键是否被按下
5、先判断 按键是否被按下--> 在判断没有按下按键怎么样-->否则返回 没有按下
static u8 key =1; // 定义一个不被改变的u8 类型的 变量 key 赋值为1
if(mode)key=1; // 连续扫描按键,这里给 是单词扫描为0 ,多次扫描为1if(key=1 && (KEY1==0 || KEY2==0 || KEY3==0 || KEY4==0)) // key1 ==0 为按下, 为什么用 || 或运算符 只有有一个为真,就是那个按键按下了
#include "reg52.h"// 重新命名类型
typedef unsigned char u8;
typedef unsigned int u16;// 定义 按键的 管教
sbit KEY1 = P3^1;
sbit KEY2 = P3^0;
sbit KEY3 = P3^2;
sbit KEY4 = P3^3;// 定义LED灯 管教
sbit LED1 = P2^0;
sbit LED2 = P2^1;
sbit LED3 = P2^2;
sbit LED4 = P2^3;// 使用宏定义独立按键按下的键值
#define KEY1_PRESS 1
#define KEY2_PRESS 2
#define KEY3_PRESS 3
#define KEY4_PRESS 4
#define KEY_UNPRESS 0
// 延时函数
void delay_times(u16 times)
{while(times--);
}// 按键函数
u8 key_scan(u8 mode)
{static u8 key =1; // 定义一个不被改变的u8 类型的 变量 key 赋值为1 if(mode)key=1; // 连续扫描按键,这里给 是单词扫描为0 ,多次扫描为1if(key=1 && (KEY1==0 || KEY2==0 || KEY3==0 || KEY4==0)) // key1 ==0 为按下, 为什么用 || 或运算符 只有有一个为真,就是那个按键按下了{delay_times(1000); // 消抖 1000us = 10 mskey =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;
}// 主函数
void main()
{u8 key=0;while(1){key=key_scan(1); // key_scan 有返回值需要被接收 if(key==KEY1_PRESS)LED1=~LED1; // LED1灯 取反 发光else if(key==KEY2_PRESS)LED2=~LED2;else if(key==KEY3_PRESS)LED3=~LED3;else if(key==KEY4_PRESS)LED4=~LED4; }
}