《蓝桥杯CT107D单片机竞赛板》:独立按键模块
独立按键模块
- 实验简介
- 实验原理图
- 实验原理
- 实验程序
- 按下独立键盘上每一个键,对应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单片机竞赛板》:独立按键模块相关推荐
- 《蓝桥杯CT107D单片机竞赛板》:蜂鸣器模块
蜂鸣器模块 实验简介 实验原理图 实验原理 实验程序 关闭蜂鸣器与继电器 简易报警器原理 实验简介 采用软件方式,使得CT107D单片机竞赛板上的蜂鸣器和继电器分别不发声和不吸附. 实验原理图 实验原 ...
- 《蓝桥杯CT107D单片机竞赛板》:中断模块
中断模块 实验简介 实验原理图 实验原理 实验程序 外部中断控制L1与L2的状态反转 外部中断控制蜂鸣器和继电器 实验简介 外部中断控制LED亮灭,蜂鸣器是否发声,继电器是否吸附. 实验原理图 注:原 ...
- 《蓝桥杯CT107D单片机竞赛板》:矩阵键盘模块
矩阵键盘模块 实验简介 实验原理图 实验原理 实验程序 显示对应的按键值 2 * 2变式矩阵按键实现独立按键 2 * 2变式矩阵键盘控制蜂鸣器 2 * 2变式矩阵按键控制数码管做加减操作 另一种易理解 ...
- 《蓝桥杯CT107D单片机竞赛板》:数码管模块
数码管模块 实验简介 实验原理图 实验原理 实验程序 静态显示 奇数位数码管静态显示'1' 奇数位数码管静态显示'-.' 奇数位数码管静态显示'P' 奇数位数码管静态显示'9.' 动态显示 数码管从左 ...
- 蓝桥杯CT107D 单片机编程例题
一.按键 #include "stc15f2k60s2.h" #define InitHC138(n) {P2 = P2 & 0x1f | (n << 5);} ...
- 蓝桥杯 — CT107D单片机综合训练平台原理图
目录 1.独立与矩阵按键原理图 2.LED 灯原理图 3.数码管原理图 4
- 蓝桥杯51单片机(一)超声波模块
使用超声波模块并通过数码管显示距离 #include<stc15f2k60s2.h> #include"intrins.h" #define somenop {_nop ...
- 2020蓝桥杯之单片机设计与开发(1)——CT107D开发板了解与准备
在快放假期间开始准备蓝桥杯,也感谢我的好朋友带我一起去了解这个比赛. 首先从单片机开始,比赛的时候使用的开发板是官方指定的CT107D单片机竞赛板V20. 先看上面的官方指定开发版原理图,包含了开发板 ...
- 蓝桥杯(单片机开发)训练笔记
各模块电路分析 电源+CH341模块 电路功能:主要给单片机提供电源和UART串口调试和下载程序.TENTEN 这里整块开发板采用了双路供电.一路采用DC电源接口直接输入5V直流电压:另一路采用USB ...
最新文章
- linux 操作系统chgrp 的命令用法
- 信息系统项目管理师-案例分析
- STM32F4 HAL库开发 -- 工程模板解读
- HDU - 4847 Wow! Such Doge!
- 网易试题——关于箭头函数与this和arguments的关系
- 不想当全栈的设计师不是_但我不想成为产品设计师
- sphinx_Sphinx之谜:如何轻松地编写代码
- matlab 32和64,在32或64位matlab上运行?
- bootstrap的html高度很低,Bootstrap DIV没有填充100%背景颜色的高度
- python2.7个3.7之间传输文件_关于将python2.7转换为python3.7的说明,python27,python37,散记...
- Bailian4017 爬楼梯(POJ NOI0202-3089)【递推】
- 计算机陕西高校保研排名,陕西高校保研率排行,西安交通大学超30%排第一,西北工业第二...
- java 注解开发 解耦_Android java 解耦框架注解Dagger2
- OV2640摄像头模块
- Centos8安装docker及AWVS
- taxi计费器c语言程序,出租车计价器VHDL程序与仿真
- 积分形式的詹森不等式_均值不等式及其积分形式
- 罗技 连点 脚本_走心分享!当评测罗技MASTER 3遇上ANYWHERE 3_鼠标
- 苹果电脑开机慢怎么办 苹果笔记本开机特别慢的处理方法
- 已经提了离职,还有一周就走,公司突然把我移出企业微信,没法考勤打卡, 还要继续上班吗?...