
定义四个按键引脚
1、按键按下 为 输入为低电平
2、按键不按下 IO有上拉电阻,为高电平
// 定义 按键的 管教
sbit KEY1 = P3^1;
sbit KEY2 = P3^0;
sbit KEY3 = P3^2;
sbit KEY4 = P3^3;

LED 输出高电平为亮
// 定义LED灯 管教
sbit LED1 = P2^0;
sbit LED2 = P2^1;
sbit LED3 = P2^2;
sbit LED4 = P2^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 ,多次扫描为1
- if(key=1 && (KEY1==0 || KEY2==0 || KEY3==0 || KEY4==0)) // key1 ==0 为按下, 为什么用 || 或运算符 只有有一个为真,就是那个按键按下了
- {
- delay_times(1000); // 消抖 1000us = 10 ms
- 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;
- }
-
- // 主函数
- 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;
- }
- }
