历史上的今天
返回首页

历史上的今天

今天是:2024年08月25日(星期日)

正在发生

2020年08月25日 | 单片机按键的三种方法

2020-08-25 来源:51hei

分享单片机按键的三种方法


方法一:

#include typedef unsigned int uInt16;sbit LED1 = P2^0;

sbit KEY1 = P3^4;

sbit KEY2 = P3^5;void DelayMS(uInt16 ValMS)

{

        uInt16 uiVal,ujVal;

        for(uiVal = 0; uiVal < ValMS; uiVal++)

                for(ujVal = 0; ujVal < 113; ujVal++);

}// 函数功能:毫秒延时// 函数功能:扫描按键并做出相应LED灯亮灭动作void main(void)

{

        while(1)

        {

                if(0 == KEY1)                                   // 检测按键是否按下

                {

                        DelayMS(5);                                 // 延时去抖

                        if(0 == KEY1)                          // 再次检测

                        {

                                LED1 = 0;                   // 点亮LED灯

                                while(!KEY1);                // 等待按键弹起

                        }

                }

                if(!KEY2)

                {

                        DelayMS(5);

                        if(!KEY2)

                        {

                                LED1 = 1;

                                while(!KEY2);

                        }

                }        }

}





方法二:行列扫描法

#include #define uInt16 unsigned int

#define uChar8 unsigned char


#define DATA P0                                          //数据口

#define KEYPORT         P3                                  //键盘接入端口sbit SEG_SELECT = P1^7;                          //段选控制端

sbit BIT_SELECT = P1^6;                          //位选控制端uChar8 code SEG_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};//段选显示表格uChar8 g_ucKeyNum = 16;                        //键值// 函数功能:毫秒延时void DelayMS(uInt16 ValMS)

{

        uInt16 uiVal,ujVal;

        for(uiVal = 0; uiVal < ValMS; uiVal++)

                for(ujVal = 0; ujVal < 121; ujVal++);

}// 函数功能:矩阵按键扫描void ScanKey(void)

