教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 范文大全 > 行业范文 >

《KEY(按键)应用》大全

来源:网络收集 时间:2026-09-01
导读: 非常实用的按键应用程序 设计中你是否遇到过这样的问题:你的产品上要求有几十个按键,处理器IO口很少,PCB的面积又有严格限制,或者你要严格控制成本,无法使用象7219那样的扩展芯片,怎么解决这个问题? 下面有个方法,大家都见过遥控器吧,上面不但有几十

非常实用的按键应用程序

设计中你是否遇到过这样的问题:你的产品上要求有几十个按键,处理器IO口很少,PCB的面积又有严格限制,或者你要严格控制成本,无法使用象7219那样的扩展芯片,怎么解决这个问题?

下面有个方法,大家都见过遥控器吧,上面不但有几十个按键,而且功能还挺多什么去抖动,同时按键处理都有了,最最重要的是控制芯片体积小,价格便宜(也就1,2块钱),外围器件少。。不过具体实现起来有点小麻烦,这类芯片的信号一般是PPM输出的,通常为了有更远的遥控距离,按键编码调制在一个38k左右的载波上。所以我们不得不再为这个方案多花上1块钱,加一个有烂运放做的低通滤波器,将载波滤除后在接到单片机的IO脚上,由于两个频率相差较多,这个滤波器并不难做。我使用LM324做的。其中有两级低通,一个比较器。

当你的示波器上出现一串可爱的几百赫兹的方波时,你的硬件就成功啦。既然只用一条IO就扩展了几十个按键,软件上自然会多费些事,此类芯片发码都是有引导头,同步部分,用户码,键码等部分组成,有三十多个位,具体可参照sc6121资料。下面时一个完整的接收程序,针对的芯片是sc6121,处理器89c51 ///////////////////////////////////////////////////////////////////////////////

/*定时器1中断服务程序*/

/*

每100us中断一次,定时检测HangSignal线上的电平状态,根据6121的砝码格式译出用户码键码.\\ ib_KeyCode[0] 用户码低位

,ib_KeyCode[1]用户码高位

,ib_KeyCode[2]键码

,ib_KeyCode[3]键码的反码

*/

/////////////////////////////////////////////////////////////////////////////////////

void HandIn() interrupt 3 using 3 {

unsigned char tempbit=0;

bit Hbit;

Hbit=HandSignal; /*采样信号线*/

if (NewKey==FALSE){ /*如果上一次按键事件已经北处理*/ switch (ib_HandState){ /*根据接收状态散转*/

case LEAD: /*引导头接收情况*/ if (Hbit){ /*如果信号线是高电平*/

if ((ib_LowTime>MIN_LeadTime)&&(ib_LowTime<MAX_LeadTime)) /*判断低电平时间是否合乎要求*/

ib_HandState=START; /*正确进入同步头接收状态*/

else ib_HandState=RESTART; /*否则复位接收程序*/

ib_LowTime=0; /*清除低电平时间计数*/

}

else{ /*如果信号是低电平*/

ib_LowTime++; /*增加低电平时间计数器*/

if (ib_LowTime>MAX_LeadTime) /*判断低电平时间是否超时*/

ib_HandState=RESTART; /*是的话复位接收程序*/

}

break;

case START: /*同步头接收情况*/

if(Hbit){ /*如果信号线是高电平*/

非常实用的按键应用程序

ib_HighTime++; /*高电平时间计数器加一*/

if (ib_HighTime>MAX_SynTime) /*如果高电平时间超长,复位接收程序*/ ib_HandState=RESTART;

}

else{ /*如果信号线是低电平*/

if ((ib_HighTime>MIN_SynTime)&&(ib_HighTime<MAX_SynTime)) /*如果高电平时间合乎要求,将状态设定为数据为高电平检测*/

ib_HandState=WAIT_HIGH;

else ib_HandState=RESTART; /*否则复位接收程序*/

ib_HighTime=0;

}

break;

case WAIT_HIGH: /*等待数据位的上升沿的情况*/

if (Hbit){ /*如果检测到一个上升沿*/ if ((ib_LowTime>MIN_L_Time)&&(ib_LowTime<MAX_L_Time)) { /*如果低电平时间合乎要求,将状态设定为等待数据下降沿*/

ib_HandState=WAIT_LOW;

}

else ib_HandState=RESTART; /*否则复位接收程序*/

ib_LowTime=0;

}

else{ /*如果仍为低电平*/

ib_LowTime++; /*低电平时间计数器加一*/

if (ib_LowTime>MAX_L_Time) /*如果低电平时间超长,则复位寄售程序*/

ib_HandState=RESTART;

}

break;

case WAIT_LOW: /*等待数据下降沿的情况*/

if (Hbit){ /*如果仍是高电平*/

ib_HighTime++; /*高电平数据计数器加一*/

if (ib_HighTime>MAX_H_Time) /*如果高电平实际超长,则复位接收程序*/

ib_HandState=RESTART;

}

else{ /*如果收到一个下降沿*/

ib_KeyCode[ib_KeyPoint]>>=1; /*接收数据字节右移一位*/

if ((ib_HighTime>MIN_B1TIME)&&(ib_HighTime<MAX_B1TIME)) { /*如果高电平宽度符合逻辑1标准,接收字节高位置一*/

ib_KeyCode[ib_KeyPoint]+=0x80;

}

ib_BitCount++; /*接收数据位计数器加一*/

if (ib_BitCount>7) { /*如果接收满一个字节*/

ib_BitCount=0; /*清空位计数器*/

非常实用的按键应用程序

ib_KeyPoint++; /*指向下一个字节*/

if (ib_KeyPoint>3) /*如果接收完整个数据*/

{

//unsigned char i;

NewKey=TRUE; /*置有新键按下标志*/

//for (i=0;i<4;i++){

//TI=0;

//SBUF=ib_KeyCode;

//while(!TI);

//TI=0;

//}

//ib_HandState=RESTART;

}

}

ib_HighTime=0; /*将高电平时间计数器清零*/ ib_HandState=WAIT_HIGH; /*设定系统为等待上升沿状态*/

}

break;

default:break;

}

…… 此处隐藏:11995字,全部文档内容请下载后查看。喜欢就下载吧 ……
《KEY(按键)应用》大全.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/fanwen/986195.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)