历史上的今天
今天是:2024年08月25日(星期日)
2020年08月25日 | 单片机按键的三种方法
2020-08-25 来源:51hei
分享单片机按键的三种方法
方法一:
#include 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 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)
史海拾趣
|
看到许多论坛上好多人拆充电器,晚上回家也迫不及待地拆开了一个,呵呵。这个是淘宝上买的,价格忘记了,不到15元吧。我用它给一节锂电池充电,效果还可以。韩国产的,下面让大家看看内部结构 … 查看全部问答> |
|
WINCE中编写了一个基于SIP的输入法该如何调整软键盘界面的大小 WINCE中编写了一个基于SIP的输入法,SIP默认的输入法面板太小,该如何调整软键盘界面的大小?谢谢啊,第一次写书法呵呵。… 查看全部问答> |
|
请问,mobile6.0操作系统的智能手机与电脑连接时,刚开始时候,下面有个网络连接显示,后来才有个activesyn连接显示成功。 当mobile6.0与windows连接开始时,好像有个虚拟网络连接,有没有这方面的详细资料。 小弟不胜感激!!! … 查看全部问答> |
|
【MARKED】C语言中定义全局变量时,如何在定义变量时就指定好变量的地址 本帖最后由 辛昕 于 2018-9-6 22:07 编辑 各位大侠: 小弟新手,请多多帮忙! 小弟现在写一个单片机的程序,由于项目比较紧,就分给两个人做,小弟不懂汇编,要 ...… 查看全部问答> |
|
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显示这个程序或者程序的结果,我的PDA的操作系统是 Microsoft Windows Mobile 2003 第二版, 大侠们有什么好的办法吗?老师崔的很急,帮帮忙阿?我不知道还有多少分。要不全给你都行… 查看全部问答> |




