(51单片机)矩阵键盘计算出键值之后如何查表\显示

51单片机
P3口接4×4矩阵键盘,P1口接数码管(并接LED灯)。我现在已经计算出键值,但是不知道怎么把它显示出来,或者方便查表。
(以下是已经编好能计算出键值的程序)
;A005_1.ASM
;矩阵键盘练习
KEYCARD BIT 00H ;标志位
KEYS EQU 5AH ;键值缓存
ORG 0000H
AJMP START
ORG 30H
START:
MOV P1,#00H
MOV P2,#0FH
CLR KEYCARD
LOOP:
ACALL KEY_CHECK
JNB KEYCARD,LOOP
ACALL KEY_MARK
AJMP LOOP
KEY_CHECK: ;键盘扫描
MOV P3,#0FH
MOV A,P3
ANL A,#0FH
CJNE A,#0FH,KEY_C1
CLR KEYCARD
RET
KEY_C1:
ACALL DELAY
SETB KEYCARD
RET
KEY_MARK:
MOV A,#0EFH
KEY_M1: ;键值扫描
MOV P3,A
MOV KEYS,A
MOV A,P3
ANL A,#0FH
CJNE A,#0FH,KEY_M2
MOV A,KEYS
SETB C
RLC A
JC KEY_M1
CLR KEYCARD
RET
KEY_M2: ;键值计算
MOV R0,#KEYS
XCH A,@R0
XCHD A,@R0
MOV P1,A
KEY_MX: ;等待按键释放
MOV A,P3
ANL A,#0FH
CJNE A,#0FH,KEY_MX
CLR KEYCARD
RET
DELAY:
MOV R7,#20 ;延时大约2ms
D1:MOV R6,#50
DJNZ R6,$
DJNZ R7,D1
RET
END
还有什么硬件?就一个单片机,P3口接键盘,P1口接4位数码管并接8个LED灯,别的没啦.学习用的嘛

我想问一下,你的硬件连接是怎么连接的...
还有就是你现在算出的值是什么关系..
其实,书上有这方面的例程序的..
还有就是,建议不要装在P3口上,那样第二功能就不好用了....

我想问的是,键盘的行和例是怎么连接的...
下面我改了一下程序,行是,P3.0-P3.3,例是,P3.4-P3.7,最后得到的键值存在,KEYS中数为,0-15,
有什么问题可以再问...
START:
MOV P1,#00H
MOV P2,#0FH
CLR KEYCARD
LOOP:
ACALL KEY_CHECK
JNB KEYCARD,LOOP ;为0从重新扫描
ACALL KEY_MARK ;为1有按键,调用KEY_MARK
AJMP LOOP
KEY_CHECK: ;键盘扫描
MOV P3,#0FH
MOV A,P3
ANL A,#0FH
CJNE A,#0FH,KEY_C1
CLR KEYCARD
RET
KEY_C1:
ACALL DELAY ;有键接下,消抖
SETB KEYCARD
RET
KEY_MARK:
MOV A,#0EFH ;第一例,行扫描,
KEY_M1: ;键值扫描
MOV P3,A
MOV KEYS,A
MOV A,P3
ANL A,#0FH ;取与
CJNE A,#0FH,KEY_M2 ;在第一例则跳,KEY_M2
MOV A,KEYS ;并非在第一例刚移位
SETB C
RLC A
JC KEY_M1 ;C=1,重新扫描..
CLR KEYCARD ;扫完一圈后,完成..
RET
KEY_M2: ;键值计算
MOV R0,#KEYS ;将KEYS的地址装入R0
XCH A,@R0 ;交换KEYS,A
XCHD A,@R0 ;交换低4位..
MOV KEYS,A
MOV R0,#0
LCALL KEY_ZHI
KEY_MX: ;等待按键释放
MOV A,P3
ANL A,#0FH
CJNE A,#0FH,KEY_MX
CLR KEYCARD
RET
KEY_ZHI:
MOV A,R0
INC R0
MOV DPTR,#KEY_VALUE
MOVC A,@A+DPTR
CJNE A,KEYS,KEY_ZHI ;查找键值.
DEC R0
MOV KEYS,R0
MOV P1,KEYS ;KEYS中的数为:0-15
RET
DELAY:
MOV R7,#20 ;延时大约2ms
D1: MOV R6,#50
DJNZ R6,$
DJNZ R7,D1
RET
KEY_VALUE: DB 0EEH,0DEH,0BEH,07EH,0EDH,0DDH,0BDH,07DH,0EBH,0DBH,0BBH,07BH,07EH,07DH,077H
END
温馨提示:内容为网友见解,仅供参考
第1个回答  2007-10-14
什么啊?看不懂唉~~~~

