历史上的今天
返回首页

历史上的今天

今天是:2025年07月26日(星期六)

正在发生

2021年07月26日 | 51单片机学习笔记【二】——按键实验

2021-07-26 来源:eefocus

一.独立按键实验

1.电路原理图

独立按键

2.说明:使用排线连接JP10的和JP12,JP8连接JP5。本实验通过八个独立按键控制八个LED小灯。按键时会抖动,所以要消抖。


3.消抖检测

先给按键对应的I/O口置1;

判断I/O口是否为1;

若是1,则说明按键按下,若是0,则按键没有按下;


4.源代码如下:

/***********************************************

   > File Name: 独立按键实验

   > Author: pengshp

   > Mail: pengshp3@outlook.com

   > Date: 2015年 7 月 16 日

*************************************************/

#include      //此文件中定义了51的一些特殊功能寄存器

#include

//--定义要使用的IO口--//

#define  GPIO_KEY P1           //独立键盘用P1口

#define  GPIO_LED P0           //led使用P0口


void Delay10ms(unsigned int c); //延时10ms

unsigned char Key_Scan();

void main()

{

    unsigned char ledValue, keyNum;

    ledValue = 0x01;

    while (1)

    {   

        keyNum = Key_Scan();  //扫描键盘

        switch (keyNum)

        {

            case(0xFE) :      //返回按键K1的数据

                ledValue = 0x01;

                break;

            case(0xFD) :      //返回按键K2的数据

                ledValue = 0x02;

                break;

            case(0xFB) :      //返回按键K3的数据

                ledValue = 0x04;

                break;

            case(0xF7) :      //返回按键K4的数据

                ledValue = 0x08;

                break;

            case(0xEF) :      //返回按键K5的数据

                ledValue = 0x10;

                break;

            case(0xDF) :      //返回按键K6的数据

                ledValue = 0x20;

                break;

            case(0xBF) :      //返回按键K7的数据

                ledValue = 0x40;

                break;

            case(0x7F) :      //返回按键K8的数据

                ledValue = 0x80;

                break;

            default:

                break;

        }

        GPIO_LED = ledValue;  //点亮LED灯

    }               

}


unsigned char Key_Scan()   //扫描键盘

{

    unsigned char keyValue = 0 , i; //保存键值

    //--检测按键1--//

    if (GPIO_KEY != 0xFF)       //检测按键K1是否按下

    {

        Delay10ms(1);           //消除抖动

        if (GPIO_KEY != 0xFF)   //再次检测按键是否按下

        {

            keyValue = GPIO_KEY;

            i = 0;

            while ((i<50) && (GPIO_KEY != 0xFF))     //检测按键是否松开

            {

                Delay10ms(1);

                i++;

            }

        }

    }

    return keyValue;   //将读取到键值的值返回

}

void Delay10ms(unsigned int c)   //误差 0us

{

    unsigned char a, b;

    for (;c>0;c--)

    {

        for (b=38;b>0;b--)

        {

            for (a=130;a>0;a--);

        }     

    }       

}


二.矩阵键盘实验

1.电路原理图

矩阵键盘

2.矩阵键盘原理:矩阵键盘一端接行线,一端接列线,行线控制高四位,列线控制低四位;每个按键位于行线和列线的交叉点。


3.矩阵键盘扫描

(1).逐行扫描

高四位轮流输出低电平,当低四位接受的数据不全为0时,则按键按下,并可判断哪个按键按下。


(2).行列扫描

高四位全部输出低电平,低四位全部输出高电平,当接受的数据低四位不全为高电平时,说明有按键按下;然后反过来,高四位输出高电平,低四位输出低电平,根据接收到的高四位的值来判断哪一行有按键按下。


4.说明:可通过按下按键并在液晶屏上显示相应的键值。但较为复杂,液晶屏后面介绍。接线为JP4接JP8(P1),JP10接JP12,并将JP165断开。


5.程序源代码

