




已阅读5页,还剩28页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
键盘接口软件设计Juliet发表评论于2006-5-10 11:36:00键盘接口软件设计 软件设计要考虑以下3部分内容:键盘缓冲区的设置;初始化程序;中断服务程序。 1、键盘缓冲区 键盘缓冲区地址为:30H-4FH,共32个字节。使用R1作为缓冲区放数指针,R7为取数指针。缓冲区为环形。放满后将R1置为30H,再从头放数;当放数指针追上取数指针时,停止放数。当取数指针追上放数指针时,停止取数。 2、初始化程序 包括8052的初始化和键盘的初始化。程序清单如下: MOV IE,#0H ;关中断 CLR F0 ;F0=0为类型1键盘;F0=1为类型2键盘 MOV R0,#0H MOV R1,#30H ;置缓冲区放数指针起始值 MOV R2,#0H MOV R3,#0H MOV R4,#0H MOV R5,#0H MOV R6,#0H MOV R7,#2FH ;置缓冲区取数指针起始值 MOV B,#0H MOV TCON,#0H ;置INT0为电平触发方式 KEYINT: ;主中断服务程序 MOV IE,#0H ;关中断 MOV A,R7 ;取数指针放到A XRL A,R1 ;与放数指针比较 JZ KL4 ;放数指针=取数指针则退出 INC R0 ;脉冲计数 KL1: JNB P3.2,KL1 ;等待时钟脉冲为“1” CJNE R0,#01H,K12 ;首次收到脉冲则判断键盘类型 MOV C,P1.0 KL2:JB F0,KL3 ;根据F0的值转不同服务程序 MOV F0,C ;保存键盘类型 MOV C,P1.0 ;采用数据 LCALL INTB ;类型2键盘中断服务程序 MOV IE,#81H ;开中断 RETI KL3: MOV C,P1.0 ;采样数据 LCALL INTA ;类型1键盘中断服务程序 KL4: MOV IE,#81H ;开中断 RETI 限于篇幅,以下公列出类型1键盘中断服务子程序的处理程序,类型2键盘中断服务子程序除需要进行奇校验及计数脉冲个数不同外,流程基本一致。 类型1键盘中断服务子程序: INTA: MOV A,R2 ;数据位移入R2和R3中 RRC A MOV R2,A MOV A,R3 RRC A MOV R3,A CJNE R0,#0AH,INTA1 ;计数脉冲不为10退出,否则转换 CLR C MOV A,R3 RLC A MOV A,R2 RLC A MOV R5,A ;数据存入R5 ANL A,#80H JNZ INTA3 ;是否为放键码,是则退出 MOV A,R5 MOV DPTR,#1000H ;1000H为码表转换区起址 MOVC A,A+DPTR ;扫描码转换为ASCII码 MOV R1,A ;ASCII码存入键盘缓冲区 INC R1 CJNE R1,#50H,INTA3 MOV R1,#30H ;缓冲区满则R1=30H INTA3: CJNE R7,#2FH,INT4 MOV R7,#30H INTA4: MOV R0,#0H ;脉冲计数清零 MOV R5,#0H INTA2: MOV R2,#0H MOV R3,#0H INTA1: RET ORG 1000H ;码表转换区 ORG 1002H ;这里仅列出0-9的转换表 DB 31H,32H,33H,34H,35H,36H,37H,38H,39H,30H CH451的LED驱动及8*8键盘驱动程序Juliet发表评论于2006-5-10 11:39:00/ CH451 / AT89C51 C语言程序/Web:http//Author: yhw 2003.7#define CH451_RESET 0x0201 /复位#define CH451_LEFTMOV 0x0300 /设置移动方式-作移#define CH451_LEFTCYC 0x0301 /设置移动方式-左循#define CH451_RIGHTMOV 0x0302 /设置移动方式-右移#define CH451_RIGHTCYC 0x0303 /设置移动方式-右循 #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的数据输出/ uchar ch451_key; / 存放键盘中断中读取的键值/*/初始化子程序void ch451_init() ch451_din=0; /先低后高,选择4线输入 ch451_din=1;#ifdef USE_KEY IT1=0; /设置下降沿触发 IE1=0; /清中断标志 PX1=0; /设置低优先级 EX1=1; /开中断#endif/*/输出命令子程序/定义一无符号整型变量存储12字节的命令字。void ch451_write(unsigned int command) unsigned char i;#ifdef USE_KEY EX1=0; /禁止键盘中断#endif ch451_load=0; /命令开始 for(i=0;i=1; ch451_dclk=1; /上升沿有效 ch451_load=1; /加载数据#ifdef USE_KEY EX1=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; /清除keycode for(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 1 unsigned char i; /定义循环变量 unsigned char command,keycode; /定义控制字寄存器,和中间变量定时器 command=0x07; /读取键值命令的高4位0111B ch451_load=0; /命令开始 for(i=0;i=1; /右移一位 ch451_dclk=1; /产生时钟上升沿锁通知CH451输入位数据 ch451_load=1; /产生加载上升沿通知CH451处理命令数据 keycode=0; /清除keycode for(i=0;i7;i+) keycode= 0x80) break;/有独占键压下,退出测试 key = 1;/测试下一独占键 temp -;/键号-1 while(key);/未测完继续 if (key != 0x80) key = 0xff;/多个独占键压下,出错键码0xff else key = temp;/得到键码2835,键号key29key36. else /测试组合键,键码027 temp = 0x01;/实为从P1_1测起,到P1_7测完 do /只需扫描7次! temp = 1;/继续扫描下一位 P1 = temp;/发送某位低电平 _nop_();/延时 key = P1;/接收键盘数据 key = key;/取反,变为正逻辑 while(temp = 28) temp = 0xff;/查无此组合键,出错键码0xff else key = temp;/得到组合键码027,键key1key28. return key;/返回键码035或出错码0xff 一个按键的多次击键组合判别技巧大话篇Juliet发表评论于2006-5-10 11:42:00一个按键的多次击键组合判别技巧大话篇 小匠自从上次在旧社区发表了一篇大话篇后,好久没有发表高论了.急坏了一帮MM,以为小匠退隐江湖了。(斑竹在旁问道:“MM”不是“Mie Mie”,而是 “Ma Ma” 吧?)论坛内外谣言四起,有人说小匠改行了,不做程序匠,改做泥水匠了;还有人说小匠上阿富汗反恐怖去了;其实非也,只因新板论坛启用后,小匠一直用不惯.(斑竹在旁笑道:是“用不来”吧?)今天,小匠再次隆重登坛献演。贴一个小程序段.(斑竹道:我看是“蹬痰现眼”吧?)(程序匠人贴完帖子,下到后台,一边洗着手上残余的浆糊,一边哼着小曲:“如果你的芯是一座作坊,我愿作那不知疲倦的程序匠,”)(一黑客悄悄贴近匠人,将一个废弃的浆糊桶扣到匠人头上.)(匠人忙问:“斑竹,谁把灯给关了?”)(众人哈哈大笑!.)一个按键的多次击键组合判别技巧有时在设计中,往往要用一个按键来输入多种信息。如:单击/双击/三击、短击/长击、还有各种组合击键方式。可以用以下程序来做。如果按键闭合时间500MS,判断为一次长击(1);两次击键时间间隔应700MS,如果按键释放后700MS内无键按下,则结束读键。读键完毕返回一个键号值KEY_NUM。其意义如下:KEY_NUM 意义00000000 无键按下过00000001 无意义00000010 单次短击00000011 单次长击00000100 短击 + 短击00000101 短击 + 长击00000110 长击 + 短击00000111 长击 + 长击 10000000 7次短击11111111 7次长击上表中的KEY_NUM值的规律是,从左向右看,第一个1后面的每一位代表一次击键;0代表短击,1代表长击。掌握该规律后,我们可将任何一个8位的二进制数翻译成一种击键组合。例如:01010101,代表的是:短+长+短+长+短+长。该程序最多可识别7次连续击键,共254种组合。但并非每个程序中用得上。在大多数程序中,能判断双击即可以了,这时可将程序中的ZHBIT定义为2。同理,如果要判断3次按键,将ZHBIT定义为3即可。当ZHBIT=1时,程序仅能判断一次击键,包括2种组合(短击/长击);当ZHBIT=2时,程序还能判断两次击键,包括6(2+4)种组合(短击/长击/(短+短)/(短+长)/(长+短)/(长+长);以次类推,当ZHBIT=3时,程序能判断三次击键,包括14(2+4+8)种组合。ZHBIT 组合种类1 22 2+4=63 2+4+8=144 2+4+8+16=305 2+4+8+16+32=626 2+4+8+16+32+64=1267 2+4+8+16+32+64+128=254下面这段程序摘自小匠的一个智能充电器程序(MCU是EM78P458),如下:;*;读键子程序;出口: KEY_NUM =键号值;中间: KEY_DL =计数器;说明:/*短击:键按下时间500MS两次按键间隔时间 键号低位;=READKEYA: CLR KEY_DL ;清计数器READKEYB: CALL DL10MS INC KEY_DL MOV A,50 SUB A,KEY_DL JBC R3,C JMP READKEYC ;计数器溢出跳 JKON READKEYB ;键未释放跳 BC R3,C ;C=0 JMP READKEYD;=READKEYC: WDTC ;喂狗 JKON READKEYC ;键未释放跳 BS R3,C ;C=1READKEYD: RLLC KEY_NUM ;键号左移一位,C - 键号低位 JBC KEY_NUM,ZHBIT ;按键检测未完成继续 RET;= CLR KEY_DL ;清计数器READKEYE: CALL DL10MS INC KEY_DL MOV A,70 SUB A,KEY_DL JBC R3,C READKEYF: RET ;计数器溢出返回 JKOFF READKEYE ;键未按下跳 JMP READKEYA ;再次检测;=;键闭合跳(宏);=JKON MACRO ADDRESS JBS R5,KEY ;键断开跳 FJMP ADDRESS ;键闭合跳 CALL DL10MS ;延时去抖动 JBS R5,KEY ;键断开跳 FJMP ADDRESS ;键闭合跳ENDM ;=;键断开跳(宏);=JKOFF MACRO ADDRESS JBC R5,KEY ;键闭合跳 FJMP ADDRESS ;键断开跳 CALL DL10MS ;延时去抖动 JBC R5,KEY ;键闭合跳 FJMP ADDRESS ;键断开跳ENDM多个按键的连按处理技巧大话篇Juliet发表评论于2006-5-10 11:43:00多个按键的连按处理技巧大话篇 咚咚呛!咚咚呛!咚咚呛!-锣鼓三响,小匠出场:“如果你的芯是一座作坊,我愿做那不知疲倦的程序匠”-台下,鲜花共烂西红柿一色,飞向台前-匠人连忙举起一个键盘,左遮右挡话说小匠的大话篇,自隆重推出以来,篇篇都考了个COOL,一时间人气大震。截止昨天,共结交了N位好友,众多MM纷纷到斑竹那里打听小匠的婚否情况-西红柿再次飞向台前上次贴了一篇一个按键的多种击键组合判别技巧,这次再贴个姊妹篇上来-匠人正在贴贴子,被值勤的斑竹逮个正着:“好啊!我才打扫干净,你又给糟蹋了”-匠人忙堆起一脸的媚笑:“斑竹大人,我贴的可是大话篇,麻烦你再给个COOL”-斑竹恍然:“哦,原来满纸胡言,通篇诋毁我斑竹光辉形象的那个匠人,就是你?!”-匠人一看情形不对,正想开溜-只见一道白光一晃-3个时辰之后,有人发现昏迷不醒的程序匠人躺在血泊之中-墙上提着一行血字:“十步杀一匠,千里不留行。事了拂衣去,深藏身与名。”-好了,言归正传,请看下文: 多个按键的连按处理技巧 在设计中,常常用UP键和DOEN来调节参数。这种键在处理时,要考虑连按的问题。而且希望键连续按下的时间越长,动作的响应速度越快(即加速度处理)在连按的处理过程中,要考虑3个时间常数: 1、连按响应时间常数(首次值),该值用于区分连按/单按。 a)当按键闭和的时间该参数时,判为连按; 2、连按缓冲时间常数(最大值)。 在连按操作刚开始时,按键响应速度较慢,这个参数就是用于决定每次动作之间的最大时间。 3、连按缓冲时间常数(最小值) 在连按的过程中,响应的速度越来越快,但也不能无限快。这个参数就是用于决定每次动作之间的最小时间。 还有一个要考虑的问题是,可能并不是所有按键都具有连按功能。这时,可用一个标志位来区分。在读键子程序中返回键值的同时,也返回这个标志,告诉键盘监控程序是否要做连按处理。 下面的一段例程中,可以识别单按/连按,并可处理加速度问题。只要在主程序中调用即可。程序中的延时用现实程序来代替。;*;按键处理模块;*;时间常数定义KEY_T = 250 ;连按响应时间常数(首次值)KEY_TMAX = 120 ;连按缓冲时间常数(最大值)KEY_TMIN = 30 ;连按缓冲时间常数(最小值);*KEYWK: MOV A,KEY_T MOV KEY_JS,A ;连按计数器置初值 BC TT1,KEY ;清连按标志 MOV A,KEY_TMAX-KEY_TMIN MOV KEY_JSJS,A ;连按加速计数器置初值 CALL READKEY ;读键 JBS R3,C ;有键按下跳 RET FCALL MOVLCD ;显示延时 CALL READKEY ;读键 JBS R3,C ;确实有键按下跳 RET;=确实有键按下 MOV KEY_BUF,A ;保存键值 KEY1: FCALL MOVLCD ;显示延时 CALL READKEY ;读键 JBS R3,C ;键未释放跳 JMP KEY5;=连按判断 JBS TT1,KEY_EN ;连按功能有效跳 JMP KEY1 ;禁止连按跳 JBC TT1,KEY ;不是连按跳 JMP KEY2 DJZ KEY_JS ;连按计数器-1=0跳 JMP KEY1 BS TT1,KEY ;置连按标志 JMP KEY1;=连按处理KEY2: CALL DOKEY ;执行按键功能 MOV WK_MODE,A ;刷新模式;连按加速计数器-1 DJZ KEY_JSJS JMP $+2 INC KEY_JSJS;连按计数器置延时值 MOV A,KEY_TMIN ADD A,KEY_JSJS MOV KEY_JS,A ;连按计数器置延时值KEY4: FCALL MOVLCD ;显示延时 DJZ KEY_JS ;连按计数器-1=0跳 JMP KEY4 JMP KEY1;=单按处理KEY5: FCALL MOVLCD ;显示延时 CALL READKEY ;读键 JBC R3,C ;键确实已释放跳 JMP KEY1 JBC TT1,KEY ;不是连按跳 RET;按键发声 BS TT1,KEY_SP ;开蜂鸣器 FCALL MOVLCD CALL DOKEY ;执行按键功能 MOV WK_MODE,A ;刷新模式 BC TT1,KEY_SP ;关蜂鸣器 FCALL MOVLCD RET;*;读键子程序;出口: A=键号值(0=无,1=K2定时,2=K3功率选择,3=K4水温上调,4=K5水温下调,; 5=K6时钟上调,6=K7时钟下调,7=K8时段设置); C: (0=无,1=有); TT1,KEY_EN: 当前键连按有效标志(0=禁止连按,1=可连按); (K4/K5/K6/K7有连按功能);*READKEY: BS R3,C;不可连按的按键 BC TT1,KEY_EN JBS R7,6 ;K2未闭合跳 RETL 01 ;返回A=01 JBS R7,0 ;K3未闭合跳 RETL 02 ;返回A=02 JBS R7,5 ;K8未闭合跳 RETL 07 ;返回A=07 ;可连按的按键 BS TT1,KEY_EN JBS R7,1 ;K4未闭合跳 RETL 03 ;返回A=03 JBS R7,2 ;K5未闭合跳 RETL 04 ;返回A=04 JBS R7,3 ;K6未闭合跳 RETL 05 ;返回A=05 JBS R7,4 ;K7未闭合跳 RETL 06 ;返回A=06 BC R3,C RETL 00 ;返回A=00 -结束 PC机键盘按键通码与ASCII对照表Juliet发表评论于2006-5-10 11:46:00PC机键盘按键通码与ASCII对照表 这个库要配合本站发部的 单片机驱动标准pc机键盘的c51程序使用unsigned char code noshift802=22 ,49,/ 1 30 ,50,/ 2 38 ,51,/ 3 37 ,52,/ 4 46 ,53,/ 5 54 ,54,/ 6 61 ,55,/ 7 62 ,56,/ 8 70 ,57,/ 9 69 ,48,/ 0 28 ,97,/ a 50 ,98,/ b 33 ,99,/ c 35 ,100,/ d 36 ,101,/ e 43 ,102,/ f 52 ,103,/ g 51 ,104,/ h 67 ,105,/ i 59 ,106,/ j 66 ,107,/ k 75 ,108,/ l 58 ,109,/ m 49 ,110,/ n 68 ,111,/ o 77 ,112,/ p 21 ,113,/ q 45 ,114,/ r 27 ,115,/ s 44 ,116,/ t 60 ,117,/ u 42 ,118,/ v 29 ,119,/ w 34 ,120,/ x 53 ,121,/ y 26 ,122,/ z 84 ,91,/ 91 ,93,/ 76 ,59,/ ; 82 ,39,/ 65 ,44,/ , 73 ,46,/ . 74 ,47,/ / 78 ,45,/ - 85 ,61,/ = 93 ,92,/ 14 ,96,/ 90 ,32,/ enter 5 , 0,/ f1 6 , 1,/ f2 4 , 2,/ f3 12 , 3,/ f4 3 , 4,/ f5 11 , 5,/ f6 131, 6,/ f7 10 , 7,/ f8 1 , 8,/ f9 9 , 9,/ f10 120,10,/ f11 7 ,11,/ f12 102,12,/ back 224,13,/ home 105,14,/ end 125,15,/ pageup 122,16,/ pagedown 117,17,/ up 114,18,/ down 107,19,/ left 116,20,/ right 113,21,/ del 112,22,/ insert 225,23,/ pause 118,24,/ esc 13 ,25,/ tab 88 ,26,/ caps 20 ,27,/ ctrl 17 ,28,/ alt 41 ,29,/ space 31 ,30,/ win 47 ,31,/ winright ;unsigned char code addshift472=14,126, / 22, 33, / ! 30, 64, / 38, 35, / # 37, 36, / $ 46, 37, / % 54, 94, / 61, 38, / & 62, 42, / * 70, 40, / ( 69, 41, / ) 78, 95, / _ 85, 43, / + 93,124, / | 84,123, / 91,125, / 76, 58, / : 82, 34, / 65, 60, / 74, 63, / ? 28 ,65,/ a 50 ,66,/ b 33 ,67,/ c 35 ,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 沪教版九年级物理第一学期7.1电流 电压 -电压说课稿
- 2025电梯维修保养合同范本
- 房屋托管协议模板合同(样本)6篇
- 2025贷款无息使用合同模板
- 2025企业用工详细合同
- 2025合同权益责任转让协议书
- 2025关于卫浴设备购销的合同书
- Unit 7 School clubs说课稿-2023-2024学年初中英语七年级上册(2012秋审查)沪教牛津版(深圳·广州)
- 2025租赁合同民事申诉状
- 2025年移动通信设备标准购销合同
- 诗经整本书阅读课件
- (2025年标准)预售小麦协议书
- 2025年院感测试题及答案
- 承包商全流程安全培训
- 养生店国庆节活动方案
- 7.1促进民族团结 课件 2025-2026学年统编版道德与法治九年级上册
- 2025年建筑施工安全教育试题及答案
- 桩基质量管理制度
- 口腔颌面外科缝合技术要点
- 2025至2030中国军用导航仪器行业市场深度研究与战略咨询分析报告
- 2025年科创板开户试题及答案
评论
0/150
提交评论