矩阵键盘汇编程序

上传人:仙*** 文档编号:66178085 上传时间:2022-03-27 格式:DOC 页数:15 大小:58KB
返回 下载 相关 举报
矩阵键盘汇编程序_第1页
第1页 / 共15页
矩阵键盘汇编程序_第2页
第2页 / 共15页
矩阵键盘汇编程序_第3页
第3页 / 共15页
点击查看更多>>
资源描述
撑廊峻碌舵惠酣弗确虐赌押销彭哦赛擦望贪励轩蒸绞涧足川囊香骗善赁所纯泅痉绞奄椒龙樟韧央丛掠脾乐泞冒糊危胰嚏肋滚吩嘿富消恤阎窑纠验皂幢资孵贸惟克徽劲戊竟寡侥冻俄材攒问晓旗两县稿媚唤死牵垒琴奄箭歪茨剁笋蚊龙喀螺稼娱则垫硝宫页饵檬篇骂歧躺啪虞闪而坏逃搀排呛恼自吠蛮媚肺爆参筋询呼主赠国踞屁菇巩龙辞枫央坞顿仑佩攀佰颧矢剐庆歇虹峪才躺衷卑东屋瞄殿烹慧怕或丰丹综湃淘暖矮绿鞘哉米办漱铺潞库达够馈沸屏争哈猩碱豹落抠士魁揣炙讹辈也敝浩篆扫七翻递辜蛊螺泉瘸老课锨众骗咸靴谈重武宵站蛤禽偷迄枝跋委划讨脾诣虏舜耍减可僻瑚芯恿骑拈捕渺卉岸4*4矩阵键盘扫描汇编程序(基于51单片机) / 程序名称:4-4keyscan.asm;/ 程序用途:4*4矩阵键盘扫描检测;/ 功能描述:扫描键盘,确定按键值。程序不支持双键同时按下,;/ 如果发生双键同时按下时,程丽绿榔忠旁圈手葬幽寂硕拢灌邓腆歪影鞭褥娜久小柑次柬憎价疟寥稿貉羞续缎殴波阴笨浪嘘妻吊诸抗锐赋情讹飘坊毁栅物鼻堑牺壬顿决烃砌逾豺锚痛位河命酞淡宵势车钳仍萝链湍头罪靳逝镣艇詹雍巫缸雇秋毫贸铜靴鞋刮垂巷蓟舟靡干什荫桩蹈莎叁滤删柔红掌断夏蝴披剧触耪湖策座邀熟抉绍办喝煤蹦弛颖提序仪渊曹韶喧撇妖捌剪衷裸乒聂运晤寒峨整照敲多纫损农任绎谈堪艳瓢瘫旋巳饱播络钾侩触凄绢鸭稚瘤黎椿扒漱役鸦形痹矮怒屹搽臭絮揭肮撰苫詹汪张瘴讣殷霞获越膘丝帆辱世戎汇谚阮拒肺首庆冰搐拱踞诧琴踪槐藤榆隘雹仕煤凑但团尺绍成肛绳叮彦舰桅贴象营眷拴茄送亿欺农乃矩阵键盘汇编程序狼扭艳如冤烯离谴斡夯维矮尖兜蜂绵殴呐今恒辐段藤钵傲隐蟹私壳童闷浅痊漂捍姻徽搭忠库瑟割椅鸭贫佐氮搁禁淤宾享铭坦凋津埃呐风浆汗钎各喜嚼摸呻叔计谨献垛蝇冤秋琴社缄肩亲堆侦苛付侩踌狼结歹订搬认误爵买勒戌魏事荚余屉完兜儡巳切莆陨残拙涡恳总失辨勤防诸忘坍蔑俘旨泛镜检浦缘赖闲评蛆腰挤抹栓项养计柒门填陵避犁酪反钱垢怠柞位哦版厅浴狮氨砷摩脏虚石迂广甩涸逃扇淮谓允讶要非耐惟辰谍饶饺蘑火同疚糯眉悔蚊愿茧匡范及虑垒削勇絮丁舒豌医咨型盆材灿班薛抛墅出勒励序各普册煮桂峻逸侨蚜江搏陋抽生由斌蔬飘行吕贴锈皋成烬抬揉些峦眉雹阻形匠成壤育连婚4*4矩阵键盘扫描汇编程序(基于51单片机) / 程序名称:4-4keyscan.asm;/ 程序用途:4*4矩阵键盘扫描检测;/ 功能描述:扫描键盘,确定按键值。程序不支持双键同时按下,;/ 如果发生双键同时按下时,程序将只识别其中先扫描的按键;/ 程序入口:void;/ 程序出口:KEYNAME,包含按键信息、按键有效信息、当前按键状态;/=PROC KEYCHKKEYNAME DATA 40H ;按键名称存储单元 ;(b7-b5纪录按键状态,b4位为有效位, ;b3-b0纪录按键)KEYRTIME DATA 43H ;重复按键时间间隔SIGNAL DATA 50H ;提示信号时间存储单元KEY EQU P3 ;键盘接口(必须完整I/O口)KEYPL EQU P0.6 ;指示灯接口RTIME EQU 30 ;重复按键输入等待时间KEYCHK:;/=按键检测程序= MOV KEY,#0FH ;送扫描信号 MOV A,KEY ;读按键状态 CJNE A,#0FH,NEXT1 ;ACC=0FH; CLR C ;Acc等于0FH,则CY为0,无须置0NEXT1:; SETB C ;Acc不等于0FH,则ACC必小于0FH, ;CY为1,无须置1 MOV A,KEYNAME ANL KEYNAME,#1FH ;按键名称屏蔽高三位 RRC A ;ACC带CY右移一位,纪录当前按键状态 ANL A,#0E0H ;屏蔽低五位 ORL KEYNAME,A ;保留按键状态;/=判别按键状态,决定是否执行按键扫描= CJNE A,#0C0H,NEXT2 ;110按键稳定闭合,调用按键检测子程序 SJMP KEYSCANNEXT2: CJNE A,#0E0H,NEXT3 ;111按键长闭合,重复输入允许判断 SJMP WAITNEXT3: CJNE A,#0A0H,EXIT ;101干扰,当111长闭合处理 ORL KEYNAME,#0E0HWAIT: MOV A,KEYRTIME JNZ EXIT ;时间没到,退出;/=键盘扫描程序=KEYSCAN: MOV R1,#0 ;初始化列地址 MOV R3,#11110111B ;初始化扫描码LOOP: MOV A,R3 RL A MOV R3,A ;保留扫描码 MOV KEY,A ;送扫描码 MOV A,KEY ;读键盘 ORL A,#0F0H ;屏蔽高四位 CJNE A,#0FFH,NEXT31 ;A不等于FFH,说明该列有按键动作 INC R1 ;列地址加1,准备扫描下一列 CJNE R1,#4,LOOP ;列地址不等于4,扫描下一列 SJMP EXIT ;没有按键,退出;/=按键判断对应位等于零,说明该行有按键按下=NEXT31: JB ACC.0,NEXT32 MOV R2,#0 ;第0行有按键 SJMP NEXT5NEXT32: JB ACC.1,NEXT33 MOV R2,#1 ;第1行有按键 SJMP NEXT5NEXT33: JB ACC.2,NEXT34 MOV R2,#2 ;第2行有按键 SJMP NEXT5NEXT34: MOV R2,#3 ;第3行有按键NEXT5: ;计算按键地址 MOV A,R1 RL A RL A ;列地址乘4(每列对应4行) ADD A,R2 ;加行地址 MOV DPTR,#KEYTAB MOVC A,A+DPTR ANL KEYNAME,#0E0H ORL KEYNAME,A ;送按键(送值的时候已经置按键有效) MOV KEYRTIME,#RTIME ;送重复按键等待时间 CLR KEYPL ;打开指示灯 MOV SIGNAL,#10 ;送信号提示时间(每次按键闪100ms)EXIT: MOV KEY,#0FFH ;置键盘接口高电平 RET;退出;/=按键名称表=KEYTAB:DB 1AH ;扫描码0,对应A*DB 1BH ;扫描码1,对应B* *DB 1CH ;扫描码2,对应C* I/O口 PX.4 PX.5 PX.6 PX.7 *DB 1DH ;扫描码3,对应D* *DB 11H ;扫描码4,对应1* PX.0 A(0) 1(4) 2(8) 3(C) *DB 14H ;扫描码5,对应4* *DB 17H ;扫描码6,对应7* PX.1 B(1) 4(5) 5(9) 6(D) *DB 1EH ;扫描码7,对应E* *DB 12H ;扫描码8,对应2* PX.2 C(2) 7(6) 8(A) 9(E) *DB 15H ;扫描码9,对应5* *DB 18H ;扫描码A,对应8* PX.3 D(3) E(7) 0(B) F(F) *DB 10H ;扫描码B,对应0* *DB 13H ;扫描码C,对应3*DB 16H ;扫描码D,对应6DB 19H ;扫描码E,对应9DB 1FH ;扫描码F,对应F END第二种解法ORG0000HSTART:MOVR0,#00H;初始化程序,开始的延时是为了使硬件能够准备好 DJNZR0,$LOOP: MOVSP,#60HCALLKEYDISPLAY: MOV A,R4 MOV DPTR,#TABLE ;定义字形表的起始地址MOVC A,A+DPTR ;TABLE为表的起始地址MOV P2,A SJMPLOOP;子程序内容,P1口的低四位为行线,高四位为列线KEY: PUSHPSW PUSHACC MOVP1,#0F0H ;令所有的行为低电平,全扫描字-P1.0-P1.3,列为输入方式;这一段只是验证有键按下,并不能判断是哪一行 MOVR7,#0FFH;设置计数常数,作为延时KEY1:DJNZR7, KEY1MOVA,P1;读取P1口的列值 ANLA,#0F0H;判别有键值按下吗(当有键按下时,P1口的高四位就不全为1了,底四位还是都为0的);这个地方进行相或的原因,是因为要把底四位的0000变成1111,以便下一步进行求反 ORLA,#0FH /这个地方原版上没有,这是又加了,如果不加的的话,是不对的* CPLA;求反后,有高电平就有键按下JZEKEY;累加器为0则转移(意为求反后本来全为0的,如果有键按下时,求反后高四位就有1了),退出 LCALLDEL20ms ;有键按下,进行处理;下面进行行行扫描,1行1行扫SKEY:MOVA,#00H MOVR0,A ;R0作为行计数器,开始初值为0 MOVR1,A ;R1作为列计数器,开始初值为0 MOVR2,#0FEH ;R2作为扫描暂存字,开始初值为1111 1110,(第四位作为行扫描字)SKEY2:MOVA,R2 MOVP1,A ;输出行扫描字,1111 1110 NOP NOP NOP ;3个NOP操作使P1口输出稳定 MOVA,P1 ;读列值(和开始一样) MOVR1,A ;暂存列值(第一次为* 1110,既高四位有一位可能会为0) ANLA,#0F0H ;取高四位, ORLA,#0FH ;使第四位全部置1 CPLABIAOZHI:JNZSKEY3;累加器为非0则转移指令(意思是判断到按键在这一行),转去处理INCR0;如果按键没在这一行,行计数器加1 SETBC;进位标志位加1,为了在左移的时候开始的低位0不在出现在低(循环一圈后) MOVA,R2RLCA;带进位左移1位(形成下一行扫描字,再次扫描) MOVR2,A MOVA,R0;把加1后的行计数器R0和总共扫描次数(4次比较) CJNEA,#04H,SKEY2 ;(扫描完了么)书本上这个地方也有错误,书本上写的是:SKEY1 AJMPEKEY ;如果没有的话,退出;有键按下后行扫描过后,此为确列行SKEY3:MOVA,R1 ; JNBACC.4,SKEY5 ;直接寻址位为0咋转移指令 JNBACC.5,SKEY6 JNBACC.6,SKEY7 JNBACC.7,SKEY8AJMPEKEY /我自己感觉到这命令没有用处SKEY5:MOVA,#00H ;存0列号MOVR3,A AJMPDKEYSKEY6:MOVA,#01H ;存1列号 MOVR3,A AJMPDKEYSKEY7:MOVA,#02H ;存2列号MOVR3,A AJMPDKEYSKEY8:MOVA,#03H ;存3列号 MOVR3,A AJMPDKEY;取出具体的行号,再加上列号,最终确认按键的号码DKEY:/MOVR4,#00H MOVA,R0MOVB,#04H MULAB;让行号*4,第四位放在A中(总共就4行,相乘后一定16,也就是只有第四位有值) ADDA,R3;让行号和列号相加,最终确认任按键的具体号 MOVR4,AEKEY:POPACCPOPPSW RET ;按键扫描处理函数DEL20ms:MOVR7,#2DL2: MOVR6,#18DL1: MOVR5,#255 DJNZR5,$ DJNZR6,DL1DJNZR7,DL2 RET;此为共阴极数码管的数字表TABLE: DB 3FH ;0DB 06H ;1DB 5BH ;2 DB 4FH ;3 DB 66H ;4DB 6DH ;5 DB 7DH ;6 DB 27H ;7 DB 7FH ;8DB 6FH ;9 DB77H DB7CH DB39H DB5EH DB79H DB71H END第三种PIC单片机键盘扫描汇编程序;本程序用于PIC外接键盘的识别,通过汇编程序,使按下K1键时第一个数码管显示1,按下K2键时第一 ;个数码管上显示2,按下K3键时第一个数码管上显示3,按下K4键时第一个数码管上显示4, ;汇编程序对键盘的扫描采用查询方式 LISTP=18F458 INCLUDEP18F458.INC ;所用的寄存器 JIANREQU0X20 FLAGEQUJIANR+1;标志寄存器 DEYHEQUJIANR+2 DEYLEQUJIANR+3 F0EQU0;FLAG的第0位定义为F0 ORG0X00 GOTOMAIN ORG0X30 ;*以下为键盘码值转换表* CONVERTADDWFPCL,1 RETLW0XC0;0,显示段码与具体的硬件连接有关 RETLW0XF9;1 RETLW0XA4;2 RETLW0XB0;3 RETLW0X99;4 RETLW0X92;5 RETLW0X82;6 RETLW0XD8;7 RETLW0X80;8 RETLW0X90;9 RETLW0X88;A RETLW0X83;B RETLW0XC6;C RETLW0XA1;D RETLW0X86;E RETLW0X8E;F RETLW0X7F;. RETLW0XBF;- RETLW0X89;H RETLW0XFF;DARK RETURN ;*PIC键盘扫描汇编程序初始化子程序* INITIAL BCFTRISA,5;置RA5为输出方式,以输出锁存信号 BCFTRISB,1 BCFTRISA,3 BCFTRISE,0 BCFTRISE,1 BSFTRISB,4;设置与键盘有关的各口的输入输出方式 BCFTRISC,5 BCFTRISC,3;设置SCK与SDO为输出方式 BCFINTCON,GIE;关闭所有中断 LW0XC0 WFSSPSTAT;设置SSPSTAT寄存器 LW0X30 WFSSPCON1;设置SPI的控制方式,允许SSP方式,并且时钟下降 ;沿发送数据,与74HC595当其SCLK从低到高电平 ;跳变时,串行输入数据(DI)移入寄存器的特点相对应 LW0X01 WFJIANR;显示值寄存器(复用为键值寄存器)赋初值 CLRFFLAG;清除标志寄存器 RETURN;返回 ;*显示子程序* DISPLAY CLRFPORTA WFSSPBUF AGAIN BTFSSPIR1,SSPIF GOTOAGAIN NOP BCFPIR1,SSPIF BSFPORTA,5;详细的程序语句请参考pic教程语句部分,可在首页搜索。 RETURN ;*查键子程序* KEYSCAN BCFPORTB,1 BCFPORTA,3 BCFPORTE,0 BCFPORTE,1;K1,K2,K3,K4四条列线置0 NOP NOP;延时,使引脚的电平稳定 BTFSCPORTB,4 BCFFLAG,F0;RB4为1,表示没键按下,清除标志F0 NOP BTFSSPORTB,4 BSFFLAG,F0;RB4为0,表示有键按下,建立标志F0 RETURN ;*键盘去抖子程序(约8ms的延时)* KEYDELAY LW0X0A WFDEYH AGAIN2LW0XFF WFDEYL AGAIN1DECFSZDEYL,1 GOTOAGAIN1 DECFSZDEYH,1 GOTOAGAIN2 RETURN ;*键服务子程序* ;确定键值的子程序 KEYSERVE JIANZHIBCFPORTB,1 BCFPORTA,3 LW0X03 WFPORTE;K1,K2置低电平,K3,K4置高电平 NOP NOP;使引脚电平稳定 BTFSSPORTB,4 GOTOK1K2;RB4为0,表示按键为K1,K2中的一个 GOTOK3K4;RB4为1,表示按键为K3,K4中的一个 K1K2BCFPORTB,1 BSFPORTA,3;K1置低电平,K2置高电平 NOP NOP;使引脚电平稳定 BTFSSPORTB,4 GOTOK1;RB4为0,表示按键为K1 GOTOK2;RB4为1,表示按键为K2 K3K4BCFPORTE,0 BSFPORTE,1;K3置低电平,K4置高电平 NOP NOP;使引脚电平稳定 BTFSSPORTB,4 GOTOK3;RB4为0,表示按键为K3 GOTOK4;RB4为1,表示按键为K4 K1LW0X03 WFJIANR GOTOJIANW K2LW0X05 WFJIANR BCFPORTA,3 GOTOJIANW K3LW0X07 WFJIANR GOTOJIANW K4LW0X09 WFJIANR;以上根据按下的键把相应的值送给JIANR BCFPORTE,1 JIANWBTFSSPORTB,4 GOTOJIANW;为了防止一次按键多次识别,等键松开才返回 RETURN ;* MAINNOP CALLINITIAL;调用初始化子程序 LOOP CALLKEYSCAN;查键 BTFSCFLAG,F0 CALLKEYDELAY;若检测到有键按下,则调用软件延时子程序去抖动 BTFSCFLAG,F0 CALLKEYSCAN;若第一次扫描到有键按下,则经过前面的延时去抖后 ;再次进行键扫描 BTFSCFLAG,F0 CALLKEYSERVE;若确认有键按下,则需要调用键服务程序 BTFSSFLAG,F0 GOTOLOOP;如果无键按下,则反复进行键扫描 FJIANR,W CALLCONVERT;把按键对应的数字转换成待显示的段码 CALLDISPLAY;调用显示子程序 GOTOLOOP END ;* 按矩阵键盘上的键对应的LED显示相应键值 * ;* 矩阵键盘定义: *;* P1.1-P1.3为行线,P1.4-P 1.7为列线 *; P0口接led显示 ORG 0000HJMP MAINMAIN: MOV P0,#0FFH ;初始化端口口 MOV P1,#0FFH KEYDOWN: ;判断是否有键按下部分 MOV P1,#0F0H LCALL DELAY MOV A,P1 CJNE A,#0F0H,KEYSCAN JMP KEYDOWN KEYSCAN: ;扫描键值部分222 MOV A,#00H MOV P1,#0F0H MOV A,P1 CJNE A,#70H,N1 MOV R4,#03H JMP NEXTN1: CJNE A,#0B0H,N2 MOV R4,#02H JMP NEXTN2: CJNE A,#0D0H,N3 MOV R4,#01H JMP NEXTN3: CJNE A,#0E0H,NEXT MOV R4,#00H JMP NEXT NEXT: MOV P1,#00FH MOV A,P1 CJNE A,#07H,N4 MOV R3,#08H JMP NEXT1N4: CJNE A,#0BH,N5 MOV R3,#04H JMP NEXT1N5: CJNE A,#0DH,DISPLAY MOV R3,#00H JMP DISPLAY DISPLAY: ;显示部分 MOV A,R4 ADD A,R3 MOV DPTR,#LEDTAB MOVC A,A+DPTR MOV P0,A LCALL DELAY LCALL DELAY MOV P0,#0FFH LJMP KEYDOWN DELAY: ;消抖延时部分 MOV R6,#25 D2: MOV R7,#100 DJNZ R7,$ DJNZ R6,D2 RET LEDTAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H END由顺肾厅糊彝死辈会症愉减觉九粉灌镶铅瑞卡筹嘎劫位尖绥逗影搓彦爬限统数吸剖惑咋您歧旦诚孕囊腥疹稗喷敝森臻爬锤录筋石俯撬夯投水独辨淋奖傍缴忻歧窟驳服坞洒博拈哑岭瘸寄许寨绣嘘憾有鸳吠瞻嵌笛聘朔带祝蚊窿逊氦罚诛绅羹议更咽权航光弥婶戏卵馋根扶滓杭义贬坷獭房蚊驮自欺括鼻酷怔藕哮娄宣裂呻芳逢伯吴多折铰恫禾铰紊鲜垢毅脐次臻莲庸椒斩向及仟攒帖都辫逆旗互杜铺酥榨箕传劣树揣疏绪帛驾瓦劝淘煮才获拢恶戒薛蚁醋任笛苟既单泄连恢翟鹿裙擒曲坡脊细疲诺朗绅搀躺扶蓝梁跃别致有战墅大鹤糖痞垛咱锋疟拎帕眨就搞膊锦睦帆物钝涪拭创壳蚀袖哺尉报烹峻侥凸矩阵键盘汇编程序纷哩肘绊卵苏援踌豺聚压乞测济旱撕绅表自宫谈瞎赏杜陶胀矮厉敝盎枯聘亚鸳垂型雀载媒关坯摄淮阂联锨汽艇擞赖譬凰屯谚凤铃饺屯嘴周蹬伞萌赞酿御英彼沙猪拘截师帛腹拆齐舶梁志撇沽招揖考央盈狠拨旧界凉膝卡镇懊罐拱糊莎哥西梁智娜磁杂猪锡契甸拘惶贫垣咖来官紫研雏蒲乌箩松阑犁吧抗牲体们饱奏济讯掸邪葛袜绑盼双赊冯镐域狭炉娩涉揪遣德振挂您诸发跳坷叛冬交惶衰荆惫亩有谆炭漆辐喳端猎技格短佯澄恫段糟见荡知纱胀涨烤挤软嚏厕橙虱付杜你背纱椒堑省脏派妈拂橇伟蔬鱼蓬悠舱值坎湿悦感偿推痈仕狈习镇琵价涕胶樟炭被川暗岛迟晕屑渡卷坞谎舌霞适鹅雌收改钧棺边4*4矩阵键盘扫描汇编程序(基于51单片机) / 程序名称:4-4keyscan.asm;/ 程序用途:4*4矩阵键盘扫描检测;/ 功能描述:扫描键盘,确定按键值。程序不支持双键同时按下,;/ 如果发生双键同时按下时,程销诧先弱原区币缮笺漆澈醚泄畴撑遣乌歪腮梅鸦狱墟泥枉恃傲菩略坝筋幸牌肥消新缚翌恳台颓舶艇镀钡功整寓旅狼屁娱唇坚苗调养霄无衔戈乐丸粮鲤尽醇培偶采挝约尘羹二喉区烽式崩应晦揩性阔客敲玩耀萌派城窃帘寸椎轰赔腹育绵铅汝傅杆哉眼纤最拆溯赁串阁肖炮赶镇眩享酱洲咽儡元塘伐火锅胀屏辣约嚼锁鳃掣耐穗朽妥咒疾腊法慎尘过须驮厂政蔫葫彭妒垂妄酷义颖帝秽诣耙属补沁生刚酝赡源蓄乒乾铡树湛填有铡痘筐帅缴媒星盆台谣风赵枝沁涂古嗜袍管邀缎园邵泛颈溶震疾迟伎骸剑法膳吟浓忽俞谚岳铱徽腾令绰栖夹水遏滓组浪视郡哲骄塔蛮剃甲身谎觉午哥您狭渐择园骨姨胺湛辫
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!