/**************************************

  > File Name: 矩阵键盘实验

  > Author: pengshp

  > Mail: pengshp3@outlook.com

  > Date: 2015年 7 月 16 日

***************************************/

#include

#define uchar unsigned char

#define GPIO_DIG P0

#define GPIO_KEY P1


uchar code DIG_CODE[17]={0x3f,0x06,0x5b,0x4f,

                         0x66,0x6d,0x7d,0x07,

                         0x7f,0x6f,0x77,0x7c,

                         0x39,0x5e,0x79,0x71};

uchar KeyValue;

void Delay10ms();    //延时10ms

void KeyDown();      //检测按键函数


void main(void)

{

    while(1)

    {

        KeyDown();

        GPIO_DIG=~DIG_CODE[KeyValue];

    }               

}


void KeyDown()

{

    char a=0;

    GPIO_KEY=0x0f;            //0000 1111 高四位全为0,低四位为1

    if(GPIO_KEY!=0x0f)        //读取按键是否按下

    {

        Delay10ms();          //延时10ms进行消抖

        if(GPIO_KEY!=0x0f)    //再次检测键盘是否按下

        {

            //测试列

            GPIO_KEY=0X0F;

            switch(GPIO_KEY)

            {

                case(0X07): KeyValue=0;break;

                case(0X0b): KeyValue=1;break;

                case(0X0d): KeyValue=2;break;

                case(0X0e): KeyValue=3;break;

            }

            //测试行

            GPIO_KEY=0XF0;

            switch(GPIO_KEY)

            {

                case(0X70): KeyValue=KeyValue;break;

                case(0Xb0): KeyValue=KeyValue+4;break;

                case(0Xd0): KeyValue=KeyValue+8;break;

                case(0Xe0): KeyValue=KeyValue+12;break;

            }

            while((a<50)&&(GPIO_KEY!=0xf0))  //检测按键松手检测

            {

                Delay10ms();                 //延时处理

                a++;

            }

        }

    }

}


void Delay10ms()   //误差 0us

{

    unsigned char a,b,c;

    for(c=1;c>0;c--)

        for(b=38;b>0;b--)

            for(a=130;a>0;a--);

}

推荐阅读

史海拾趣

CDI-DIODE公司的发展小趣事

随着环保意识的日益增强,电子行业也开始向绿色生产转型。CDI-DIODE公司积极响应这一趋势,投入大量资源研发环保型二极管产品,并采用环保材料和生产工艺。这种绿色生产方式不仅降低了公司的生产成本,也符合了社会的可持续发展需求,为公司的未来发展奠定了坚实的基础。

这五个故事虽然是虚构的,但它们反映了电子行业中企业可能面临的一些共同挑战和机遇。无论对于CDI-DIODE公司还是其他企业,这些故事都具有一定的借鉴意义。

Acme Electric Corporation公司的发展小趣事

随着市场需求的不断增长,CDI-DIODE公司意识到单凭自身力量难以满足所有客户的需求。于是,公司积极寻求与其他企业的合作,通过共同研发、生产和销售,实现了业务的快速拓展。这种合作模式不仅提升了公司的产能和效率,也加强了与合作伙伴之间的紧密联系。

Etco Inc公司的发展小趣事

随着市场竞争的加剧和客户需求的不断提高,Etco Inc公司意识到品质管理对于企业发展的重要性。为此,公司投入大量资源加强品质管理体系建设,引进先进的生产设备和检测仪器,确保产品质量的稳定性和可靠性。同时,Etco还加强了员工培训和技能提升,提高了员工的品质意识和操作技能。这些举措使Etco的产品质量得到了显著提升,赢得了客户的广泛赞誉。

Chip Supply Micro Devices公司的发展小趣事

在追求经济效益的同时,Chip Supply Micro Devices也积极践行环保理念。公司注重节能减排和资源循环利用,通过采用环保材料和工艺,降低了生产过程中的环境影响。此外,公司还积极参与社会公益活动,推动电子行业的可持续发展。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实基础。

