独立按键模块

  • 实验简介
    • 实验原理图
    • 实验原理
  • 实验程序
    • 按下独立键盘上每一个键,对应LED状态取反
    • 按键值在数码管上显示
    • S4长按显示4,短按显示0,其他显示原来的键值

实验简介

CT107D单片机开发板上的独立按键控制, 指示灯亮灭,数码管显示按键值

实验原理图

实验原理

  • 器件介绍:按键是一种电子开关,使用时轻轻按开关按钮就可使开关接通,当松开手时, 开关断开。CT107D上的为机械弹性开关,由于机械点的弹性作用,按键开关在闭合时不会马上稳定的接通,在断开时也不会一下子断开,因而在闭合和断开的瞬间均伴随着一连串的抖动。所以我们在实验程序总要注意按键消除抖动(简称“消抖”)的操作。
  • 消除抖动:消抖有软件消抖硬件消抖,为了方便,我们使用软件消抖,具体操作为,先设置按键IO口输入为高电平,读取IO口是否有按键被按下(即有低电平出现),使用软件延时函数10ms,再次检测IO口是否仍为低电平,若是,则有按键被按下,进而继续下面的按键程序。
  • 实现须知:由于本实验独立按键需要控制LED,故锁存端LE得为高电平,即得控制Y4C为高电平,下图知Y4C,受Y4控制,WR输入固定为低电平(0),了解数字电路中或非门知识,我们得使得Y4输出低电平,才能使的Y4C输出高电平,而Y4为74HC138芯片(38译码器)的一个管脚,查阅对应芯片手册可知,其真值表满足C = 1,B = 0,A = 0,(对应管脚P27,P26,P25),才能使得Y4输出低电平,同时代码实现时要保证管脚P2的其他的管脚(0~4)保持原来的状态 。同理控制数码管的Y6C和Y7C,以及控制蜂鸣器的Y5C也一样
  • 注意:按键功能选择BTN(J5上的跳线2与3相连,此时切换至S7,S6,S5,S4独立按键模块)


实验程序

按下独立键盘上每一个键,对应LED状态取反