{

        uChar8 ucTemp;


        KEYPORT = 0xfe;                                          //检测第一行

        ucTemp = KEYPORT;                                  //读取键盘端口数值

        if(ucTemp != 0xfe)                                 //若是不等于0xF0表示有按键按下

        {

                DelayMS(5);                 //去抖

                ucTemp = KEYPORT;                        //读端口值

                if(ucTemp != 0xfe)                        //再次判断

                {

                        ucTemp = KEYPORT;                //取键值

                        switch(ucTemp)                        //判断键值对应键码

                        {

                                case 0xee:g_ucKeyNum = 0;break;

                                case 0xde:g_ucKeyNum = 1;break;

                                case 0xbe:g_ucKeyNum = 2;break;

                                case 0x7e:g_ucKeyNum = 3;break;        

                        }

                        while(KEYPORT != 0xfe);        //按键释放检测

                }

        }        

        KEYPORT = 0xfd;

        ucTemp = KEYPORT;

        if(ucTemp != 0xfd)

        {

                DelayMS(5);

                ucTemp = KEYPORT;

                if(ucTemp != 0xfd)

                {

                        ucTemp = KEYPORT;

                        switch(ucTemp)

                        {

                                case 0xed:g_ucKeyNum = 4;break;

                                case 0xdd:g_ucKeyNum = 5;break;

                                case 0xbd:g_ucKeyNum = 6;break;

                                case 0x7d:g_ucKeyNum = 7;break;        

                        }

                        while(KEYPORT != 0xfd);

                }

        }        

        KEYPORT = 0xfb;

        ucTemp = KEYPORT;

        if(ucTemp != 0xfb)

        {

                DelayMS(5);

                ucTemp = KEYPORT;

                if(ucTemp != 0xfb)

                {

                        ucTemp = KEYPORT;

                        switch(ucTemp)

                        {

                                case 0xeb:g_ucKeyNum = 8;break;

                                case 0xdb:g_ucKeyNum = 9;break;

                                case 0xbb:g_ucKeyNum = 10;break;

                                case 0x7b:g_ucKeyNum = 11;break;        

                        }

                        while(KEYPORT != 0xfb);

                }

        }        

        KEYPORT = 0xf7;

        ucTemp = KEYPORT;

        if(ucTemp != 0xf7)

        {

                DelayMS(5);                  

                ucTemp = KEYPORT;

                if(ucTemp != 0xf7)

推荐阅读

史海拾趣

Arco Electronics公司的发展小趣事

近年来,电子行业面临着技术更新换代快、市场竞争激烈等挑战。Arco Electronics公司敏锐地捕捉到了这些变化,及时调整了公司的战略方向。公司加大了对新兴技术的研发投入,如物联网、人工智能等领域,以保持技术上的领先地位。同时,公司还通过优化生产流程、提高产品质量等方式来降低成本,增强市场竞争力。

Harris公司的发展小趣事

Hammond公司的故事始于1916年,当时它仅仅是一个位于加拿大安大略省圭尔夫的后院车间。1917年,OS Hammond and Son正式成立,并在接下来的几年里开始制造电子管收音机、电池充电器等电子产品。这一时期,Hammond逐步积累了技术和市场经验,为后续的快速发展奠定了基础。随着广播和通讯行业的兴起,Hammond敏锐地捕捉到了市场机遇,开始专注于为这些行业提供关键组件。

AVX公司的发展小趣事

AVX一直致力于绿色技术的研发与应用。在数十年的深入研发支持下,AVX的产品为各种绿色技术提供了关键的支持,如风能、太阳能和水力发电等领域。这些技术的应用旨在节省现有能源并创建可靠、价格合理的电子系统,为可持续发展做出了积极贡献。AVX在这一领域的持续投入和创新,使其在绿色技术领域取得了显著成果。

Free2Move公司的发展小趣事

近年来,AVX在汽车领域的应用也取得了显著进展。随着汽车行业的快速发展,对电子元件的需求也日益增长。AVX凭借其卓越的技术和品质,成功为汽车安全性、发动机控制、信息娱乐和底盘控制技术的开发提供了关键支持。AVX的产品广泛应用于各类汽车中,为提升汽车性能和安全性做出了积极贡献。

以上五个故事展示了AVX公司在电子行业中的发展历程和取得的成就。从创立初期到如今的全球化布局,AVX始终坚持以技术创新和市场拓展为核心,不断推动公司的发展。同时,AVX也积极关注可持续发展和绿色技术,为行业的进步做出了积极贡献。

Curtis Industries公司的发展小趣事

Curtis Industries公司在发展的同时,也积极承担社会责任。公司关注环保问题,采用环保材料和节能技术生产产品,减少对环境的影响。此外,公司还积极参与公益活动,支持教育事业和社会福利事业的发展。这些举措不仅提升了公司的社会形象,也为公司的可持续发展注入了新的动力。

DSP Group Inc公司的发展小趣事

随着技术的不断进步和市场需求的增长,DSP Group开始将业务扩展到半导体领域。公司推出了一系列高性能、低功耗的DSP芯片,广泛应用于移动通信、智能家居、汽车电子等领域。这一举措不仅进一步巩固了DSP Group在DSP领域的领先地位,还为公司带来了可观的收益和市场份额。

问答坊 | AI 解惑

电位计式扭矩传感器

电位计式扭矩传感器 电位计式扭矩传感器主要可以分为旋臂式、双级行星齿轮式、扭杆式。其中扭杆式测量结构简单、可靠性能相对比较高,在早期应用比较多。 EPS中扭杆式扭矩传感器的结构、原理 扭杆式扭矩传感器主要由扭杆弹簧、转角-位移变换器、 ...…

查看全部问答>

现在流行拆充电器,我也秀一个看看

看到许多论坛上好多人拆充电器,晚上回家也迫不及待地拆开了一个,呵呵。这个是淘宝上买的,价格忘记了,不到15元吧。我用它给一节锂电池充电,效果还可以。韩国产的,下面让大家看看内部结构 …

查看全部问答>

步进电机

求步进电机资料?用于仪表方面,希望高手指点下!…

查看全部问答>

gcc和armcc有什么区别?

如题??? 一般什么场合会用到ARMCC或GCC呢 …

查看全部问答>

WINCE中编写了一个基于SIP的输入法该如何调整软键盘界面的大小

WINCE中编写了一个基于SIP的输入法,SIP默认的输入法面板太小,该如何调整软键盘界面的大小?谢谢啊,第一次写书法呵呵。…

查看全部问答>

mobile与电脑通信问题

请问,mobile6.0操作系统的智能手机与电脑连接时,刚开始时候,下面有个网络连接显示,后来才有个activesyn连接显示成功。 当mobile6.0与windows连接开始时,好像有个虚拟网络连接,有没有这方面的详细资料。 小弟不胜感激!!! …

查看全部问答>

【MARKED】C语言中定义全局变量时,如何在定义变量时就指定好变量的地址

本帖最后由 辛昕 于 2018-9-6 22:07 编辑 各位大侠:         小弟新手,请多多帮忙!         小弟现在写一个单片机的程序,由于项目比较紧,就分给两个人做,小弟不懂汇编,要 ...…

查看全部问答>

WINCE映像载入及运行时的问题

Dear all, 目前在开发wince时出现在载入nk.bin及载入后进入ce后运行较慢的问题,问题如下: 硬件:INTEL 852+512MB RAM+ 256MB CF 软件:WINCE 5.0(PB为微软120天的免费版),相关852芯片组的BSP均为INTEL官方正式版 1 使用loadcepc在载入nk. ...…

查看全部问答>

如何把Delphi7开发好的程序弄到PDA上?

有一个用delphi7开发好的程序,现在想用PDA显示这个程序或者程序的结果,我的PDA的操作系统是 Microsoft Windows Mobile 2003 第二版, 大侠们有什么好的办法吗?老师崔的很急,帮帮忙阿?我不知道还有多少分。要不全给你都行…

查看全部问答>