一、训练任务
任务一
独立按键的基本操作
1.1 任务描述
在CT107D单片机综合训练平台上,首先将J5处的跳帽接到2-3引脚,使按键S4-S7四个按键的另外一端接地从而成为4个独立键盘。在扫描按键的过程中,发现有按键触发信号后,先做去抖动处理,当确认为按键按下时,才进行相应的功能处理。
1.2 基本操作
按下S7,点亮L1,松开按键熄灭;
按下S6,点亮L2,松开按键熄灭;
按下S5,点亮L3,松开按键熄灭;
按下S4,点亮L4,松开按键熄灭;
按键均做去抖
任务二
独立按键的扩展应用
1.1 任务描述
按键S7和S6为选择键,确定控制键控制那组LED指示灯。按键S5和S4为控制键,按键该键点亮指定的LED指示灯,松开后熄灭。
1.2 基本操作
按下S7点亮L1指示灯,L1点亮后,S6不响应操作,S5控制L3, S4控制L4,再次按下S7, L1指示灯熄灭,S6可可响应操作。
按下S6点亮E2指示灯,L2点亮后,S7不响应操作,S5控制L5, S4控制L6,再次按下S6, L2指示灯熄灭,S7可可响应操作。
S7和S6未按下时,即L1或L 2未点亮时S5和S4不响应操作,也就是未作LED灯区域选择时,控制键不能操作。
二、原理图
当你没有按下时,I/O口是高电平,当你按下时,接地,I/O口是低电平
眺帽接到BTN
三、代码展示
3.1 任务一代码
#include <reg52.h> typedef unsigned int uint; typedef unsigned char uchar; sbit S7 = P3^0; sbit S6 = P3^1; sbit S5 = P3^2; sbit S4 = P3^3; sbit L1 = P0^0; sbit L2 = P0^1; sbit L3 = P0^2; sbit L4 = P0^3; //配置HC138 void SelectHC138(uchar channel) { switch(channel) { case 4: P2 = (P2 & 0X1F) | 0X80; break; case 5: P2 = (P2 & 0X1F) | 0Xa0; break; case 6: P2 = (P2 & 0X1F) | 0Xc0; break; case 7: P2 = (P2 & 0X1F) | 0Xe0; break; } } //初始化系统 void Initsys() { SelectHC138(5); P0 = 0X00;//关闭蜂鸣器和继电器 SelectHC138(4); P0 = 0XFF;//关闭LED } void DelayK(uint n) { while(n--); } //配置独立按键 void ScanKeys_Alone() { if(S7 == 0) { DelayK(100); //去抖 if(S7 == 0) { L1 = 0; while(S7 == 0); L1 = 1; } } if(S6 == 0) { DelayK(100); //去抖 if(S6 == 0) { L2 = 0; while(S6 == 0); L2 = 1; } } if(S5 == 0) { DelayK(100); //去抖 if(S5 == 0) { L3 = 0; while(S5 == 0); L3 = 1; } } if(S4 == 0) { DelayK(100); //去抖 if(S4 == 0) { L4 = 0; while(S4 == 0); L4 = 1; } } } void main() { Initsys(); while(1) { SelectHC138(4); ScanKeys_Alone(); } }
3.2 任务二代码
#include <reg52.h> typedef unsigned int uint; typedef unsigned char uchar; sbit S7 = P3^0; sbit S6 = P3^1; sbit S5 = P3^2; sbit S4 = P3^3; sbit L1 = P0^0; sbit L2 = P0^1; sbit L3 = P0^2; sbit L4 = P0^3; sbit L5 = P0^4; sbit L6 = P0^5; //配置HC138 void SelectHC138(uchar channel) { switch(channel) { case 4: P2 = (P2 & 0X1F) | 0X80; break; case 5: P2 = (P2 & 0X1F) | 0Xa0; break; case 6: P2 = (P2 & 0X1F) | 0Xc0; break; case 7: P2 = (P2 & 0X1F) | 0Xe0; break; } } //初始化系统 void Initsys() { SelectHC138(5); P0 = 0X00;//关闭蜂鸣器和继电器 SelectHC138(4); P0 = 0XFF;//关闭LED } void DelayK(uint n) { while(n--); } //状态变量 uchar stat_K = 0; //配置独立按键 void ScanKeys_Alone() { if(S7 == 0) { DelayK(100); //去抖 if(S7 == 0) { if(stat_K == 0) { L1 = 0; stat_K = 1; //第一次按下,形成状态一 } else if(stat_K == 1) { L1 = 1; stat_K = 0; //第二次按下,初始化状态 } while(S7 == 0); //等待按键松开 } } if(S6 == 0) { DelayK(100); //去抖 if(S6 == 0) { if(stat_K == 0) { L2 = 0; stat_K = 2; //第一次按下,形成状态二 } else if(stat_K == 2) { L2 = 1; stat_K = 0;//第二次按下,初始化状态 } while(S6 == 0); //等待按键松开 } } if(S5 == 0) { DelayK(100); //去抖 if(S5 == 0) { if(stat_K == 1) { L3 = 0; while(L3 == 0); L3 = 1; } else if(stat_K == 2) { L4 = 0; while(L4 == 0); L4 = 1; } } } if(S4 == 0) { DelayK(100); //去抖 if(S4 == 0) { if(stat_K == 1) { L5 = 0; while(L5 == 0); L5 = 1; } else if(stat_K == 2) { L6 = 0; while(L6 == 0); L6 = 1; } } } } void main() { Initsys(); while(1) { SelectHC138(4); ScanKeys_Alone(); } }
注意事项
独立按键不需要配置HC138译码器
主函数里,初始化系统写在while(1)外面