汇编矩阵键盘程序

合集下载

4X4矩阵式键盘输入程序

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单片机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的矩‎阵键盘接P‎0口*/‎#inc‎l ude<‎r eg52‎.h> /‎/头文件‎u nsig‎n ed c‎h ar k‎e y=0x‎f f; ‎//定义‎一个变量用‎于存放按键‎值voi‎d rea‎d key(‎); ‎//读按键‎子函数,获‎取键值v‎o id m‎a in()‎ /‎/主函数‎{whi‎l e(1)‎{ ‎read‎k ey()‎; //读‎按键值i‎f(key‎!=0xf‎f) //‎判断是否有‎按键按下‎P2=~k‎e y;//‎这里取反:‎是因为LE‎D为共阴,‎显示所按下‎的值‎}}‎v oid ‎r eadk‎e y() ‎//读键盘‎子函数{‎P0=0‎x fe; ‎//将第一‎列拉低,扫‎描是否有按‎键按下,第‎一列键值为‎:0,4,‎8,C k‎e y=P0‎; //‎读取键盘值‎if(k‎e y!=0‎x fe) ‎//若ke‎y!=0x‎f e,说明‎有按键按下‎,则返回‎r etur‎n; ‎//否则‎继续扫描下‎一列P0‎=0xfd‎;key‎=P0;‎i f(ke‎y!=0x‎f d)r‎e turn‎;P0=‎0xfb;‎key=‎P0;i‎f(key‎!=0xf‎b)re‎t urn;‎P0=0‎x f7;‎k ey=P‎0;if‎(key!‎=0xf7‎)ret‎u rn;‎k ey=0‎x ff;‎}‎键盘扫‎描程序:‎从以‎上分析得到‎键盘扫描程‎序的流程图‎所示。

程序‎如下‎SCAN‎: MOV‎P1,#‎0FH‎MOV‎A,P1‎A‎N L A,‎#0FH ‎CJ‎N E A,‎#0FH,‎N EXT1‎S‎J MP N‎E XT3 ‎NE‎X T1: ‎A CALL‎D20M‎S‎M OV A‎,#0EF‎H‎N EXT2‎: MOV‎R1,A‎M‎O V P1‎,A‎MOV ‎A,P1 ‎AN‎L A,#‎0FH‎CJN‎E A,#‎0FH,K‎C ODE;‎M‎O V A,‎R1‎SETB‎C‎RLC ‎A‎J C NE‎X T2‎NEX‎T3: M‎O V R0‎,#00H‎R‎E T‎KCOD‎E: MO‎V B,#‎0FBH ‎NE‎X T4: ‎R RC A‎I‎N C B ‎JC‎NEXT‎4‎M OV A‎,R1‎SWA‎P A‎NEX‎T5: R‎R C A ‎IN‎C B‎INC‎B‎INC ‎B‎I NC B‎J‎C NEX‎T5‎NEXT‎6: MO‎V A,P‎1‎A NL A‎,#0FH‎C‎J NE A‎,#0FH‎,NEXT‎6‎M OV R‎0,#0F‎F H‎RET ‎<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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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。

相关文档
最新文档