3个IO口扫描16个按键
来源:互联网 发布:1688淘宝货源一件代发 编辑:程序博客网 时间:2024/06/05 22:43
该电路在程序处理时,由处理器首先向I/O1~I/O3写高电平,然后读入。如果非全“1”,说明,K0~K6中有键按下,此时可根据读入的端口状态判断键的状态,如果读入的结果为全“1”,则I/O1~I/O3轮流输出低电平,再读入,这样就可根据另外两根I/O线的状态来判别是K7~K15中的哪一个键被按下。重复调用键盘处理子程序可将读取的键值与上次的值进行比较,甚至两次读数相同为止,这样即可消除按键抖动所造成的误读。该电路选用的单片机为AT89C2051
#include<reg51.h>#define uchar unsigned charuchar getkey(void);uchar keyvol;void main(void){ keyvol=getkey(); /*调用键处理函数,返回的数据等于16表示同有键按下,0至15对应k0至K15*/}//以下为键盘处理子程序:uchar getkey(void){ uchar x P1=P1|0x07; /*I/O1至I/O3写“1”*/ x=P1&0x07; /*读入I/O1至I/O3并屏蔽其它位*/ if(x==0x07) /*判断K0至K6是否按下并转换键值*/ { P1=P1&0xfe; /*I/O1写“0”*/ x=P1&0x07; x=x/2+7; if(x= =10) { P1=P1|0x07; P1=P1&0xfd; /*I/O2写“0”*/ x=P1&0x07; x=(x+1)/2+10; /*屏蔽I/O2并转换K10至K12的键值*/ if(x = =13) { P1=P1|0x07; P1=P1&0xfb; /*I/O3写“0”*/ x=P1&0x07; x=x+13; /*屏蔽I/O3并转换K13至K15的键值*/ } } } return x;}利用该键盘电路并根据逻辑组合原理可推断开n条I/O线可组合的按键数N为:
N=(2n-1)+(2 n-1 -1)n
个人觉得自己写程序的时候有个地方需要注意:
当IO口赋值011,按k0之后IO读数为000,按k13读数也为000,
所以如果检测到到k0到k6,这几个都没按才可以继续检测k7到k15.
本文参考:廖向峰.节约单片机端口资源的键盘电路.《国外电子元器件》2001年第12期2001年12月
- 3个IO口扫描16个按键
- 3个IO口扫描16个按键
- 3个IO口扫描16个按键
- 5个IO口扫描25个按键的解决方法
- 5个IO口扫描25个按键的解决方法
- 5个IO口扫描25个按键的解决方法
- 5个IO口最多能扫描多少个按键?
- 5个IO口扫描25个按键的解决方法
- 5个IO口扫描25个按键的解决方法
- 多功能检测按键-3 按键扫描 单按 长按 多个按键 响应方式
- 单片机5个IO 检测25个按键 转自匠人
- android添加3个虚拟按键音
- 基于proteus的51单片机仿真实例五十三、4个按键的组成的按键扫描实例
- 利用二极管的单向导通性设计多按键扫描,但是占用极少IO口
- 侦听多个按键,造成按键冲突
- ADC检测多个按键
- 按键扫描
- 按键扫描
- JAVA 泛型的使用
- Cocos2d-x坐标系
- 程序员——伤不起的三十岁
- cxImage处理tif图片时需要注意的地方
- VC++调用OpenGL实现3维图形的旋转,平移和缩放
- 3个IO口扫描16个按键
- 哈尔小波变换的原理及其实现(Haar)
- AsyncTask的用法
- PrintWindow函数、CxImage、GSOAP实现隐藏窗口抓图到JPEG并通过webservice传至服务器
- 非常实用的开源的JavaScript库,你可以将一些数据分析处理、可视化的工作交给它们
- 在Visual Studio 6.0集成环境中开发设备驱动程序的方法
- iOS开发:开发者账号申请后真机调试详细步骤
- CxImage
- 技术需要搜索