汇编矩阵键盘程序
4X4矩阵式键盘输入程序
4*4键盘程序readkeyboard:begin: acall key_onjnz delayajmp readkeyboarddelay:acall delay10msacall key_onjnz key_numajmp beginkey_num:acall key_panl a,#0FFhjz beginacall key_ccodepush akey_off:acall key_onjnz key_offpop aretkey_on: mov a,#00horl a,#0fhmov p1,amov a,p1orl a,#0f0hcpl aretkey_p: mov r7,#0efhl_loop:mov a,r7mov p1,amov a,p1orl a,#0f0hmov r6,acpl ajz nextajmp key_cnext: mov a,r7jnb acc.7,errorrl amov r7,aajmp l_looperror:mov a,#00hretkey_c:mov r2,#00hmov r3,#00hmov a,r6mov r5,#04hagain1:jnb acc.0,out1rr ainc r2djnz r5, again1out1: inc r2mov a,r7mov r5,#04hagain2:jnb acc.4,out2rr ainc r3djnz r5,again2out2: inc r3mov a, r2swap aadd a,r3retkey_ccode:push aswap aanl a,#0fhdec arl a ;行号乘4rl amov r7,apop aanl a,#0fhdec aadd a,r7retdelay10ms:anl tmod,#0f0horl tmod,#01hmov th0,#0d8hmov tl0,#0f0hsetb tr0wait:jbc tf0,overajmp waitclr tr0over:ret单片机键盘设计(二)从电路或软件的角度应解决的问题软件消抖:如果按键较多,硬件消抖将无法胜任,常采用软件消抖。
单片机矩阵键盘汇编语言程序
单片机矩阵键盘汇编语言程序(总6页)本页仅作为文档封面,使用时可以删除This document is for reference only-rar21year.March51单片机4*4矩阵键盘汇编语言程序示例(原创),欢迎咨询线反转法ORG 00HLJMP MAINMAIN:MOV R0,#00HMOV R1,#00HMOV R2,#00HMOV R3,#00HMOV A,#00HAJMP KEYSCANKEYSCAN:MOV P3,#0F0HMOV A,P3ANL A,#0F0HXRL A,#0F0HJNZ DELAYDELAY:MOV R2,#05HLOOP1:MOV R3,#0FAHLOOP2:DJNZ R3,LOOP2DJNZ R2,LOOP1MOV A,P3ANL A,#0F0HMOV R0,AXRL A,#0F0HJNZ KEYSCAN1LJMP KEYSCAN KEYSCAN1:MOV A,#00H MOV P3,#0FHMOV A,P3ANL A,#0FHMOV R1,AXRL A,#0FHJNZ NUMLJMP KEYSCANNUM:MOV A,R0MOV B,R1ORL A,BMOV DPTR,#TABSJMP DISP0DISP0:CJNE A,#0EEH,DISP1 MOV A,#00HMOVC A,@A+DPTRMOV P0,ALCALL DELAY1LJMP KEYSCANDISP1:CJNE A,#0EDH,DISP2 MOV A,#01HMOVC A,@A+DPTRMOV P0,ALCALL DELAY1LJMP KEYSCANDISP2:CJNE A,#0EBH,DISP3 MOV A,#02HMOVC A,@A+DPTRMOV P0,ALCALL DELAY1LJMP KEYSCANDISP3:CJNE A,#0E7H,DISP4 MOV A,#03HMOVC A,@A+DPTRMOV P0,ALCALL DELAY1LJMP KEYSCANDISP4:CJNE A,#0DEH,DISP5 MOV A,#04HMOVC A,@A+DPTRMOV P0,ALCALL DELAY1LJMP KEYSCANDISP5:CJNE A,#0DDH,DISP6 MOV A,#05HMOVC A,@A+DPTRMOV P0,ALCALL DELAY1LJMP KEYSCANDISP6:CJNE A,#0DBH,DISP7 MOV A,#06HMOVC A,@A+DPTRMOV P0,ALCALL DELAY1LJMP KEYSCANDISP7:CJNE A,#0D7H,DISP8 MOV A,#07HMOVC A,@A+DPTRMOV P0,ALCALL DELAY1LJMP KEYSCANDISP8:CJNE A,#0BEH,DISP9 MOV A,#08HMOVC A,@A+DPTRMOV P0,ALCALL DELAY1LJMP KEYSCANDISP9:CJNE A,#0BDH,DISPA MOV A,#09HMOVC A,@A+DPTRMOV P0,ALCALL DELAY1LJMP KEYSCANDISPA:CJNE A,#0BBH,DISPB MOV A,#0AHMOVC A,@A+DPTRMOV P0,ALCALL DELAY1LJMP KEYSCANDISPB:CJNE A,#0B7H,DISPC MOV A,#0BHMOVC A,@A+DPTRMOV P0,ALJMP KEYSCANDISPC:CJNE A,#07EH,DISPDMOV A,#0CHMOVC A,@A+DPTRMOV P0,ALCALL DELAY1LJMP KEYSCANDISPD:CJNE A,#07DH,DISPEMOV A,#0DHMOVC A,@A+DPTRMOV P0,ALCALL DELAY1LJMP KEYSCANDISPE:CJNE A,#07BH,DISPFMOV A,#0EHMOVC A,@A+DPTRMOV P0,ALCALL DELAY1LJMP KEYSCANDISPF:CJNE A,#077H,KEYMOV A,#0FHMOVC A,@A+DPTRMOV P0,ALCALL DELAY1LJMP KEYSCANDELAY1:MOV R2,#0FHLOOP10:MOV R3,#0FAHLOOP20:DJNZ R3,LOOP20DJNZ R2,LOOP10RETKEY:LJMP MAINTAB:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H END行扫描法ORG 00HLJMP MAINMAIN:LCALL KEYJUDGELCALL DISPLJMP MAIN KEYJUDGE:MOV P3,#0F0HMOV A,P3XRL A,#0F0HJNZ DELAYLJMP MAIN DELAY:MOV R4,#08H LOOP1:MOV R5,#0FAH LOOP2:DJNZ R5,LOOP2 DJNZ R4,LOOP1MOV P3,#0F0HMOV A,P3XRL A,#0F0HJZ MAINRETKEYSCAN:MOV R0,#00HMOV R1,#00HMOV R2,#0FEHMOV R3,#04H KEY:MOV P3,R2KEY0:JB ,KEY1MOV R1,#00HLJMP NUMKEY1:JB ,KEY2MOV R1,#04HLJMP NUMKEY2:JB ,KEY3MOV R1,#08HLJMP NUMKEY3:JB ,NEXTMOV R1,#0CHLJMP NUMNEXT:INC R0MOV A,R2RL AMOV R2,ADJNZ R3,KEYLJMP NUMNUM:MOV A,R0ADD A,R1MOV DPTR,#TABMOVC A,@A+DPTRMOV R6,ARETDISP:MOV P0,R6LCALL DELAY1RETDELAY1:MOV R4,#0FHLOOP10:MOV R5,#0FAHLOOP20:DJNZ R5,LOOP20DJNZ R4,LOOP10RETTAB:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H END。
51单片机4×4矩阵键盘且在数码管最后一位显示汇编语言
51下面是51单片机使用4×4矩阵键盘的汇编程序,并在数码管的最后一位显示一个字符:```ORG 0 ;程序从地址0开始MOV P1,#0FFH ;P1口设置为输入口MOV P0,#0FH ;P0口设置为输出口LOOP:MOV A,P1 ;读取P1口的值CJNE A,#0FFH,KEY_PRESSED ;判断是否有按键按下SJMP LOOP ;如果没有按键按下,继续循环KEY_PRESSED:MOV R0,A ;保存按键的值CLR P0.0 ;选定行0MOV A,P1ANL A,#0F0H ;按位与运算,保留列位的值CJNE A,#0F0H,COL0 ;判断是否有按键按下在第0列MOV A,#'0' ;如果在第0列按下按键,则A的值为0JMP DISP ;跳转到显示程序COL0:CLR P0.1 ;选定行1MOV A,P1ANL A,#0F0HCJNE A,#0E0H,COL1 ;判断是否有按键按下在第1列MOV A,#'1' ;如果在第1列按下按键,则A的值为1JMP DISP ;跳转到显示程序COL1:CLR P0.2 ;选定行2MOV A,P1ANL A,#0F0HCJNE A,#0D0H,COL2 ;判断是否有按键按下在第2列MOV A,#'2' ;如果在第2列按下按键,则A的值为2JMP DISP ;跳转到显示程序COL2:CLR P0.3 ;选定行3MOV A,P1ANL A,#0F0HCJNE A,#0B0H,COL3 ;判断是否有按键按下在第3列MOV A,#'3' ;如果在第3列按下按键,则A的值为3JMP DISP ;跳转到显示程序COL3:CLR P0.4 ;选定行4MOV A,P1ANL A,#0F0H4MOV A,#'4' ;如果在第4列按下按键,则A的值为4 JMP DISP ;跳转到显示程序COL4:CLR P0.5 ;选定行5MOV A,P1ANL A,#0F0HCJNE A,#0B0H,COL5 ;判断是否有按键按下在第5列 MOV A,#'5' ;如果在第5列按下按键,则A的值为5 JMP DISP ;跳转到显示程序COL5:CLR P0.6 ;选定行6MOV A,P1ANL A,#0F0HCJNE A,#0D0H,COL6 ;判断是否有按键按下在第6列 MOV A,#'6' ;如果在第6列按下按键,则A的值为6 JMP DISP ;跳转到显示程序COL6:CLR P0.7 ;选定行7MOV A,P1ANL A,#0F0HCJNE A,#0E0H,COL7 ;判断是否有按键按下在第7列 MOV A,#'7' ;如果在第7列按下按键,则A的值为7 JMP DISP ;跳转到显示程序COL7:MOV A,#00HJMP EXIT ;如果没有按下任何键,退出程序DISP: ;数码管显示程序MOV R1,#100B ;延时计数器初始化MOV P2,A ;把按键值存入P2口MOV A,#07HANL A,P0 ;从P0口读取选定的行值MOV P0,A ;根据选定的行值输出相应的值ACALL DELAY ;调用延时程序MOV P0,#0FH ;关闭所有行DJNZ R1,$ ;当延时计数器不为0时,继续延时MOV A,#0FHMOV P0,A ;清除所有显示JMP LOOP ;跳转回主程序EXIT:MOV P2.7,1 ;在数码管的最后一位显示字符1SJMP EXIT ;无限循环DELAY: ;延时程序MOV R2,#75DMOV R3,#200D DELAY3:DJNZ R3,$DJNZ R2,DELAY2 RET```。
矩阵键盘编程
矩阵键盘编程键盘结构与类型独立式按键键盘由若干独立式按键组成。
独立式按键指每个按键作为一位占用一根I/O口线,直接用I/O口线构成单个按键电路。
独立式按键键盘可分为中断方式和查询方式两种。
独立式按键键盘优点是配置灵活,软件结构简单,操作速度快;缺点是按键多时I/O口浪费较大,故只在按键数目不多时采用。
行列式键盘(矩阵式键盘)用I/O口线组成行、列结构,按键设置在行列的交点上。
在按键较多时可节省I/O口线,如4×8行列结构可构成32个键的键盘。
行列式键盘键输入过程及接口软件应解决的任务键开关状态的可靠输入主要应解决抖动问题。
对按键编码以便识别对按键编码,使不同的按键有不同的键值或键号。
按键状态的输入方式有中断方式与查询方式两种。
编制键盘程序检测有无按键按下、去抖动、按键信息的逻辑处理、输出确定的键号等。
行列式键盘(矩阵式键盘)及接口程序设计行列式键盘的结构及键值赋值方法键盘行线的一端经上拉电阻接+5v电源,另一端接单片机的输入口(因而各输入口均被钳位于高电平)。
各列线的一端接单片机的输出口,另一端悬空。
按键设置在行列线的交点上,行、列线分别连接到按键的两端,按键按下则相应交点的行列线接通。
由图可见,矩阵式键盘接口的设计思想是把键盘既作为输入设备又作为输出设备对待的。
为了让CPU能识别是哪个按键被按下,必须给每个按键都分配一个键号(一般以十进制数表示)。
例如,4×4列矩阵式键盘共16个按键,键号依次按顺序排列为0~15。
对行列式键盘的每个按键,还有一个更重要的概念:键值或者说键码。
键值是一个可表征按键状态的8位数据,不同的按键有不同的键值。
按键后根据键值便能转到相应的键处理子程序,实现键盘的数据输入功能或命令处理功能。
同一个按键的键值和键号可以相同,也可以不相同,这主要取决于键盘的结构与采用的编码方法。
对行列式键盘来说,识别被按键的位置也就是找出被按键所在行和列的坐标值。
对于4行×4列行列式键盘,被按键所在行和列的坐标值为两个4位数据;而对于8行×8列行列式键盘,则为两个8位数据。
汇编实验之矩阵 键盘
计算机原理实验室实验报告课程名称:姓名学号班级成绩设备名称及软件环境实验名称矩阵键盘实验日期一.实验内容掌握4×4矩阵式键盘程序识别原理及4×4矩阵式键盘按键的设计方法。
二.理论分析或算法分析用单片机的并行口P3连接4×4矩阵键盘,并以单片机的P3.0-P3.3各管脚作输入线,以单片机的P3.4-P3.7各管脚作输出线,在数码管上显示每个按键“0-F”的序号。
4×4矩阵式键盘识别电路原理图:键盘中对应按键的序号排列:电路硬件说明(1)在“单片机系统”区域中,把单片机的P3.0-P3.7端口通过8联拨动拨码开关JP3连接到“4×4行列式键盘”区域中的M1-M4,N1-N4端口上。
(2)在“单片机系统”区域中,把单片机的P0.0-P0.7端口连接到“静态数码显示模块”区域中的任何一个a-h端口上;要求:P0.0对应着a,P0.1对应着b,……,P0.7对应着h。
三.实现方法(含实现思路、程序流程图、实验电路图和源程序列表等)1、4×4矩阵键盘识别处理。
2、每个按键都有它的行值和列值,行值和列值的组合就是识别这个按键的编码。
矩阵的行线和列线分别通过两并行接口和CPU通信。
键盘的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。
键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么?还要消除按键在闭合或断开时的抖动。
两个并行口中,一个输出扫描码,使按键逐行动态接地;另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。
3、程序流程图:4、汇编源程序:;;;;;;;;;;定义单元;;;;;;;;;;COUNT EQU 30H;;;;;;;;;;入口地址;;;;;;;;;;ORG 0000HLJMP STARTORG 0003HRETIORG 000BHRETIORG 0013HRETIORG 001BHRETIORG 0023HRETIORG 002BHRETI;;;;;;;;;;主程序入口;;;;;;;;;;ORG 0100H START: LCALL CHUSHIHUALCALL PANDUANLCALL XIANSHILJMP START ;;;;;;;;;;初始化程序;;;;;;;;;;CHUSHIHUA: MOV COUNT,#00HRET;;;;;;;;;;判断哪个按键按下程序;;;;;;;;;;PANDUAN: MOV P3,#0FFHCLR P3.4MOV A,P3ANL A,#0FHXRL A,#0FHJZ SW1LCALL DELAY10MSJZ SW1MOV A,P3ANL A,#0FHCJNE A,#0EH,K1MOV COUNT,#0LJMP DKK1: CJNE A,#0DH,K2MOV COUNT,#4LJMP DKK2: CJNE A,#0BH,K3MOV COUNT,#12 K4: NOPLJMP DKSW1: MOV P3,#0FFHCLR P3.5MOV A,P3ANL A,#0FHXRL A,#0FHJZ SW2LCALL DELAY10MS JZ SW2MOV A,P3ANL A,#0FHCJNE A,#0EH,K5 MOV COUNT,#1 LJMP DKK5: CJNE A,#0DH,K6MOV COUNT,#5 LJMP DKK6: CJNE A,#0BH,K7MOV COUNT,#9 LJMP DKK7: CJNE A,#07H,K8MOV COUNT,#13 K8: NOPLJMP DKSW2: MOV P3,#0FFHCLR P3.6MOV A,P3ANL A,#0FHXRL A,#0FHJZ SW3LCALL DELAY10MS JZ SW3MOV A,P3ANL A,#0FHCJNE A,#0EH,K9 MOV COUNT,#2 LJMP DKK9: CJNE A,#0DH,KAMOV COUNT,#6 LJMP DKKA: CJNE A,#0BH,KBMOV COUNT,#14 KC: NOPLJMP DKSW3: MOV P3,#0FFHCLR P3.7MOV A,P3ANL A,#0FHXRL A,#0FHJZ SW4LCALL DELAY10MS JZ SW4MOV A,P3ANL A,#0FHCJNE A,#0EH,KD MOV COUNT,#3LJMP DKKD: CJNE A,#0DH,KEMOV COUNT,#7LJMP DKKE: CJNE A,#0BH,KFMOV COUNT,#11 LJMP DKKF: CJNE A,#07H,KGMOV COUNT,#15 KG: NOPLJMP DKSW4: LJMP PANDUANDK: RET;;;;;;;;;;显示程序;;;;;;;;;;XIANSHI: MOV A,COUNTMOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,ALCALL DELAYSK: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ SKRET;;;;;;;;;;10ms延时程序;;;;;;;;;;DELAY10MS: MOV R6,#20D1: MOV R7,#248DJNZ R6,D1RET;;;;;;;;;;200ms延时程序;;;;;;;;;;DELAY: MOV R5,#20LOOP: LCALL DELAY10MSDJNZ R5,LOOPRET;;;;;;;;;;共阴码表;;;;;;;;;;TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07HDB 7FH,6FH,77H,7CH,39H,5EH,79H,71H;;;;;;;;;;结束标志;;;;;;;;;;END八、C语言源程序#include<AT89X51.H>unsigned char code table[]={0x3f,0x66,0x7f,0x39,0x06,0x6d,0x6f,0x5e,0x5b,0x7d,0x77,0x79,0x4f,0x07,0x7c,0x71};void main(void){ unsigned char i,j,k,key;while(1){ P3=0xff; //给P3口置1//P3_4=0; //给P3.4这条线送入0//i=P3;i=i&0x0f; //屏蔽低四位//if(i!=0x0f) //看是否有按键按下//{ for(j=50;j>0;j--) //延时//for(k=200;k>0;k--);if(i!=0x0f) //再次判断按键是否按下//{ switch(i) //看是和P3.4相连的四个按键中的哪个// { case 0x0e:key=0;break;case 0x0d:key=1;break;case 0x0b:key=2;break;case 0x07:key=3;break;}P0=table[key]; //送数到P0口显示//}P3=0xff;P3_5=0; //读P3.5这条线//i=P3;i=i&0x0f; //屏蔽P3口的低四位//if(i!=0x0f) //读P3.5这条线上看是否有按键按下// { for(j=50;j>0;j--) //延时//for(k=200;k>0;k--);i=P3; //再看是否有按键真的按下//i=i&0x0f;if(i!=0x0f){ switch(i) //如果有,显示相应的按键//{ case 0x0e:key=4;break;case 0x0d:key=5;break;case 0x0b:key=6;break;case 0x07:key=7;break;}P0=table[key]; //送入P0口显示//}}P3=0xff;P3_6=0; //读P3.6这条线上是否有按键按下// i=P3;i=i&0x0f;if(i!=0x0f){ for(j=50;j>0;j--)for(k=200;k>0;k--);i=P3;i=i&0x0f;if(i!=0x0f){ switch(i){ case 0x0e:key=8;break;case 0x0d:key=9;break;case 0x0b:break;case 0x07:key=11;break;}P0=table[key];}}P3=0xff;P3_7=0; //读P3.7这条线上是否有按键按下// i=P3;i=i&0x0f;if(i!=0x0f){ for(j=50;j>0;j--)for(k=200;k>0;k--);i=P3;i=i&0x0f;if(i!=0x0f){ switch(i){ case 0x0e:key=12;break;case 0x0d:key=13;break;case 0x0b:key=14;break;case 0x07:key=15;break;}P0=table[key];}}}}四.实验结果分析(含执行结果验证、输出显示信息、图形、调试过程中所遇的问题及处理方法等)五.结论报告提交日期(注意:内容写不下时允许表格添加新行。
矩阵键盘程序及原理
程序效果:按下任意键,LED显示P0读回的数据其中4*4的矩阵键盘接P0口*/#incl ude<r eg52.h> //头文件u nsign ed ch ar ke y=0xf f; //定义一个变量用于存放按键值void read key(); //读按键子函数,获取键值vo id ma in() //主函数{whil e(1){ readk ey(); //读按键值if(key!=0xff) //判断是否有按键按下P2=~ke y;//这里取反:是因为LED为共阴,显示所按下的值}}v oid r eadke y() //读键盘子函数{P0=0x fe; //将第一列拉低,扫描是否有按键按下,第一列键值为:0,4,8,C ke y=P0; //读取键盘值if(ke y!=0x fe) //若key!=0xf e,说明有按键按下,则返回r eturn; //否则继续扫描下一列P0=0xfd;key=P0;i f(key!=0xf d)re turn;P0=0xfb;key=P0;if(key!=0xfb)ret urn;P0=0x f7;k ey=P0;if(key!=0xf7)retu rn;k ey=0x ff;}键盘扫描程序:从以上分析得到键盘扫描程序的流程图所示。
程序如下SCAN: MOVP1,#0FHMOVA,P1AN L A,#0FH CJN E A,#0FH,N EXT1SJ MP NE XT3 NEX T1: A CALLD20MSM OV A,#0EFHN EXT2: MOVR1,AMO V P1,AMOV A,P1 ANL A,#0FHCJNE A,#0FH,KC ODE;MO V A,R1SETBCRLC AJ C NEX T2NEXT3: MO V R0,#00HRE TKCODE: MOV B,#0FBH NEX T4: R RC AIN C B JCNEXT4M OV A,R1SWAP ANEXT5: RR C A INC BINCBINC BI NC BJC NEXT5NEXT6: MOV A,P1A NL A,#0FHCJ NE A,#0FH,NEXT6M OV R0,#0FF HRET <2>确定矩阵式键盘上何键被按下介绍一种“高低电平翻转法”。
矩阵键盘程序
#include <reg52.h>#define uchar unsigned char#define uint unsigned intuchar num,num1,temp;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; sbit dua=P2^6;sbit wei=P2^7;void delay(uint z){uint x,y;for(x=20;x>0;x--)for(y=z;y>0;y--);}uchar keyscan();void display(uchar num);void main(){num=16;wei=1;P0=0;wei=0;dua=1;P0=0xc0;wei=0;while(1){display(keyscan());}}void display(uchar num){dua=1;P0=table[num];dua=0;}uchar keyscan(){P3=0xfe;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xee:num=0;break;case 0xde:num=1;break;case 0xbe:num=2;break;case 0x7e:num=3;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xfd;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xed:num=4;break;case 0xdd:num=5;break;case 0xbd:num=6;break;case 0x7d:num=7;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xfb;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xeb:num=8;break;case 0xdb:num=9;break;case 0xbb:num=10;break;case 0x7b:num=11;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xf7;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xe7:num=12;break;case 0xd7:num=13;break;case 0xb7:num=14;break;case 0x77:num=15;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}return num;}。
汇编矩阵键盘程序
方法一、ORG 0000HLJMP MAINORG 0100HMAIN:MOV P1,#0F0H //P1口设初值F0,矩阵按键高四位置1,低四位置0,JNB P1.4,Y0 //用JNB检测按键端口,P1.4口低电平跳转 Y0JNB P1.5,Y1JNB P1.6,Y2JNB P1.7,Y3SJMP MAINY0:MOV 30H,#00HMOV P1,#0EFHJNB P1.4,X0MOV P1,#0DFHJNB P1.4,X1MOV P1,#0BFHJNB P1.4,X2MOV P1,#07FHJNB P1.4,X3Y1:MOV 30H,#01HMOV P1,#0EFHJNB P1.0,X0MOV P1,#0DFHJNB P1.1,X1MOV P1,#0BFHJNB P1.2,X2MOV P1,#7FHJNB P1.3,X3Y2:MOV 30H,#02HMOV P1,#0EFHJNB P1.0,X0MOV P1,#0DFHJNB P1.1,X1MOV P1,#0BFHJNB P1.2,X2MOV P1,#7FHJNB P1.3,X3Y3:MOV 30H,#03HMOV P1,#0EFHMOV P1,#0DFHJNB P1.1,X1MOV P1,#0BFHJNB P1.2,X2MOV P1,#7FHJNB P1.3,X3X0:MOV 31H,#00HACALL DELAYMOV P1,#0F0HLJMP JISUANX1:MOV 31H,#01HACALL DELAYMOV P1,#0F0HLJMP JISUANX2:MOV 31H,#02HACALL DELAYMOV P1,#0F0HLJMP JISUANX3:MOV 31H,#03HACALL DELAYMOV P1,#0F0HLJMP JISUAN JISUAN:MOV A,31HMOV B,#04HMUL ABADD A,30HMOV DPTR,#TABMOVC A,@A+DPTRMOV P0,ACC:MOV A,P1ANL A,#0F0HXRL A,#0F0HJNZ CCLCALL MAIN DELAY: MOV R4,#0C5HD1: MOV R5,#43HD0: MOV R6,#10HDJNZ R5,D0DJNZ R4,D1RETTAB: DB 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07 DB 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71方法二、ORG 0000HLJMP STARTKEYSBUF EQU 30HORG 0100HSTART:MOV P1,#0F0HMOV A,P1ANL A,#0F0HXRL A,#0F0HJZ STARTLCALL DELAYMOV P1,#0F0HMOV A,P1ANL A,#0F0HXRL A,#0F0HJZ STARTMOV P1,#0FEH //第0行置0CLR P1.0MOV A,P1ANL A,#0F0H //与逻辑,高位保留CJNE A,#0E0H,K1 //高四位为1110,数字0亮MOV KEYSBUF,#0LJMP DISPLAYK1: CJNE A,#0D0H,K2 // 高四位为1101,数字1亮MOV KEYSBUF,#1LJMP DISPLAYK2: CJNE A,#0B0H,K3// 高四位为1011,数字2亮MOV KEYSBUF,#2LJMP DISPLAYK3: CJNE A,#070H,K4 //高四位为0111,数字3亮MOV KEYSBUF,#3LJMP DISPLAYK4: MOV P1,#0FDH //第1行置0MOV A,P1ANL A,#0F0HCJNE A,#0E0H,K5 //高四位为1110,数字4亮MOV KEYSBUF,#4LJMP DISPLAYK5: CJNE A,#0D0H,K6 // 高四位为1101,数字5亮MOV KEYSBUF,#5LJMP DISPLAYK6: CJNE A,#0B0H,K7// 高四位为1011,数字6亮MOV KEYSBUF,#6LJMP DISPLAYK7: CJNE A,#070H,K8 //高四位为0111,数字7亮MOV KEYSBUF,#7LJMP DISPLAYK8: MOV P1,#0FBH //第2行置0MOV A,P1ANL A,#0F0HCJNE A,#0E0H,K9 //高四位为1110,数字8亮MOV KEYSBUF,#8LJMP DISPLAYK9: CJNE A,#0D0H,K10 // 高四位为1101,数字9亮MOV KEYSBUF,#9LJMP DISPLAYK10: CJNE A,#0B0H,K11// 高四位为1011,数字A亮MOV KEYSBUF,#10LJMP DISPLAYK11: CJNE A,#070H,K12 //高四位为0111,数字B亮MOV KEYSBUF,#11LJMP DISPLAYK12: MOV P1,#0F7H //第3行置0MOV A,P1ANL A,#0F0HCJNE A,#0E0H,K13 //高四位为1110,数字C亮MOV KEYSBUF,#12LJMP DISPLAYK13: CJNE A,#0D0H,K14 // 高四位为1101,数字D亮MOV KEYSBUF,#13LJMP DISPLAYK14: CJNE A,#0B0H,K15// 高四位为1011,数字E亮MOV KEYSBUF,#14LJMP DISPLAYK15:MOV KEYSBUF,#15 //高四位为0111,数字F亮LJMP DISPLAYDISPlAY:MOV DPTR,#TABMOV A,KEYSBUFMOVC A,@A+DPTRMOV P0,ACC: MOV A,P1ANL A,#0F0HXRL A,#0F0HJNZ CCLJMP STARTDELAY:MOV R6,#10D1:MOV R7,#248D2:DJNZ R7,D2DJNZ R6,D1RETTAB:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H DB 7FH,6FH,77H,7CH,39H,5EH,79H,71HEND。
矩阵键盘程序设计
矩阵键盘程序设计正文:1·引言矩阵键盘是一种常见的输入设备,常用于电子设备中,如计算器、电子字典、方式等。
本文档将介绍矩阵键盘的程序设计,包括键盘接口的设计、按键扫描的原理、按键事件的处理等方面的内容。
通过阅读本文档,读者将能够了解如何设计和实现一个矩阵键盘程序,并能够应用于各种电子设备中。
2·键盘接口设计2·1·硬件接口矩阵键盘通常采用行列编码方式进行连接。
具体接口设计需要考虑键盘的行列数目、接口类型、电压电流等因素,并根据具体需求进行设计。
2·2·软件接口在程序设计中,需要定义键盘接口的相关参数,包括行数、列数、引脚连接方式、行列位置等。
通过定义这些参数,可以方便地在程序中对键盘进行扫描和响应。
3·按键扫描原理3·1·按键矩阵矩阵键盘由多个按键组成,按键排列成N行M列的矩阵形式。
按键按下时,对应行列交叉点的电压发生变化,可以通过扫描行列电平的方式来检测按键的状态。
3·2·扫描方法按键扫描方法包括轮询扫描和中断扫描两种方式。
轮询扫描是通过循环扫描键盘的每个按键并检测按键状态,适用于实时性要求不高的场合。
中断扫描是通过中断信号来触发扫描和检测按键状态,适用于实时性要求高的场合。
4·按键事件处理4·1·按键状态检测通过扫描键盘可以获取每个按键的状态,一般分为按下和释放两种状态。
可以通过读取按键状态来判断是否有按键被触发。
4·2·按键事件处理当按键被触发时,需要进行相应的事件处理。
事件处理可以包括响应特定按键的功能、发送键值给其他模块等操作。
根据具体需求,可以采用不同的事件处理方式。
5·附件本文档的附件包括键盘接口设计图、示例代码和相关参考资料。
读者可以通过附件来深入了解和实践矩阵键盘的程序设计。
6·法律名词及注释本文档中所涉及的法律名词及注释如下:●版权:指对作品享有的复制、发行、展览、表演、放映、广播、信息网络传播、摄制、改编、翻译、编译等权利。
机电单片机课程设计 4乘4矩阵键盘 汇编语言
目录1 引言 (2)2 4×4矩阵键盘控制LED工作原理及软硬件设计、仿真调试 (2)2.1 4×4矩阵式键盘识别显示系统概述 (2)2.2 4×4矩阵式键盘原理 (3)2.3 4×4矩阵式键盘控制LED显示方法 (3)2.4 电路设计及电路图 (3)2.5 4×4矩阵式键盘软件编程 (5)2.6 4×4矩阵式键盘软件仿真调试分析 (8)3 结论 (9)4参考文献 (9)1 引言随着现代科技日新月异的发展,作为新兴产业,单片机的应用越来越广。
单片机以其体积小、重量轻、功能强大、功耗低等特点而备受青睐。
键盘作为一种最为普遍的输入工具在单片机项目应用上显得尤为重要。
用MCS51系列的单片机并行口P1接4×4矩阵键盘,以P1.0-P1.3 作输入线,以P1.4-P1.7作输出线;在数码管上显示每个按键的0-F序号。
2 4×4矩阵键盘控制LED工作原理及软硬件设计、仿真调试2.1 4×4矩阵式键盘识别显示系统概述矩阵式键盘模式以4个端口连接控制4*4个按键,实时在LED数码管上显示按键信息。
显示按键信息,省下了很多的I/O端口为他用,相反,独立式按键虽编程简单,但占用I/O口资源较多,不适合在按键较多的场合应用。
矩阵式键盘简介:矩阵式键盘又称行列键盘,它是用4条I/O线作为行线,4条I/O线作为列线组成的键盘。
在行线和列线的每个交叉点上设置一个按键。
这样键盘上按键的个数就为4*4个。
这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率。
最常见的键盘布局如图1所示。
一般由16个按键组成,在单片机中正好可以用一个P 口实现16个按键功能,这也是在单片机系统中最常用的形式,本设计就采用这个键盘模式。
2.2 4×4矩阵式键盘原理在占用相同的I/O端口的情况下,行列式键盘的接法会比独立式接法允许的按键数量多。
矩阵键盘程序设计
矩阵键盘程序设计1.引言矩阵键盘是一种常见的输入设备,常用于电子设备、计算机和通信设备等系统中。
它具有结构简单、体积小、成本低廉等特点,因此在各种嵌入式系统中被广泛应用。
本文将介绍矩阵键盘的程序设计方法,包括按键扫描、数据解析以及与其他模块的交互等内容。
2.基本原理矩阵键盘由若干行和列的按键组成,每个按键连接到一个特定的电路。
当按键被按下时,会导通相应的行和列,形成一个矩阵。
通过逐次扫描每一行和列,可以检测到按键的按下情况。
矩阵键盘的基本原理是利用行列扫描来判断按键的输入状态。
3.按键扫描3.1 行扫描行扫描是矩阵键盘程序设计的重要步骤之一。
首先,将行的控制线置为高电平,并将列的控制线置为输入状态。
然后,逐个扫描每一行,检测列的输入状态。
如果某个列的输入状态发生变化,说明对应的按键被按下或释放。
3.2 列扫描列扫描是行扫描的补充,用来检测行的输入状态。
首先,将列的控制线置为高电平,并将行的控制线置为输入状态。
然后,逐个扫描每一列,检测行的输入状态。
如果某个行的输入状态发生变化,说明对应的按键被按下或释放。
4.数据解析在按键扫描的基础上,还需要进行数据解析以获取具体的按键值。
具体的解析方法可以根据矩阵键盘的布局和按键的位置进行设计。
一般来说,可以借助查找表或者简单的算法来实现。
5.与其他模块的交互矩阵键盘通常需要与其他模块进行交互,以实现特定的功能。
例如,可以通过串口与MCU或者计算机进行数据交互,实现键盘输入的数据传输。
同时,还可以通过中断或者定时器来实现按键的实时响应。
6.附件本文档涉及的附件包括示例代码、电路图、原理图等。
详细的附件内容请参考附件部分。
附件1: 示例代码附件2: 电路图附件3: 原理图7.法律名词及注释7.1 版权:指作品的作者或合法权利人对其创作的作品享有的专有权利,包括复制、发行、表演、展示等权利。
7.2 专利:指对于新的技术、新的产品或者新的设计提出的独占权,目的是保护创新者的权益。
8086矩阵键盘显示
1. 实验要求利用可编程并行接口芯片 8255A 设计一个键盘与 LED 显示器接口。
1)系统设置一个 4 行×4 列的行/ 列扫描式键盘和一个 8 位的共阴极七段数码管2)键盘提供 0~F 这 16 个十六进制数字键,采用行/列扫描式接口,数码管采用动态扫描的方式;3)编写程序,将键盘键入的数字,采用左移的方式显示在数码管上;4)按下 C 键清除所有显示内容。
2. 实验目的1)熟练掌握 8086 汇编语言程序设计以及可编程接口芯片应用技术;2)掌握 Proteus 仿真软件的基本操作与调试功能;3)掌握基于 Proteus 的 8086 应用系统软硬件设计与调试方法与步骤,并完成仿真实验3. 实验分析本实验可具体分解为三大部分,分别是扫描式矩阵键盘的实现,左移数码管的实现以及清零键的实现。
扫描式矩阵键盘的原理如下:设定行线输出,列线输入,行线逐行输出0,如果某列有按键,则列线输入为 0;若无按键,列线输入全为 1。
在本实验中,我们将 8255A 的 C 口单元作为负责扫描式键盘的端口。
在代码的编程上,我们让 C 口的低四位输出全为 0,高四位输入检查是否有 0从而判断是否有按键按下,该段语句通过 loop 语句完成循环进行重复检查按键的按下情况。
假如有按键按下,则通过逐行扫描的形式获取按下按键的行数以及列数,再通过该行数与该列数形成的坐标信息得出是哪个按键按下。
左移数码管的实现需要两个子功能:第一个功能是要输出键盘对应的数字,第二个功能是要实现数字的左移功能。
本实验中,我们将 8255A的 A 口负责键盘对应字形码的输出, B 口负责对应位码的输出。
首先,在获取键盘按下的坐标后,我们在对应的表格中得到要输出的字形码。
接着字形码入栈和出栈的操作以及指针sp 的操作实现对应码数和字型码的输出,也就成功实现了左移功能。
程序中必须设定延时以防止两个数同时显示。
清零键的设定实现的是按下清零键消除数码管中所有显示数字的功能。
矩阵键盘程序(汇编+lcd显示)
; p0接lcd; p2接矩阵键盘rs equ p1.5 ;确定具体硬件的连接方式rw equ p1.6 ;确定具体硬件的连接方式e equ p1.7 ;lcd1602引脚org 0hmain:acall startmov p0,#8fh ;写入显示起始地址(第一行第一个位置)acall enable ;调用写入命令子程序mov r0,#2fhmov 2fh,#30hmov r6,#1acall write1d: mov 56h,#0mov r1,#50hmov 54h,#2fhtest: ;键盘扫描mov p2,#0f0hmov a,p2cjne a,#0f0h,havesjmp testhave:mov a,#0fehnext:mov b,amov p2,aread:mov a,p2anl a,#0F0hcjne a,#0F0h,scondmov a,brl acjne a,#0efh,nextscond:acall daymov a,p2anl a,#0f0hcjne a,#0f0h,jssjmp testjs:mov r2,amov a,banl a,#0fhorl a,r2ajmp mains1: cjne a,#0d7h,s4mov b,#31h ;1的ACSII值为31Hajmp yzs4: cjne a,#0b7h,s7mov b,#34hajmp yzs7: cjne a,#77h,s0mov b,#37hajmp yzs0: cjne a,#0ebh,s2mov b,#30hajmp yzs2: cjne a,#0dbh,s5mov b,#32hajmp yzs5: cjne a,#0bbh,s8mov b,#35hajmp yzs8: cjne a,#7bh,s3mov b,#38hajmp yzs3: cjne a,#0ddh,s6mov b,#33hajmp yzs6: cjne a,#0bdh,s9mov b,#36hajmp yzs9: cjne a,#7dh,testmov b,#39hajmp yzyz:mov a,56hcjne a,#0,yz1sjmp yz2yz1:cjne @r1,#10,yz2ajmp testyz2:cjne r1,#50h,yz3mov 55h,#0mov 58h,#0mov a,56hmov 56h,#1mov 50h,#0mov r0,#20hyz3:cjne @r1,#1,yz4mov r0,54hcjne @r0,#30h,yz4mov @r0,#0mov @r1,#0yz4:mov r2,#8yz5:mov a,54hsubb a,r2mov r0,amov a,@r0dec r0mov @r0,adec r2inc r0mov a,r0cjne a,54h,yz5mov r0,54hmov @r0,bacall showajmp testshow:acall startmov a,#8fhsubb a,@r1mov p0,a ;写入显示起始地址(第一行第一个位置)acall enable ;调用写入命令子程序mov a,54hsubb a,@r1mov r0,ainc @r1mov a,@r1mov r6,aacall write1ret;lcd1602部分start:mov p0,#1h ;清屏并光标复位acall enable ;调用写入命令子程序mov p0,#8h ;设置显示模式:8位2行5x7点阵acall enable ;调用写入命令子程序mov p0,#0ch ;显示器开、光标关acall enable ;调用写入命令子程序mov p0,#6h ;文字不动,光标自动右移acall enable ;调用写入命令子程序retenable:clr rs ;写入控制命令的子程序clr rwclr eacall delaysetb eretwrite1:mov a,@r0lcall write2 ;调用写入数据寄存器子程序inc r0 ;取码指针加1djnz r6,write1retwrite2:mov p0,asetb rs ;rs=1clr rw ;rw=0准备写入数据clr e ;e=0执行显示命令acall delay ;判断液晶模块是否忙?(用延时代替) setb e ;e=1retdelay:mov r2,#2fhdl1:mov r3,#0fhdjnz r3,$djnz r2,dl1retday:mov r2,#100 ;按键延时0.1sdl3:mov r3,#250dl2:nopnopdjnz r3,dl2djnz r2,dl3retend。
矩阵键盘源程序(详细)
}
//延时子程序
//12MHz晶振,AT89S52 : 1ms
//测试结果:n=1, 1.015ms; n=10, 10.006ms;
void delay(unsigint i,j;
for(i=0;i<n;i++)
{
for(j=0;j<123;j++)
//NumBuffer[3]=(((KEY_PORT & 0xF0)^0xF0)>>4);
NumBuffer[2]=(((KEY_PORT & 0xF0))>>4);
switch(keycode)
{
case 0x7E: keycode=0; break;
case 0xBE: keycode=1; break;
{
case 0: //有按键按下吗?
if(keypad_0==keypad_0_DOWN)
{
mKey0SwapTask=1;
mKey0Value=kbdKeyRead(); //读键值
}
break;
case 0xDE: keycode=2; break;
case 0xEE: keycode=3; break;
case 0x7D: keycode=4; break;
case 0xBD: keycode=5; break;
case 0xDD: keycode=6; break;
NumDisplayIndex=0;
}
}
//按键矩阵扫描子程序
void kbdScan(void)
{
#define keypad_0 kbdIsKeyDown() //定义端口
矩阵键盘程序设计
矩阵键盘程序设计矩阵键盘程序设计引言矩阵键盘是一种常见的输入设备,它通常由多个按键组成,以矩阵的形式排列。
在程序设计中,需要对矩阵键盘进行读取和处理,以实现按键的功能。
本文将介绍如何进行矩阵键盘程序设计。
硬件结构矩阵键盘通常由多个按键和矩阵引脚组成。
按键按下时,相应的矩阵引脚会与对应的行和列接通,通过扫描行和列的方式来读取按键的状态。
矩阵键盘的硬件结构需要在程序设计中进行考虑。
程序设计初始化在进行矩阵键盘程序设计之前,我们首先需要对矩阵键盘进行初始化。
初始化的过程包括设置引脚的输入输出模式,设置引脚的上拉或下拉电阻等。
扫描按键矩阵键盘的按键扫描是矩阵键盘程序设计的核心部分。
一般来说,通过扫描行和列的方式可以实现对按键的读取。
具体的扫描流程如下:1. 将所有的行设置为输出模式,所有的列设置为输入模式。
2. 将所有的行置为高电平,所有的列置为低电平。
3. 逐行扫描按键,如果某一行的列引脚为低电平,则表示对应的按键按下。
4. 返回按键的状态。
处理按键在获取按键的状态后,我们可以根据需要对按键进行相应的处理。
处理按键的方式可以有很多种,例如触发事件、执行操作等。
根据实际需求,选择适合的方式进行处理。
循环扫描在实际应用中,矩阵键盘的扫描通常需要以循环的方式进行。
通过不断地扫描矩阵键盘的状态,可以及时获取按键的信息,并进行相应的处理。
循环扫描的方式可以保证按键的响应速度。
示例代码pythonimport RPi.GPIO as GPIO定义行和列的引脚row_pins = [11, 13, 15, 17]col_pins = [19, 21, 23, 25]初始化GPIOGPIO.setmode(GPIO.BOARD)设置引脚的输入输出模式GPIO.setup(row_pins, GPIO.OUT)GPIO.setup(col_pins, GPIO.IN)扫描按键def scan_keyboard():for row in row_pins:将当前行置为高电平GPIO.output(row, GPIO.HIGH)逐列扫描for col in col_pins:如果某一列为低电平,表示按键按下if GPIO.input(col) == GPIO.LOW:返回按键的状态return (row, col)将当前行置为低电平GPIO.output(row, GPIO.LOW)处理按键def process_key(row, col):根据行和列的值,进行相应的处理操作print(\。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
方法一、
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN:
MOV P1,#0F0H //P1口设初值F0,矩阵按键高四位置1,低四位置0,
JNB P1.4,Y0 //用JNB检测按键端口,P1.4口低电平跳转 Y0
JNB P1.5,Y1
JNB P1.6,Y2
JNB P1.7,Y3
SJMP MAIN
Y0:
MOV 30H,#00H
MOV P1,#0EFH
JNB P1.4,X0
MOV P1,#0DFH
JNB P1.4,X1
MOV P1,#0BFH
JNB P1.4,X2
MOV P1,#07FH
JNB P1.4,X3
Y1:
MOV 30H,#01H
MOV P1,#0EFH
JNB P1.0,X0
MOV P1,#0DFH
JNB P1.1,X1
MOV P1,#0BFH
JNB P1.2,X2
MOV P1,#7FH
JNB P1.3,X3
Y2:
MOV 30H,#02H
MOV P1,#0EFH
JNB P1.0,X0
MOV P1,#0DFH
JNB P1.1,X1
MOV P1,#0BFH
JNB P1.2,X2
MOV P1,#7FH
JNB P1.3,X3
Y3:
MOV 30H,#03H
MOV P1,#0EFH
MOV P1,#0DFH
JNB P1.1,X1
MOV P1,#0BFH
JNB P1.2,X2
MOV P1,#7FH
JNB P1.3,X3
X0:
MOV 31H,#00H
ACALL DELAY
MOV P1,#0F0H
LJMP JISUAN
X1:
MOV 31H,#01H
ACALL DELAY
MOV P1,#0F0H
LJMP JISUAN
X2:
MOV 31H,#02H
ACALL DELAY
MOV P1,#0F0H
LJMP JISUAN
X3:
MOV 31H,#03H
ACALL DELAY
MOV P1,#0F0H
LJMP JISUAN JISUAN:
MOV A,31H
MOV B,#04H
MUL AB
ADD A,30H
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
CC:
MOV A,P1
ANL A,#0F0H
XRL A,#0F0H
JNZ CC
LCALL MAIN DELAY: MOV R4,#0C5H
D1: MOV R5,#43H
D0: MOV R6,#10H
DJNZ R5,D0
DJNZ R4,D1
RET
TAB: DB 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07 DB 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
方法二、
ORG 0000H
LJMP START
KEYSBUF EQU 30H
ORG 0100H
START:MOV P1,#0F0H
MOV A,P1
ANL A,#0F0H
XRL A,#0F0H
JZ START
LCALL DELAY
MOV P1,#0F0H
MOV A,P1
ANL A,#0F0H
XRL A,#0F0H
JZ START
MOV P1,#0FEH //第0行置0
CLR P1.0
MOV A,P1
ANL A,#0F0H //与逻辑,高位保留
CJNE A,#0E0H,K1 //高四位为1110,数字0亮
MOV KEYSBUF,#0
LJMP DISPLAY
K1: CJNE A,#0D0H,K2 // 高四位为1101,数字1亮MOV KEYSBUF,#1
LJMP DISPLAY
K2: CJNE A,#0B0H,K3// 高四位为1011,数字2亮MOV KEYSBUF,#2
LJMP DISPLAY
K3: CJNE A,#070H,K4 //高四位为0111,数字3亮MOV KEYSBUF,#3
LJMP DISPLAY
K4: MOV P1,#0FDH //第1行置0
MOV A,P1
ANL A,#0F0H
CJNE A,#0E0H,K5 //高四位为1110,数字4亮
MOV KEYSBUF,#4
LJMP DISPLAY
K5: CJNE A,#0D0H,K6 // 高四位为1101,数字5亮MOV KEYSBUF,#5
LJMP DISPLAY
K6: CJNE A,#0B0H,K7// 高四位为1011,数字6亮MOV KEYSBUF,#6
LJMP DISPLAY
K7: CJNE A,#070H,K8 //高四位为0111,数字7亮MOV KEYSBUF,#7
LJMP DISPLAY
K8: MOV P1,#0FBH //第2行置0
MOV A,P1
ANL A,#0F0H
CJNE A,#0E0H,K9 //高四位为1110,数字8亮
MOV KEYSBUF,#8
LJMP DISPLAY
K9: CJNE A,#0D0H,K10 // 高四位为1101,数字9亮MOV KEYSBUF,#9
LJMP DISPLAY
K10: CJNE A,#0B0H,K11// 高四位为1011,数字A亮MOV KEYSBUF,#10
LJMP DISPLAY
K11: CJNE A,#070H,K12 //高四位为0111,数字B亮MOV KEYSBUF,#11
LJMP DISPLAY
K12: MOV P1,#0F7H //第3行置0
MOV A,P1
ANL A,#0F0H
CJNE A,#0E0H,K13 //高四位为1110,数字C亮
MOV KEYSBUF,#12
LJMP DISPLAY
K13: CJNE A,#0D0H,K14 // 高四位为1101,数字D亮MOV KEYSBUF,#13
LJMP DISPLAY
K14: CJNE A,#0B0H,K15// 高四位为1011,数字E亮MOV KEYSBUF,#14
LJMP DISPLAY
K15:
MOV KEYSBUF,#15 //高四位为0111,数字F亮
LJMP DISPLAY
DISPlAY:
MOV DPTR,#TAB
MOV A,KEYSBUF
MOVC A,@A+DPTR
MOV P0,A
CC: MOV A,P1
ANL A,#0F0H
XRL A,#0F0H
JNZ CC
LJMP START
DELAY:MOV R6,#10
D1:MOV R7,#248
D2:DJNZ R7,D2
DJNZ R6,D1
RET
TAB:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H
END。