//config.h--用于声明头文件,声明函数,声明一些经常使用的变量或难书写的语句
#ifndef _CONFIG_H
#define _CONFIG_H
#include <STC15F2K60S2.H>//对应芯片函数头文件,定义了一些特殊功能寄存器
//typedef unsigned char uchar;
#define uchar unsigned charvoid Delay10ms();        //@12.000MHz#endif
//独立按键部分,记得接线帽切换为BTN
//main.c文件--按下按键S7,LED灯1亮,按下按键S6,LED灯2亮,按下按键S5,LED灯3亮,按下按键S4,LED灯4亮
#include "config.h"//定义特殊位功能寄名称
sbit S7 = P3^0;
sbit S6 = P3^1;
sbit S5 = P3^2;
sbit S4 = P3^3;sbit led1 = P0^0;
sbit led2 = P0^1;
sbit led3 = P0^2;
sbit led4 = P0^3;void led_init()//LED初始化为全部不亮
{P2 = (P2 & 0x1f) | 0x80;P0 = 0xff;
}void closeBeep()
{P2 = (P2 & 0x1f) | 0xa0;  //开启译码器的Y6端口,同时不改变其他管脚状态P0 &= 0xaf;//1010 1111//关闭蜂鸣器和继电器,P06和P04端口分贝输入,输出低电平P2 &= 0x1f;//P27 ~ 25清零
}void keyPros()
{ if (S7 == 0){Delay10ms();//消抖if (S7 == 0){led1 = ~led1;//led灯1的状态取反}while(!S7);//判断按键是否松开}else if (S6 == 0){Delay10ms();//消抖if (S6 == 0){led2 = ~led2;//led灯1的状态取反}while(!S6);//判断按键是否松开}else if (S5 == 0){Delay10ms();//消抖if (S5 == 0){led3 = ~led3;//led灯1的状态取反}while(!S5);//判断按键是否松开}else if (S4 == 0){Delay10ms();//消抖if (S4 == 0){led4 = ~led4;//led灯1的状态取反}while(!S4);//判断按键是否松开}}void main()
{   closeBeep();led_init();while(1){keyPros();}
}void Delay10ms()       //@12.000MHz
{unsigned char i, j;i = 117;j = 184;do{while (--j);} while (--i);
}

按键值在数码管上显示

//config.h--用于声明头文件,声明函数,声明一些经常使用的变量或难书写的语句
#ifndef _CONFIG_H
#define _CONFIG_H
#include <STC15F2K60S2.H>//对应芯片函数头文件,定义了一些特殊功能寄存器
//typedef unsigned char uchar;
#define uchar unsigned charvoid Delay10ms();        //@12.000MHz
void Delay1000us();     //@12.000MHz#endif
//独立按键部分,记得接线帽切换为BTN
//main.c文件--按键值在数码管上显示
#include "config.h"//共阳数码管位选表
uchar smgwei[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//共阴数码管码值表
uchar smgduan[] = {                       //标准字库
//   0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black  -     H    J    K    L    N    o   P    U     t    G    Q    r   M    y0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};    //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1uchar key_num = 20;
uchar tab[8];//定义特殊位功能寄名称
sbit S7 = P3^0;
sbit S6 = P3^1;
sbit S5 = P3^2;
sbit S4 = P3^3;void led_init()//LED初始化为全部不亮
{P2 = (P2 & 0x1f) | 0x80;P0 = 0xff;
}void closeBeep()
{P2 = (P2 & 0x1f) | 0xa0;  //开启译码器的Y6端口,同时不改变其他管脚状态P0 &= 0xaf;//1010 1111//关闭蜂鸣器和继电器,P06和P04端口分贝输入,输出低电平P2 &= 0x1f;//P27 ~ 25清零
}void keyPros()
{ static bit key_flag = 1;//注意注意static修饰的静态变量使用if ((!S7 || !S6 || !S5 || !S4) && key_flag){Delay10ms();//消抖if(S7 == 0) { key_flag = 0; key_num = 7;}if(S6 == 0) { key_flag = 0; key_num = 6;}if(S5 == 0) { key_flag = 0; key_num = 5;}if(S4 == 0) { key_flag = 0; key_num = 4;}}else if (S7 && S6 && S5 && S4){key_flag = 1;}}void selectHC573LE(uchar num)
{switch(num){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;default: P2 &= 0x1f;break;}
}void digDisplay(uchar pos, letter)
{//位选selectHC573LE(6);P0 = smgwei[pos - 1];//段选selectHC573LE(7);P0 = ~smgduan[letter];Delay1000us();selectHC573LE(0);P0 = 0xff;
}void display()
{uchar i;for (i = 0; i < 8; i++)digDisplay(i + 1, tab[i]);
}void display_ds(uchar p1, p2, p3, p4, p5, p6, p7, p8)
{tab[0] = p1;tab[1] = p2;tab[2] = p3;tab[3] = p4;tab[4] = p5;tab[5] = p6;tab[6] = p7;tab[7] = p8;
}
void main()
{   uchar a = 0;closeBeep();led_init();while(1){keyPros();display();if (key_num == 7){a = 7;key_num = 20;}if (key_num == 6){a = 6;key_num = 20;}if (5 == key_num){a = 5;key_num = 20;}if (4 == key_num){a = 4;key_num = 20;}display_ds(16, 16, 16, 16, 16, 16, 16, a);//16为黑屏的对应码值}
}void Delay10ms()       //@12.000MHz
{unsigned char i, j;i = 117;j = 184;do{while (--j);} while (--i);
}void Delay1000us()     //@12.000MHz
{unsigned char i, j;i = 12;j = 169;do{while (--j);} while (--i);
}

S4长按显示4,短按显示0,其他显示原来的键值

//config.h--用于声明头文件,声明函数,声明一些经常使用的变量或难书写的语句
#ifndef _CONFIG_H
#define _CONFIG_H
#include <STC15F2K60S2.H>//对应芯片函数头文件,定义了一些特殊功能寄存器
//typedef unsigned char uchar;
#define uchar unsigned charvoid Delay10ms();        //@12.000MHz
void Delay1000us();     //@12.000MHz#endif
//独立按键部分,记得接线帽切换为BTN
//main.c文件--对于S4按键,长按显示4,短按显示0,其他按键显示原来的键值
#include "config.h"//共阳数码管位选表
uchar smgwei[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//共阴数码管码值表
uchar smgduan[] = {                       //标准字库
//   0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black  -     H    J    K    L    N    o   P    U     t    G    Q    r   M    y0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};    //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1uchar key_num = 20, key_num2 = 100;uchar tab[8];//定义特殊位功能寄名称
sbit S7 = P3^0;
sbit S6 = P3^1;
sbit S5 = P3^2;
sbit S4 = P3^3;sbit led1 = P0^0;
sbit led2 = P0^1;
sbit led3 = P0^2;
sbit led4 = P0^3;void led_init()//LED初始化为全部不亮
{P2 = (P2 & 0x1f) | 0x80;P0 = 0xff;
}void closeBeep()
{P2 = (P2 & 0x1f) | 0xa0;  //开启译码器的Y6端口,同时不改变其他管脚状态P0 &= 0xaf;//1010 1111//关闭蜂鸣器和继电器,P06和P04端口分贝输入,输出低电平P2 &= 0x1f;//P27 ~ 25清零
}void keyPros()
{ static bit key_flag = 1;//注意注意static修饰的静态变量使用if ((!S7 || !S6 || !S5 || !S4) && key_flag){Delay10ms();//消抖if(S7 == 0) { key_flag = 0; key_num = 7;}if(S6 == 0) { key_flag = 0; key_num = 6;}if(S5 == 0) { key_flag = 0; key_num = 5;}if(S4 == 0) { key_flag = 0; key_num = 4; key_num2 = 4;}}else if (S7 && S6 && S5 && S4){key_num2 = 0;key_flag = 1;}}void selectHC573LE(uchar num)
{switch(num){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;default: P2 &= 0x1f;break;}
}void digDisplay(uchar pos, letter)
{//位选selectHC573LE(6);P0 = smgwei[pos - 1];//段选selectHC573LE(7);P0 = ~smgduan[letter];Delay1000us();selectHC573LE(0);P0 = 0xff;
}void display()
{uchar i;for (i = 0; i < 8; i++)digDisplay(i + 1, tab[i]);
}void display_ds(uchar p1, p2, p3, p4, p5, p6, p7, p8)
{tab[0] = p1;tab[1] = p2;tab[2] = p3;tab[3] = p4;tab[4] = p5;tab[5] = p6;tab[6] = p7;tab[7] = p8;
}
void main()
{   uchar a = 0, b = 20;closeBeep();led_init();while(1){keyPros();display();if (key_num == 7){a = 7;key_num = 20;}if (key_num == 6){a = 6;key_num = 20;}if (5 == key_num){a = 5;key_num = 20;}if (4 == key_num){a = 0;key_num = 20;}if (4 == key_num2)//对于S4按键,长按显示4,短按显示0,其他按键显示原来的键值{b = 4;display_ds(16, 16, 16, 16, 16, 16, 16, b);//16为黑屏的对应码值}else if (0 == key_num2){display_ds(16, 16, 16, 16, 16, 16, 16, a);//16为黑屏的对应码值}}
}void Delay10ms()       //@12.000MHz
{unsigned char i, j;i = 117;j = 184;do{while (--j);} while (--i);
}void Delay1000us()     //@12.000MHz
{unsigned char i, j;i = 12;j = 169;do{while (--j);} while (--i);
}

《蓝桥杯CT107D单片机竞赛板》:独立按键模块相关推荐

  1. 《蓝桥杯CT107D单片机竞赛板》:蜂鸣器模块

    蜂鸣器模块 实验简介 实验原理图 实验原理 实验程序 关闭蜂鸣器与继电器 简易报警器原理 实验简介 采用软件方式,使得CT107D单片机竞赛板上的蜂鸣器和继电器分别不发声和不吸附. 实验原理图 实验原 ...

  2. 《蓝桥杯CT107D单片机竞赛板》:中断模块

    中断模块 实验简介 实验原理图 实验原理 实验程序 外部中断控制L1与L2的状态反转 外部中断控制蜂鸣器和继电器 实验简介 外部中断控制LED亮灭,蜂鸣器是否发声,继电器是否吸附. 实验原理图 注:原 ...

  3. 《蓝桥杯CT107D单片机竞赛板》:矩阵键盘模块

    矩阵键盘模块 实验简介 实验原理图 实验原理 实验程序 显示对应的按键值 2 * 2变式矩阵按键实现独立按键 2 * 2变式矩阵键盘控制蜂鸣器 2 * 2变式矩阵按键控制数码管做加减操作 另一种易理解 ...

  4. 《蓝桥杯CT107D单片机竞赛板》:数码管模块

    数码管模块 实验简介 实验原理图 实验原理 实验程序 静态显示 奇数位数码管静态显示'1' 奇数位数码管静态显示'-.' 奇数位数码管静态显示'P' 奇数位数码管静态显示'9.' 动态显示 数码管从左 ...

  5. 蓝桥杯CT107D 单片机编程例题

    一.按键 #include "stc15f2k60s2.h" #define InitHC138(n) {P2 = P2 & 0x1f | (n << 5);} ...

  6. 蓝桥杯 — CT107D单片机综合训练平台原理图

    目录 1.独立与矩阵按键原理图 2.LED 灯原理图 3.数码管原理图 4

  7. 蓝桥杯51单片机(一)超声波模块

    使用超声波模块并通过数码管显示距离 #include<stc15f2k60s2.h> #include"intrins.h" #define somenop {_nop ...

  8. 2020蓝桥杯之单片机设计与开发(1)——CT107D开发板了解与准备

    在快放假期间开始准备蓝桥杯,也感谢我的好朋友带我一起去了解这个比赛. 首先从单片机开始,比赛的时候使用的开发板是官方指定的CT107D单片机竞赛板V20. 先看上面的官方指定开发版原理图,包含了开发板 ...

  9. 蓝桥杯(单片机开发)训练笔记

    各模块电路分析 电源+CH341模块 电路功能:主要给单片机提供电源和UART串口调试和下载程序.TENTEN 这里整块开发板采用了双路供电.一路采用DC电源接口直接输入5V直流电压:另一路采用USB ...

最新文章

  1. linux 操作系统chgrp 的命令用法
  2. 信息系统项目管理师-案例分析
  3. STM32F4 HAL库开发 -- 工程模板解读
  4. HDU - 4847 Wow! Such Doge!
  5. 网易试题——关于箭头函数与this和arguments的关系
  6. 不想当全栈的设计师不是_但我不想成为产品设计师
  7. sphinx_Sphinx之谜:如何轻松地编写代码
  8. matlab 32和64,在32或64位matlab上运行?
  9. bootstrap的html高度很低,Bootstrap DIV没有填充100%背景颜色的高度
  10. python2.7个3.7之间传输文件_关于将python2.7转换为python3.7的说明,python27,python37,散记...
  11. Bailian4017 爬楼梯(POJ NOI0202-3089)【递推】
  12. 计算机陕西高校保研排名,陕西高校保研率排行,西安交通大学超30%排第一,西北工业第二...
  13. java 注解开发 解耦_Android java 解耦框架注解Dagger2
  14. OV2640摄像头模块
  15. Centos8安装docker及AWVS
  16. taxi计费器c语言程序,出租车计价器VHDL程序与仿真
  17. 积分形式的詹森不等式_均值不等式及其积分形式
  18. 罗技 连点 脚本_走心分享!当评测罗技MASTER 3遇上ANYWHERE 3_鼠标
  19. 苹果电脑开机慢怎么办 苹果笔记本开机特别慢的处理方法
  20. 已经提了离职,还有一周就走,公司突然把我移出企业微信,没法考勤打卡, 还要继续上班吗?...

热门文章

  1. 一键整理硬盘所有的照片和视频,手机照片的自动备份---多点相册
  2. 电磁场与电磁波——矢量场及其散度
  3. Matomo给你的网站开通自己的统计分析
  4. severlet 简单交互
  5. Unity json 序列化 和 反序列化
  6. Markdown 扩展语法-特殊字符
  7. taro更新页面数据_Taro 版本升级权威指南
  8. mac电脑复制粘贴使用command+c command+v
  9. SQL2000服务器时间怎么修改,修改sql2000服务器ip地址
  10. R语言ETL系列:汇总(summarise)