《KEY(按键)应用》大全.docx_第1页
《KEY(按键)应用》大全.docx_第2页
《KEY(按键)应用》大全.docx_第3页
《KEY(按键)应用》大全.docx_第4页
《KEY(按键)应用》大全.docx_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

KEY(按键)应用大全 技术类别:单片机 需要确认注册邮箱后才能下载,立即确认我的邮箱 设计中你是否遇到过这样的问题:你的产品上要求有几十个按键,处理器IO口很少,PCB的面积又有严格限制,或者你要严格控制成本,无法使用象7219那样的扩展芯片,怎么解决这个问题?下面有个方法,大家都见过遥控器吧,上面不但有几十个按键,而且功能还挺多什么去抖动,同时按键处理都有了,最最重要的是控制芯片体积小,价格便宜(也就1,2块钱),外围器件少。不过具体实现起来有点小麻烦,这类芯片的信号一般是PPM输出的,通常为了有更远的遥控距离,按键编码调制在一个38k左右的载波上。所以我们不得不再为这个方案多花上1块钱,加一个有烂运放做的低通滤波器,将载波滤除后在接到单片机的IO脚上,由于两个频率相差较多,这个滤波器并不难做。我使用LM324做的。其中有两级低通,一个比较器。当你的示波器上出现一串可爱的几百赫兹的方波时,你的硬件就成功啦。既然只用一条IO就扩展了几十个按键,软件上自然会多费些事,此类芯片发码都是有引导头,同步部分,用户码,键码等部分组成,有三十多个位,具体可参照sc6121资料。下面时一个完整的接收程序,针对的芯片是sc6121,处理器89c51/*定时器1中断服务程序*/*每100us中断一次,定时检测HangSignal线上的电平状态,根据6121的砝码格式译出用户码键码.ib_KeyCode0 用户码低位,ib_KeyCode1用户码高位,ib_KeyCode2键码,ib_KeyCode3键码的反码*/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_LowTimeMIN_LeadTime)&(ib_LowTimeMAX_LeadTime) /*判断低电平时间是否超时*/ ib_HandState=RESTART; /*是的话复位接收程序*/ break; case START: /*同步头接收情况*/ if(Hbit) /*如果信号线是高电平*/ ib_HighTime+; /*高电平时间计数器加一*/ if (ib_HighTimeMAX_SynTime) /*如果高电平时间超长,复位接收程序*/ ib_HandState=RESTART; else /*如果信号线是低电平*/ if (ib_HighTimeMIN_SynTime)&(ib_HighTimeMIN_L_Time)&(ib_LowTimeMAX_L_Time) /*如果低电平时间超长,则复位寄售程序*/ ib_HandState=RESTART; break; case WAIT_LOW: /*等待数据下降沿的情况*/ if (Hbit) /*如果仍是高电平*/ ib_HighTime+; /*高电平数据计数器加一*/ if (ib_HighTimeMAX_H_Time) /*如果高电平实际超长,则复位接收程序*/ ib_HandState=RESTART;else /*如果收到一个下降沿*/ ib_KeyCodeib_KeyPoint=1; /*接收数据字节右移一位*/ if (ib_HighTimeMIN_B1TIME)&(ib_HighTime7) /*如果接收满一个字节*/ ib_BitCount=0; /*清空位计数器*/ib_KeyPoint+; /*指向下一个字节*/if (ib_KeyPoint3) /*如果接收完整个数据*/ /unsigned char i; NewKey=TRUE; /*置有新键按下标志*/ /for (i=0;i4;i+) /TI=0; /SBUF=ib_KeyCode; /while(!TI); /TI=0;/ /ib_HandState=RESTART; ib_HighTime=0; /*将高电平时间计数器清零*/ib_HandState=WAIT_HIGH; /*设定系统为等待上升沿状态*/ break; default:break; if (ib_HandState=RESTART) /*如果程序处于复位状态*/ ib_LowTime=0; /*复位各项参数*/ ib_HighTime=0; ib_HandState=LEAD;ib_KeyCode0=0; ib_KeyCode1=0;ib_KeyCode2=0; ib_KeyCode3=0;ib_KeyPoint=0;ib_BitCount=0; NewKey=FALSE; 好多遥控器(无线,红外)发射数据都是PPM调制的,以上程序稍微改动后可以应用于各种PPM调制信号的场合。44矩阵式键盘识别技术#include unsigned char ID;void delay10ms(void) unsigned char i,j;for(i=20;i0;i-)for(j=248;j0;j-); void delay02s(void) unsigned char i;for(i=20;i0;i-)delay10ms();void main(void) while(1) if(P3_7=0) delay10ms();if(P3_7=0) ID+;if(ID=4) ID=0;while(P3_7=0);switch(ID) case 0:P1_0=P1_0;delay02s();break;case1:P1_1=P1_1;delay02s();break;case 2:P1_2=P1_2;delay02s();break;case 3:P1_3=P1_3;delay02s();break; 支持键盘双击事件的C程序设计!/* KeyBoard Encode Program This Program can encode press_key up to 128 and it can deal KB_DBClick Message This is just a test proram and only use 2 key.If More Key need to Encode ,please modify the function:KBKeyPress() This Porgram use Message_Driver method,the KB_Msg is used to record what KB_Msg has occured. The meaning of SysKBMsg is list as following. Program Design:LiBaizhan Ver:1.10 Date:2003-3-16*/#include #include sbitKey1 = P10;sbitKey2 = P11;/* Some System Var Pre_Definition Crystal Frequence is 11.0592MHz*/#define TIME_2MS 0X74#define TIME_20MS 0X043B#define KB_INTERNAL 3 /*Key DBClk Detection Internal */* SysKBMsg define Keyboard Message,it include Single_Click or Double_Click Its bit6bit0 record key_encode and bit 7 record DBClk(1) or SglClk(0) It can record and encode up to 127(27-1) keys No key is press when it is 0 This method did not deal key such as Ctrl_Key or Alt_Key or Shift_Key.etc.*/ /*_*/data unsigned char SysKBMsg=0; /*|7|6|5|4|3|2|1|0|*/ /*| D/S | KB6 | KB5 | KB4 | KB3 | KB2 | KB1 | KB0 |*/data unsigned char KBCounter=0;bitKBCounterStart=0;bitKBCounterStop=0; /*if KeyBoard counter stop then this bit is 1*/bitKBCounterFlag=0; /*Current Counter is used by KeyBoard*/void TimerInt0(void) interrupt 1 /*timer 0 interrupt use to record how long key is press*/ TR0=0; if(KBCounterFlag) /*Current Counter is used by KeyBoard*/ if(KBCounterKB_INTERNAL)/*if DBClk Detection is not finish then detect continue*/ KBCounter+; TR0=1; else KBCounter=0; /*DBClk Detection is finish*/ KBCounterStop=1; void DelayMS(unsigned int dltime); void Init51(void);unsigned char KBKeyPress(void); /*only return what key is press*/ void KBKeyEncode(void); /*encode which key is pressed and DBClk or SglClk*/ void KBStartTimer(unsigned char CntH,unsigned char CntL);/*load counter initial value and start timer*/ void KBStopTimer(void); void KBDealPressKey(void); /*deal key_press message*/void main(void) Init51(); while(1) KBKeyEncode(); /*recored what KeyBoard Msg occure:which key is press and single clk or db clk*/ KBDealPressKey(); /* Delay Time is :(20+17*dl_time)*12/CrystalFrequence(us)*/void DelayMS(unsigned int dltime) unsigned int i; for(i=0;i30)&(key_l30) /释放按键,如果之前按键时间少于1秒,读入键值 key=kpush;if (+key_h)200) key_h=200;key_l=0;if (key=0x80) key=0; /如果之前的按键为长按1秒,清除键值 else kpush=P1&0x7;key_l+;if (key_l800)&(key_h30) /如果按键超过1秒,键值加0x80标志长按键 key=kpush|0x80; key_h=0; key_l=0;void main(void) TMOD=0x1;TR0=1;ET0=1;EA=1;while (1) while (!key) switch (key) case 1:break;case 2:break;键盘接口软件设计 软件设计要考虑以下3部分内容:键盘缓冲区的设置;初始化程序;中断服务程序。 1、键盘缓冲区 键盘缓冲区地址为:30H-4FH,共32个字节。使用R1作为缓冲区放数指针,R7为取数指针。缓冲区为环形。放满后将R1置为30H,再从头放数;当放数指针追上取数指针时,停止放数。当取数指针追上放数指针时,停止取数。 2、初始化程序 包括8052的初始化和键盘的初始化。/ AT89C51 C语言程序/Web:http//Author: yhw2003.7#define CH451_RESET 0x0201 /复位#define CH451_LEFTMOV 0x0300 /设置移动方式-作移#define CH451_LEFTCYC 0x0301 /设置移动方式-左循#define CH451_RIGHTMOV0x0302 /设置移动方式-右移#define CH451_RIGHTCYC0x0303 /设置移动方式-右循 #define CH451_SYSOFF 0x0400 /关显示、键盘、看门狗#define CH451_SYSON1 0x0401 /开显示#define CH451_SYSON2 0x0403 /开显示、键盘#define CH451_SYSON3 0x0407 /开显示、键盘、看门狗功能#define CH451_DSP 0x0500 /设置默认显示方式#define CH451_BCD 0x0580 /设置BCD译码方式#define CH451_TWINKLE 0x0600 /设置闪烁控制#define CH451_DIG0 0x0800 /数码管位0显示#define CH451_DIG1 0x0900 /数码管位1显示 #define CH451_DIG2 0x0a00 /数码管位2显示#define CH451_DIG3 0x0b00 /数码管位3显示#define CH451_DIG4 0x0c00 /数码管位4显示#define CH451_DIG5 0x0d00 /数码管位5显示 #define CH451_DIG6 0x0e00 /数码管位6显示 #define CH451_DIG7 0x0f00 /数码管位7显示/须主程序定义的参数/ sbit ch451_dclk=P17; /串行数据时钟上升延激活/ sbit ch451_din=P16; / 串行数据输出,接CH451的数据输入/ sbit ch451_load=P15; /串行命令加载,上升延激活/ sbit ch451_dout=P33; /INT1,键盘中断和键值数据输入,接CH451的数据输出/ ucharch451_key; / 存放键盘中断中读取的键值/*/初始化子程序void ch451_init()ch451_din=0; /先低后高,选择4线输入ch451_din=1;#ifdef USE_KEYIT1=0; /设置下降沿触发IE1=0; /清中断标志PX1=0; /设置低优先级EX1=1; /开中断#endif/*/输出命令子程序/定义一无符号整型变量存储12字节的命令字。void ch451_write(unsigned int command)unsigned char i;#ifdef USE_KEYEX1=0; /禁止键盘中断#endif ch451_load=0; /命令开始 for(i=0;i=1; ch451_dclk=1; /上升沿有效ch451_load=1; /加载数据#ifdef USE_KEYEX1=1;#endif#ifdef USE_KEY/*/输入命令子程序,MCU从451读一字节unsigned char ch451_read()unsigned char i;unsigned char command,keycode; /定义命令字,和数据存储器EX1=0; /关中段 command=0x07; /输入读451命令字 ch451_load=0;for(i=0;i=1; /往右移一位 ch451_dclk=1; /产生时钟上升沿锁通知CH451输入位数据ch451_load=1; /产生加载上升沿通知CH451处理命令数据keycode=0; /清除keycodefor(i=0;i7;i+) keycode=1; /数据移入keycode,高位在前,低位在后 keycode|=ch451_dout; /从高到低读入451的数据 ch451_dclk=0; /产生时钟下升沿通知CH451输出下一位 ch451_dclk=1;IE1=0; /清中断标志EX1=1;return(keycode); /反回键值/*/中断子程序使用中断2,寄存器组1void ch451_inter() interrupt 2 using 1unsigned char i; /定义循

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论