以上五个故事都是基于电子行业的一般情况和趋势虚构的,旨在展示一家微电子器件供应公司可能经历的发展历程。请注意,这些故事并非基于真实事件或公司。

EDDING公司的发展小趣事

ECLIPSE公司深知,要想在竞争激烈的电子行业中保持领先地位,必须不断创新和满足用户需求。因此,公司投入大量资源用于Eclipse的研发和更新,不断推出新版本和新功能。同时,ECLIPSE公司也非常重视社区建设,通过举办开发者大会、提供在线支持等方式,积极与全球开发者互动和交流。这些努力不仅增强了Eclipse的用户黏性,也为其带来了更多的创新思路和商业机会。

全志(Allwinner)公司的发展小趣事

2010年,平板电脑市场的崛起为全志科技带来了巨大的发展机遇。全志迅速调整产品策略,推出了AP处理器A系列,成功抓住了这一市场风口。其芯片产品在平板电脑领域的应用,不仅提升了公司的市场份额,也为公司的未来发展奠定了坚实的基础。

问答坊 | AI 解惑

初学电子知识

 初学电子知识,请先把“电”当做“水”,“电路”就等于“水路”;接着了解一些常用名词术语,对照实物认识几种常用的电子元件及其功能;最后动手做一些实验。   任何电子产品都是电子元件组成的,学习电子技术就要先学电子元件。   电子元件 ...…

查看全部问答>

智能SFP模块

目前,各种网络中所需要的光收发一体模块种类越来越多,要求也越来越高。为了满足系统不断增长的需求,光模块正不断走向标准化、小型化、智能化发展。智能SFP模块,即采用数字诊断功能的SFP光模块,是各厂商技术升级换代的标志性产品。 利用智能化 ...…

查看全部问答>

24位A/D芯片AD7714的使用心得

正在使用一款24位A/D芯片AD7714,做一个电子称,连接线按厂家PDF说明,基准电压2.5V。现在有个问题是:显示的数据最后一个小数点个位总是会跳动(只要显示到0.1)。硬件软件我能想到的的都试了,有哪个兄弟用过的或比较熟悉的指点下,非常感谢!!…

查看全部问答>

第12/15原创:事无巨细,IIC总线协议与AT24C02

事无巨细,IIC协议与EEPROM 24C02 在前面的一系列文章中,我们从最简单的开发环境开始到上一节的片外DAC的使用为止,算是AVR单片机中比较简单但是绝对是比较全面的内容了。如果你能够独立掌握了前面的这些内容,我们现在可以开始进入CEPARK AVR开 ...…

查看全部问答>

基于S3C2410的Windows CE驱动开发.pdf

基于S3C2410的Windows CE驱动开发.pdf…

查看全部问答>

LED白光荧光粉的配比

最佳答案1. 改变树脂内YAG荧光体浓度之后,LED色区坐标的结果,由图可知只要色坐标是在LED与YAG荧光体两色坐标形成的直线范围内,就可任意调整色调,依此可知YAG荧光体浓度较低时,蓝色穿透光的比率较多,整体就会呈蓝色基调白光;相对的如果YAG荧 ...…

查看全部问答>

我想学习嵌入式系统

熟练C、汇编 会java, 会单片机,略懂Dsp, 我应该在什么地方努力呢?…

查看全部问答>

有人改过beta player的界面吗?有个项目找人做

能在wince上播放WMV,MP4,AVI的媒体播放器,能够提供源码,能够按我们的 要求去改界面. 联系:snfmtc@163.com…

查看全部问答>

一点心得。

最近一直在研究uclinux移植的东西,包括内核移植,驱动加载,还有一些软件应用的移植,其中当然遇到了很多问题,有许多也都通过在网上搜索资料给解决了,但是每次出一个错都似乎得从别人那得到点帮助才能解决,除非是一些显而易见的错误自己能搞定 ...…

查看全部问答>

STM32专用复位电路问题?

                                 现在复位电路只是阻容电路(电阻10看,钽电容1UF),发现有个别的复位有时不容易成功(经查可能是上电电源启动慢), ...…

查看全部问答>