单片机交流
直播中

我有一车切糕

11年用户 580经验值
私信 关注
[问答]

单片机I/O口如何检测按键输入电平?

单片机I/O口如何检测按键输入电平?

回帖(1)

张佳婧

2021-10-26 14:50:33
一、 实验目的:

  (一) 熟悉单片机 I/O 口的输入控制;
(二) 熟悉开发板上单片机 I/O 口与数码管、 独立按键的威廉希尔官方网站 连接;
(三) 掌握 keil C 软件的使用;
(四) 掌握独立按键的应用;
(五) 掌握按键的消抖原理。
  二、 主要仪器设备及耗材:

  (一) 电脑一台;
(二) 单片机开发板一套。
  三、 实验原理

  (一) 键盘的分类
键盘分编码键盘和非编码键盘。 键盘上闭合键的识别由专用的硬件编
码器实现, 并产生键编码号或键值的称为编码键盘, 如计算机键盘; 而靠
软件编程来识别的称为非编码键盘。 在单片机组成的各种系统中, 用的最
多的是非编码键盘。 也有用到编码键盘的。
非编码键盘有分为: 独立键盘和行列式(又称为矩阵式) 键盘。
(二) 独立按键
独立按键, 按键一端接地, 另一端与 I/O 引脚相连, 按键按下为低电平,
未按下为高电平, 其威廉希尔官方网站 连接方式如图 3.1 所示。第 11 页 共 58
  

  

  (三) 按键消抖

  按下按键或松手的时候, 单片机 I/O 得到的理想波形与实际波形如图

  

  

因此, 按键在闭合和断开时, 触点会存在抖动现象。
1.为什么要消抖?
如图 3.2 所示, 在按键被按下的短暂瞬间, 由于硬件上的抖动, 往往会
产几毫秒的抖动, 在这时候若采集信号, 势必导致误操作, 甚至系统崩溃;
同样, 在释放按键的那一刻, 硬件上会相应的产生抖动, 会产生同样的后
果。 因此, 在模拟或者数字威廉希尔官方网站 中, 我们要避免在最不稳定的时候采集信
号, 进行操作。
2.如何消抖?
一般可以采用延时、 N 次低电平计数、 低通滤波等方式进行消抖。 在单
片机应用中, 一般采用延时进行消抖, 其消抖顺序如下:
(1) 检测到信号, 如: if(k0)
(2) 延时 5ms, 消抖动, 如: delay(5);
(3) 继续检测信号, 确认是否被按下, 如: if(k0)
①是, 则开始等待释放, 如: while(!k);
②否, 则继续检测信号。
  四、 实验内容及步骤

  (一) 实验内容
利用所学的单片机知识及威廉希尔官方网站 知识编程实现单片机 I/O 口检测按键输
入电平。
1.选中 8 位数码管的其中 1 位数码管, 当独立按键 1 每按下一次, 数码
管加一(按下期间加 1) , 范围为 0—F;
2.选中 8 位数码管的另 1 位数码管, 当独立按键 2 每按下一次, 数码管
减一(松手之后减 1) , 范围为 F—0;
3.按下独立按键 3 期间, 流水灯以 600ms 的速度流动;
4.按下独立按键 4, 松手之后, 8 个 LED 灯作一次花样循环。
注意: 以上 4 个功能需要在同一个程序中完成。
(二) 实验步骤
1.根据威廉希尔官方网站 原理图编写 C 程序, 调试并烧写入单片机;

#include
/*
1.选中 8 位数码管的其中 1 位数码管, 当独立按键 1 每按下一次, 数码管加一(按下期间加 1) , 范围为 0—F;


2.选中 8 位数码管的另 1 位数码管, 当独立按键 2 每按下一次, 数码管减一(松手之后减 1) , 范围为 F—0;
3.按下独立按键 3 期间, 流水灯以 600ms 的速度流动;
4.按下独立按键 4, 松手之后, 8 个 LED 灯作一次花样循环。
*/


#define uint unsigned int


***it a=P2^2;
***it b=P2^3;
***it c=P2^4;


#define smg1 c=1;b=1;a=1//选中第一个数码管
#define smg2 c=1;b=1;a=0//选中第二个数码管


char code LED[] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f};//LED流水灯


char code number[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f,0x77, 0x7c, 0x39, 0x7e, 0x79, 0x71};//用于数码管显示0-F


code char led[] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xef, 0xdf, 0xbf, 0x7f, //LED花式流水灯
                                   0x7e, 0xbd, 0xdb, 0xe7,
                                   0xdb, 0xdb, 0xe7, 0x7e,
                                   0x00};


char k1_i=0;//用于加法
char k2_i=15;//用于减法


***it k1 = P3^1;
***it k2 = P3^0;
***it k3 = P3^2;
***it k4 = P3^3;
//        延迟函数,单位毫秒
void delay(uint ms)
{
        char i;
        while(ms--)
        {
                 for(i=0; i<110; i++);


        }
}


void method_1(); //方式一
void method_2(); //方式二
void method_3(); //方式三
void method_4(); //方式四


void main()
{
        while(1)
        {
                 if(k1==0)
                 {
                           method_1();
               
                 }
                 else if(k2==0)
                 {
                          method_2();
                 }
                 else if(k3==0)
                 {
                          method_3();
                 }
                 else if(k4==0)
                 {
                          method_4();
                 }
        }


}


void method_1()//选中 8 位数码管的其中 1 位数码管, 当独立按键 1 每按下一次, 数码管加一(按下期间加 1) , 范围为 0—F;
{
        smg1;
        delay(5);
        if(k1==0)
        {
                 P0 = number[k1_i];
                while(!k1);
                  k1_i++;
                if(k1_i == 16) k1_i = 0;
        }               
}


void method_2()//选中 8 位数码管的另 1 位数码管, 当独立按键 2 每按下一次, 数码管减一(松手之后减 1) , 范围为 F—0;
{
        smg2;
        delay(5);
        if(k2==0)
        {
                 P0 = number[k2_i];
                while(!k2);
                k2_i--;
                if(k2_i == -1) k2_i = 15;
        }               
               
}


void method_3()//按下独立按键 3 期间, 流水灯以 600ms 的速度流动;
{
        char i;
        delay(5);
        if(k3==0)
        {       
                for(i=0; i<8; i++)
                {
                         while(k3);                        
                        P2 = LED;
                        delay(600);
                }               
        }               
}


void method_4()//按下独立按键 4, 松手之后, 8 个 LED 灯作一次花样循环。
{
        char i;
        delay(5);
        if(k4==0)
        {
                while(!k4);
                for(i=0; i<18; i++)
                {
                         P2 = led;
                        delay(200);
                }               
        }                       
}
2.观察实验结果, 验证程序是否正确。
五、 思考题: 画图说明矩阵键盘的结构是怎样的?
举报

更多回帖

×
20
完善资料,
赚取积分