《KEY(按键)应用》大全
非常实用的按键应用程序
设计中你是否遇到过这样的问题:你的产品上要求有几十个按键,处理器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字,全部文档内容请下载后查看。喜欢就下载吧 ……相关推荐:
- [行业范文]美好的法语句子
- [行业范文]描写露珠的句子
- [行业范文]精彩禅语句子图片
- [行业范文]关于满嘴谎言的句子
- [行业范文]关于安静的句子48句
- [行业范文]关于小河的句子
- [行业范文]描写稻田的句子
- [行业范文]思念好朋友的句子
- [行业范文]赞美雪的句子
- [行业范文]早上激励人心的句子
- [行业范文]失恋忧伤的句子
- [行业范文]努力积极向上的句子
- [行业范文]对工作心灰意冷的句子
- [行业范文]失恋让人心疼的句子
- [行业范文]描写珍惜青春的句子
- [行业范文]表达思念的句子简短
- [行业范文]关于父爱的句子范例
- [行业范文]浪漫的英语句子
- [行业范文]关于周末的句子
- [行业范文]思念牵挂的句子
- 有关感恩班会课件简短(二篇)(感恩班会
- 2025年初二下乡军训心得体会800字(15篇
- 关于新员工培训方案汇编(关于新员工培
- 精选高考生寒假学习计划书(精)(高考生
- 毕业实训报告心得体会(3篇)(实训报告心
- 银行工作感悟及心得范文怎么写(四篇)(
- 精选领导干部个人政治画像报告通用(七
- 精选超市11.11活动促销方案(精品超市品
- 2025年怎么做自我介绍汇总(5篇)(至2025
- 最新企业错峰生产方案(26篇)(山西企业
- 最新暑期三下乡社会实践调研报告范本(
- 最新幼儿园大班教育教学总结怎么写(最
- 最新教师节主持词小学(优秀9篇)(教师节
- 关于小学安全教育教学方案(推荐)(关于
- 员工信模板范文怎么写(五篇)(员工信息
- 最新保险销售离职申请书(十六篇)(最新
- 最新XX小学防校园欺凌工作方案怎么写(2
- 有关特岗教师辞职信范文(推荐)(特岗教
- 精选党的建设工作要点简短(党的建设的
- 如何写安康杯竞赛活动总结汇总(4篇)(安