单片机的矩阵键盘检测,扫描程序已经写出来了,怎么显示呢
MOV A,R1 ;R1中是要显示的十进制 MOV DPTR,#TABEL ;使DPTR 指向TABEL(TABEL 中 是10进制对应的16进制表格)MOVC A,@A+DPTR;查表 MOV P2,A ;此时A中即是 16进制 ;---LED的 共阴码表--- TABEL:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;0123456789 DB 77H,7CH...

51单片机 矩阵键盘 检测的命令
temp的值会受到按键的影响,例如变成:7e或别的值等。

51单片机如何把矩阵键盘控制数码管和独立键盘控制蜂鸣器共同实现_百度...
对于矩阵键盘常用的扫描方法为线反转查询法。具体的思路是:首先使行作为输入,使用单片机内部电阻上拉为高电平,列输出低电平,读行的状态。如果行有一个IO口是低,说明有键按下,进行下一步,否则退出扫描。如果有键按下,置列为输入,行输出低电平,读列的状态。最后根据 行列的状态查表就可以知道...

51单片机矩阵键盘程序:想把按键的值一一存到数组里,最后按下某个按键...
给一个键盘扫描程序参考:void delay(unsigned int a){unsigned int i,j;for(i=0;i<a;i++)for(j=0;j<120;j++);}uchar kbscan(void){unsigned char sccode,recode;P1=0x0f; \/\/发0扫描,列线输入if ((P2 & 0x0f) != 0x0f) \/\/有键按下{delay(20); \/\/延时去抖动if (...

51单片机矩阵键盘扫描程序,怎样判断当前按键式第几行的?
p3=fe就是扫描第一行,然后&上f0就是屏蔽低位高位不等于f0则有建按下,后面你那个12345678……就是第几个建,如你的例子,=ed的时候是发生在p3=fd的程序,fd是第二行手机打字欢迎追问

单片机矩阵键盘按键行列逐级扫描法
=0xf0) { \/\/表示有按键按下 KeyPort=0xfe; \/\/检测第一行if(KeyPort!=0xfe) { Val=KeyPort&0xf0; Val+=0x0e; \/\/相当于检测到第一行有键按下,键值=列(高四位)+行(低四位) while(KeyPort!=0xfe); DelayMs(10); \/\/去抖 while(KeyPort!=0xfe); return Val; ...

用89C51单片机设计4*4矩阵式键盘计算器程序 要汇编的
;查表求键值程序DK: MOV B,#00H MOV A,KEYBUF ;查表程序 查对应的键号数据 MOV DPTR,#TABLE ;把表头地址放入DPTR MOVC A,@A+DPTR ;A里面存放的为键号,利用A和表头地址找到对应的键号数据 MOV B,A ;把查到的数据送往显示单元 INC R1 ;取下一个显示单元 MOV A,R1 CJNE A,#36H,DKA1 ;判断...

51单片机做矩阵键盘,定义四个键,其中一个确认键,要求按下确认键时才显 ...
之前按下的按键数值保存在变量里面,当检测到按下确认键的时候再把之前的按键数值取出来显示。

51单片机矩阵键盘检测方面的问题
第一个问题,应该是考虑如果先开锁存器,在那一时刻,P0的值还是上一次给P0赋的值,下在一条语句才将这次的值给P0,这样会造成数码管的余辉,静态显示的时候,因为太快看不到,动态显示时,就会比较明显了。第二个问题他的程序应该检测的是高四位,是否被拉低,因为temp和0xf0与,低四位不管是...

帮忙看看这个51单片机的计数器程序哪里出问题了吧,用矩阵键盘控制的
1、数码管显示部分的问题,没有消 0 ,C 语言中变量初值都是 0 ,所以一开始就会显示 0 如果你不想让显示 0 ,那就要写消 0 的程序,就加两句话,很简单的 2、键盘处理部分的问题,如果确认你的键盘检测是对的,那么就是键值处理部分的问题了 3、51都是加法计数器,如果你要想进行减法计数的...

相似回答