欢迎来到天天文库
浏览记录
ID:37714973
大小:30.89 KB
页数:20页
时间:2019-05-29
《《KEY(按键)应用》大全》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、《KEY(按键)应用》大全技术类别:单片机需要确认注册邮箱后才能下载,立即确认我的邮箱 设计中你是否遇到过这样的问题:你的产品上要求有几十个按键,处理器IO口很少,PCB的面积又有严格限制,或者你要严格控制成本,无法使用象7219那样的扩展芯片,怎么解决这个问题?下面有个方法,大家都见过遥控器吧,上面不但有几十个按键,而且功能还挺多什么去抖动,同时按键处理都有了,最最重要的是控制芯片体积小,价格便宜(也就1,2块钱),外围器件少。。不过具体实现起来有点小麻烦,这类芯片的信号一般是PPM输出的,通常为了有更远的遥控距离,按键编码调制在一个38k左右的载波上。所以我们不
2、得不再为这个方案多花上1块钱,加一个有烂运放做的低通滤波器,将载波滤除后在接到单片机的IO脚上,由于两个频率相差较多,这个滤波器并不难做。我使用LM324做的。其中有两级低通,一个比较器。当你的示波器上出现一串可爱的几百赫兹的方波时,你的硬件就成功啦。既然只用一条IO就扩展了几十个按键,软件上自然会多费些事,此类芯片发码都是有引导头,同步部分,用户码,键码等部分组成,有三十多个位,具体可参照sc6121资料。下面时一个完整的接收程序,针对的芯片是sc6121,处理器89c51//////////////////////////////////////////////
3、//////////////////////////////////*定时器1中断服务程序*//*每100us中断一次,定时检测HangSignal线上的电平状态,根据6121的砝码格式译出用户码键码.\ib_KeyCode[0]用户码低位,ib_KeyCode[1]用户码高位,ib_KeyCode[2]键码,ib_KeyCode[3]键码的反码*//////////////////////////////////////////////////////////////////////////////////////voidHandIn() interrupt3
4、using3{ unsignedchartempbit=0; bitHbit; Hbit=HandSignal; /*采样信号线*/ if(NewKey==FALSE){ /*如果上一次按键事件已经北处理*/switch(ib_HandState){ /*根据接收状态散转*/ caseLEAD: /*引导
5、头接收情况*/ if(Hbit){ /*如果信号线是高电平*/ if((ib_LowTime>MIN_LeadTime)&&(ib_LowTime6、 /*否则复位接收程序*/ ib_LowTime=0; /*清除低电平时间计数*/ } else{ /*如果信号是低电平*/ ib_LowTime++; /*增加低电平时间计数器*/if(ib_LowTime>MAX_LeadTime) /*判断低电平时间是否超时*/ ib_HandState7、=RESTART; /*是的话复位接收程序*/ } break; caseSTART: /*同步头接收情况*/ if(Hbit){ /*如果信号线是高电平*/ ib_HighTime++; /*高电平时间计数器加一*/ if(ib_HighTime>MAX_SynTime)
6、 /*否则复位接收程序*/ ib_LowTime=0; /*清除低电平时间计数*/ } else{ /*如果信号是低电平*/ ib_LowTime++; /*增加低电平时间计数器*/if(ib_LowTime>MAX_LeadTime) /*判断低电平时间是否超时*/ ib_HandState
7、=RESTART; /*是的话复位接收程序*/ } break; caseSTART: /*同步头接收情况*/ if(Hbit){ /*如果信号线是高电平*/ ib_HighTime++; /*高电平时间计数器加一*/ if(ib_HighTime>MAX_SynTime)
此文档下载收益归作者所有