利用单片机IO实现多键输入的技巧 (利用单片机I

O口的触摸开关

概述

在单片机软硬件应用电路中,为了实现独立的按键输入,通常需要为每个按键分配一个单独的IO引脚。如果需要实现多个独立按键输入,则需要多个独立的IO引脚。在实际应用中,单片机的IO引脚可能不足,或者出于成本考虑,难以更换拥有更多IO引脚的单片机。因此,需要一种方法来使用一个IO实现多个独立按键输入。

ADCIO方法

本方法利用单片机上带ADC转换的IO引脚实现多个按键输入检测。原理如下:通过设置电阻R1、R2、R3、R4、R5之间的阻值,当不同的按键按下时,ADC_IO引脚上的电压就会产生变化。单片机程序根据ADC_IO引脚上不同的ADC采样结果,可以反过来判断出哪个按键被按下。

电路设计

电路原理图如下所示:[电路原理图插入处]其中,R1、R2、R3、R4、R5之间的电阻阻值需要根据实际应用进行配置。

程序实现

程序实现需要以下步骤:配置ADC转换模块。定期读取ADC_IO引脚上的ADC采样值。根据ADC采样值判断哪个按键被按下。

优点

这种方法的优点在于:可以使用一个IO实现多个独立按键输入,节省IO资源。硬件设计简单,成本较低。 如何用一个单片机IO实现多个按键输入

缺点

这种方法的缺点在于:ADC转换过程会影响按键检测的响应时间。电阻阻值需要精确配置,否则可能会影响按键检测的准确性。

应用

这种方法可以应用于各种需要使用多个独立按键输入的场合,例如:遥控器游戏机工业控制系统

结论

通过使用ADCIO方法,可以实现单片机一个IO实现多个独立按键输入。这种方法具有节省IO资源、硬件设计简单、成本较低的优点,但在响应时间和准确性方面存在一定的限制。在实际应用中需要根据具体需求进行权衡选择。

C51单片机用IO口做为几个按键的控制,现在想用4X4键盘控制,请问下面显示程序应该怎么改啊?折磨死了

// 4*4矩阵键盘/********************************************************连接: ------------------------------------P1.0 P1.1 P1.2 P1.3 p1.4 S1 S5 S9 S13 P1.5 S2 S6 S10 S14 P1.6 S3 S7 S11 S15 P1.7 S4 S8 S12 S16 ------------------------------------实现原理:当高电平端口与低电平端口短接时,高电平端口会被拉成低电平------------------------算法分析:1,检查是否有键按下: P1=f0h (即0-3置1,4-7置0) 检查P1口是否是0F0H 是,则无键按下 否,则有键按下2,扫描按下的键值: 循环(依次将4至7口单独置0) 检查0-3口是否有低电平端 确定被按下的键 返回键值3,键盘防抖:抖动原因:键按下时,会产生电压的波动,持续约10MS去抖方法:10MS扫描一次,使前后两次均有键按下********************************************************/#includeuchar jps,ks; //键盘缓存/*键盘扫描程序1,检查是否有按键*/uchar keyfun(){ uchar key_c; P2 = P2 & 0x03; P2 = P2 | 0x3c; key_c = P2; if((key_c & 0xfc) == 0x3c) return (0); else return(1);}/*键盘扫描程序2,确定按键数值*/uchar keyscan(){ uchar i,k; P2 = P2 & 0x03; P2 = P2 | 0xbc; if((P2 & 0x3c) != 0x3c) {i = 0;k = (~P2) & 0x3c; } else {P2 = P2 & 0x03;P2 = P2 | 0x7c;if((P2 & 0x3c) != 0x3c){ i = 1; k = (~P2) & 0x3c;} } k = k>>3; if( k==4 ) k=3; k=i*4+k+1; return(k);}/**********************************************************************函数功能: 定时器中断函数(扫描键盘)(10ms 16位定时)入口参数: 无出口参数: 无***********************************************************************/void Time0_Func() interrupt 3/*当定时器中断时执行此函数*/{ TH1=(0xffff-9259)/256;/*T0初始化*/ TL1=(0xffff-9259)%256; WR = 1; if((ks == 0) && ( keyfun() )) {jps = keyscan(); } ks = keyfun();}/**********************************************************************函数功能: 上电初始化函数入口参数: 无出口参数: 无***********************************************************************/void Power_Up(void){ TMOD = 0x10;/*Time0/1为16计数器*/ TH1=(0xffff-9216)/256;/*10ms*/ TL1=(0xffff-9216)%256;/*10ms*/ TR1=1; SCON = 0x00;//串口工作模式设置 IE=0x88; /*EA=1 ET1=1*/ P0=0xff; P2=0xff;}

本文原创来源:电气TV网,欢迎收藏本网址,收藏不迷路哦!

相关阅读

添加新评论