【蓝桥杯单片机05】独立按键的基本操作 广东职业技术学院 欧浩源
按键设计一般分为两种:独立按键和矩阵键盘。按键数量较少的用前者,按键数量较多的用后者。虽然两种设计都是操作按键,但是其键盘扫描方式和程序的设计思路是截然不同的。独立按键简单很多,矩阵键盘虽然复杂,只要掌握了本质思路,也没有什么困难之处。
1、独立按键的处理思路
一般情况下,独立按键有两个引脚,其中一个通过上拉电阻接到单片机的I/O端口,另外一端接地。也就是说,平时按键没有动作的时候,输出的是高电平,如果有按下动作发生,则输出的是低电平。那么,我们在程序设计的时候,只要扫描跟按键引脚相连的I/O端口,如果发现有低电平产生,则判定该按键处于按下状态。有些时候,电路或者外围有电磁干扰,也会使单片机的I/O端口产生低电平,这种干扰信号会让单片机误认为是按键动作。所以,在扫描按键的时候应该做去抖动处理,把干扰信号过滤掉,从而获得准确的按键状态信号。
2、单元实训题目
3、实现源码参考
#include "reg52.h"
sbit HC138_A = P2^5;
sbit HC138_B = P2^6;
sbit HC138_C = P2^7;
sbit S7 = P3^0;
sbit S6 = P3^1;
sbit S5 = P3^2;
sbit S4 = P3^3;
unsigned char code SMG_NoDot[18] =
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
0xbf,0x7f};
void Delay(unsigned char t)
{
while(t--);
}
void Init74HC138(unsigned char n)
{
switch(n)
{
case 4:
HC138_A = 0;
HC138_B = 0;
HC138_C = 1;
break;
case 5:
HC138_A = 1;
HC138_B = 0;
HC138_C = 1;
break;
case 6:
HC138_A = 0;
HC138_B = 1;
HC138_C = 1;
break;
case 7:
HC138_A = 1;
HC138_B = 1;
HC138_C = 1;
break;
case 8:
HC138_A = 0;
HC138_B = 0;
HC138_C = 0;
break;
}
}
void ShowKeyNum(unsigned char value)
{
Init74HC138(6);
P0 = 0x01;
Init74HC138(7);
P0 = value;
}
void ScanKeys()
{
if(S7 == 0)
{
Delay(200);
if(S7 == 0)
{
while(S7 == 0);
ShowKeyNum(SMG_NoDot[1]);
}
}
if(S6 == 0)
{
Delay(200);
if(S6 == 0)
{
while(S6 == 0);
ShowKeyNum(SMG_NoDot[2]);
}
}
if(S5 == 0)
{
Delay(200);
if(S5 == 0)
{
while(S5 == 0);
ShowKeyNum(SMG_NoDot[3]);
}
}
if(S4 == 0)
{
Delay(200);
if(S4 == 0)
{
while(S4 == 0);
ShowKeyNum(SMG_NoDot[4]);
}
}
}
void main()
{
while(1)
{
ScanKeys();
}
}
|
谢谢老师
@2573356463 :你再看看
@刺客伍六七 :这里的功能是松开按键数码管显示的数值才变化,S7==0说明S7按下了,所以一直在这里while循环,当按键松开,while(S7==0)循环条件不满足,所以执行下面的showkey
@2573356463 :我觉得我不能理解while(S7 ==0),应该是while(S7 ==1)
您好,我有一个疑惑,while(S7 == 0);这个语句是什么意思呀?如果我按下S7,按键扫描函数执行到判断S7被按下,然后进入while(S7 == 0);循环里,不断的执行空语句呀?,但是却会继续执行ShowKeyNum(SMG_NoDot[1]);语句。这是为什么呀?
@季冬 :我知道了是跳帽没有换到23
为什么我用这个程序下载到板子上没有反应呢